diff --git a/web/src/components/ActionBar/index.ts b/web/src/components/ActionBar/index.ts index 3d2a0fc683..01f908387d 100644 --- a/web/src/components/ActionBar/index.ts +++ b/web/src/components/ActionBar/index.ts @@ -16,4 +16,5 @@ */ export { default } from './ActionBar'; export { default as ActionBarEnUS } from './locales/en-US'; +export { default as ActionBarPtBR } from './locales/pt-BR'; export { default as ActionBarZhCN } from './locales/zh-CN'; diff --git a/web/src/components/ActionBar/locales/pt-BR.ts b/web/src/components/ActionBar/locales/pt-BR.ts new file mode 100644 index 0000000000..428c08c541 --- /dev/null +++ b/web/src/components/ActionBar/locales/pt-BR.ts @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'component.actionbar.button.preStep': 'Anterior', + 'component.actionbar.button.nextStep': 'Próximo', +}; diff --git a/web/src/components/Plugin/locales/pt-BR.ts b/web/src/components/Plugin/locales/pt-BR.ts new file mode 100644 index 0000000000..1e97826193 --- /dev/null +++ b/web/src/components/Plugin/locales/pt-BR.ts @@ -0,0 +1,174 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'component.plugin.tip1': + 'NOTA: Depois de personalizar o plug-in, você precisa atualizar o schema.json.', + 'component.plugin.tip2': 'Como atualizar?', + 'component.select.pluginTemplate': 'Selecione um modelo de plug-in', + 'component.step.select.pluginTemplate.select.option': 'Personalizado', + 'component.plugin.pluginTemplate.tip1': + '1. Quando uma rota já possui um campo de plugins configurado, os plugins no modelo de plugin serão mesclados a ele.', + 'component.plugin.pluginTemplate.tip2': + '2. O mesmo plug-in no modelo de plug-in substituirá um dos plug-ins.', + 'component.plugin.enable': 'Habilitar', + 'component.plugin.disable': 'Editar', + 'component.plugin.authentication': 'Autenticação', + 'component.plugin.security': 'Segurança', + 'component.plugin.traffic': 'Controle de tráfego', + 'component.plugin.serverless': 'Serverless', + 'component.plugin.observability': 'Observabilidade', + 'component.plugin.other': 'Outro', + 'component.plugin.all': 'Todos', + // cors + 'component.pluginForm.cors.allow_origins.tooltip': + 'Quais origens têm permissão para ativar o CORS, formate como: esquema://host:porta, por exemplo: https://somehost.com:8081. Origem múltipla use , para dividir. Quando allow_credential for false, você pode usar * para indicar permitir qualquer origem. você também pode permitir todas as origens forçadamente usando ** mesmo já habilitando allow_credential, mas isso trará alguns riscos de segurança.', + 'component.pluginForm.cors.allow_origins.extra': 'Por exemplo: https://somehost.com:8081', + 'component.pluginForm.cors.allow_methods.tooltip': + 'Qual método é permitido para habilitar o CORS, como: GET, POST etc. Uso de vários métodos, para dividir. Quando allow_credential for false, você pode usar * para indicar permitir todos os métodos. Você também pode permitir qualquer método forçadamente usando ** mesmo já habilitando allow_credential, mas trará alguns riscos de segurança.', + 'component.pluginForm.cors.allow_headers.tooltip': + 'Quais cabeçalhos podem ser definidos na solicitação ao acessar o recurso de origem cruzada. Valor múltiplo use , para dividir. Quando allow_credential for false, você pode usar * para indicar permitir todos os cabeçalhos de solicitação. Você também pode permitir qualquer cabeçalho de forma forçada usando ** mesmo já habilitando allow_credential, mas trará alguns riscos de segurança.', + 'component.pluginForm.cors.expose_headers.tooltip': + 'Quais cabeçalhos podem ser definidos em resposta ao acessar o recurso de origem cruzada. Valor múltiplo use , para dividir. Quando allow_credential for false, você pode usar * para indicar permitir qualquer cabeçalho. Você também pode permitir qualquer cabeçalho de forma forçada usando ** mesmo já habilitando allow_credential, mas trará alguns riscos de segurança.', + 'component.pluginForm.cors.max_age.tooltip': + 'Número máximo de segundos em que os resultados podem ser armazenados em cache. Dentro desse intervalo de tempo, o navegador reutilizará o resultado da última verificação. -1 significa sem cache. Observe que o valor máximo depende do navegador, consulte o MDN para obter detalhes.', + 'component.pluginForm.cors.allow_credential.tooltip': + "Se você definir esta opção como true, não poderá usar '*' para outras opções.", + 'component.pluginForm.cors.allow_origins_by_metadata.tooltip': + 'Corresponda qual origem tem permissão para ativar o CORS fazendo referência a allow_origins definido nos metadados do plug-in.', + 'component.pluginForm.cors.allow_origins_by_regex.tooltip': + 'Use expressões regex para corresponder a qual origem tem permissão para habilitar o CORS. Cada caixa de entrada só pode ser configurada com uma única expressão regular independente, como ".*.test.com", que pode corresponder a qualquer subdomínio de test.com.', + + // referer-restriction + 'component.pluginForm.referer-restriction.whitelist.tooltip': + 'Lista de nomes de host para a lista de permissões. O nome do host pode ser iniciado com * como curinga.', + 'component.pluginForm.referer-restriction.blacklist.tooltip': + 'Lista de nomes de host para a lista negra. O nome do host pode ser iniciado com * como curinga.', + 'component.pluginForm.referer-restriction.listEmpty.tooltip': 'Lista vazia', + 'component.pluginForm.referer-restriction.bypass_missing.tooltip': + 'Se deve ignorar a verificação quando o cabeçalho Referer estiver ausente ou malformado.', + 'component.pluginForm.referer-restriction.message.tooltip': + 'Mensagem retornada caso o acesso não seja permitido.', + + // api-breaker + 'component.pluginForm.api-breaker.break_response_code.tooltip': + 'Retorne o código de erro quando não estiver saudável.', + 'component.pluginForm.api-breaker.break_response_body.tooltip': + 'Corpo de retorno da mensagem de resposta quando o upstream não está íntegro.', + 'component.pluginForm.api-breaker.break_response_headers.tooltip': + 'Retornar cabeçalhos quando não estiverem íntegros.', + 'component.pluginForm.api-breaker.max_breaker_sec.tooltip': 'Tempo máximo do breaker (segundos).', + 'component.pluginForm.api-breaker.unhealthy.http_statuses.tooltip': + 'Códigos de status quando não saudáveis.', + 'component.pluginForm.api-breaker.unhealthy.failures.tooltip': + 'Número de solicitações de erro consecutivas que acionaram um estado não íntegro.', + 'component.pluginForm.api-breaker.healthy.http_statuses.tooltip': + 'Códigos de status quando saudáveis.', + 'component.pluginForm.api-breaker.healthy.successes.tooltip': + 'Número de solicitações normais consecutivas que acionam o status de integridade.', + + // proxy-mirror + 'component.pluginForm.proxy-mirror.host.tooltip': + 'Especifique um endereço de serviço espelho, por exemplo http://127.0.0.1:9797 (o endereço precisa conter o esquema: http ou https, não a parte URI)', + 'component.pluginForm.proxy-mirror.host.extra': 'por exemplo http://127.0.0.1:9797', + 'component.pluginForm.proxy-mirror.host.ruletip': + 'endereço precisa conter esquema: http ou https, não parte URI', + 'component.pluginForm.proxy-mirror.path.tooltip': + 'Especifique a parte do caminho da solicitação de espelhamento. Sem ele, o caminho atual será usado.', + 'component.pluginForm.proxy-mirror.path.ruletip': + 'Por favor, insira o caminho correto, por exemplo /path', + 'component.pluginForm.proxy-mirror.sample_ratio.tooltip': + 'A proporção de amostra que as solicitações serão espelhadas.', + + // limit-conn + 'component.pluginForm.limit-conn.conn.tooltip': + 'o número máximo de solicitações simultâneas permitidas. As solicitações que excedem essa proporção (e abaixo de conn + burst) serão atrasadas (os segundos de latência são configurados por default_conn_delay) para atender a esse limite.', + 'component.pluginForm.limit-conn.burst.tooltip': + 'o número excessivo de solicitações (ou conexões) simultâneas que podem ser atrasadas.', + 'component.pluginForm.limit-conn.default_conn_delay.tooltip': + 'os segundos de latência da solicitação quando solicitações simultâneas excedem conn, mas abaixo (conn + burst).', + 'component.pluginForm.limit-conn.key_type.tooltip': + 'O tipo de chave, suporte: "var" (var único) e "var_combination" (combinar var)', + 'component.pluginForm.limit-conn.key.tooltip': + 'para limitar o nível de simultaneidade. Por exemplo, pode-se usar o nome do host (ou zona do servidor) como a chave para limitar a simultaneidade por nome do host. Caso contrário, também podemos usar o endereço do cliente como a chave para evitar que um único cliente inunde nosso serviço com muitas conexões ou solicitações paralelas.', + 'component.pluginForm.limit-conn.rejected_code.tooltip': + 'retornado quando a solicitação exceder conn + burst será rejeitado.', + 'component.pluginForm.limit-conn.rejected_msg.tooltip': + 'o corpo da resposta retornado quando a solicitação exceder conn + burst será rejeitado.', + 'component.pluginForm.limit-conn.only_use_default_delay.tooltip': + 'habilite o modo estrito dos segundos de latência. Se você definir esta opção como verdadeira, ela será executada estritamente de acordo com os segundos de latência definidos sem lógica de cálculo adicional.', + 'component.pluginForm.limit-conn.allow_degradation.tooltip': + 'Se deve habilitar a degradação do plug-in quando a função limit-conn estiver temporariamente indisponível. Permita que as solicitações continuem quando o valor for definido como verdadeiro, o padrão é falso.', + + // limit-req + 'component.pluginForm.limit-req.rate.tooltip': + 'O limite da taxa de solicitação especificada (número por segundo). As solicitações que excederem essa taxa (e abaixo do estouro) serão atrasadas para se adequar à taxa.', + 'component.pluginForm.limit-req.burst.tooltip': + 'O número de solicitações excessivas por segundo que podem ser atrasadas. Solicitações que excedam esse limite rígido serão rejeitadas imediatamente.', + 'component.pluginForm.limit-req.key_type.tooltip': + 'O tipo de chave, suporte: "var" (var único) e "var_combination" (combinar var)', + 'component.pluginForm.limit-req.key.tooltip': + 'A chave especificada pelo usuário para limitar a taxa.', + 'component.pluginForm.limit-req.rejected_code.tooltip': + 'O código de status HTTP retornado quando a solicitação excede o limite é rejeitado.', + 'component.pluginForm.limit-req.rejected_msg.tooltip': + 'O corpo da resposta retornado quando a solicitação excede o limite é rejeitado.', + 'component.pluginForm.limit-req.nodelay.tooltip': + 'Se o sinalizador nodelay for verdadeiro, as solicitações em rajada não serão atrasadas', + + 'component.plugin.form': 'Forma', + 'component.plugin.format-codes.disable': 'Formatar dados JSON ou YAML', + 'component.plugin.editor': 'Editor de plug-ins', + 'component.plugin.noConfigurationRequired': 'Não precisa de configuração', + + // limit-count + 'component.pluginForm.limit-count.count.tooltip': + 'O número especificado de limite de solicitações.', + 'component.pluginForm.limit-count.time_window.tooltip': + 'A janela de tempo em segundos antes da contagem de solicitações ser redefinida.', + 'component.pluginForm.limit-count.key_type.tooltip': + 'O tipo de chave, suporte: "var" (var único) e "var_combination" (combinar var)', + 'component.pluginForm.limit-count.key.tooltip': + 'A chave especificada pelo usuário para limitar a contagem.', + 'component.pluginForm.limit-count.rejected_code.tooltip': + 'O código de status HTTP retornado quando a solicitação excede o limite é rejeitado, padrão 503.', + 'component.pluginForm.limit-count.rejected_msg.tooltip': + 'O corpo da resposta retornado quando a solicitação excede o limite é rejeitado.', + 'component.pluginForm.limit-count.policy.tooltip': + 'As políticas de limitação de taxa a serem usadas para recuperar e incrementar os limites. Os valores disponíveis são locais (os contadores serão armazenados localmente na memória do nó) e redis (os contadores são armazenados em um servidor Redis e serão compartilhados entre os nós, geralmente use-o para fazer o limite de velocidade global) e redis-cluster (a mesma função do redis, use apenas o padrão de cluster Redis).', + 'component.pluginForm.limit-count.allow_degradation.tooltip': + 'Se deve habilitar a degradação do plug-in quando a função de contagem de limite estiver temporariamente indisponível (por exemplo, tempo limite do redis). Permitir que as solicitações continuem quando o valor for definido como verdadeiro', + 'component.pluginForm.limit-count.show_limit_quota_header.tooltip': + 'Se mostra X-RateLimit-Limit e X-RateLimit-Remaining (que significa o número total de solicitações e o número restante de solicitações que podem ser enviadas) no cabeçalho de resposta', + 'component.pluginForm.limit-count.group.tooltip': + 'A rota configurada com o mesmo grupo compartilhará o mesmo contador', + 'component.pluginForm.limit-count.redis_host.tooltip': + 'Ao usar a política redis, essa propriedade especifica o endereço do servidor Redis.', + 'component.pluginForm.limit-count.redis_port.tooltip': + 'Ao usar a política redis, essa propriedade especifica a porta do servidor Redis.', + 'component.pluginForm.limit-count.redis_password.tooltip': + 'Ao usar a política redis, essa propriedade especifica a senha do servidor Redis.', + 'component.pluginForm.limit-count.redis_database.tooltip': + 'Ao usar a política redis, esta propriedade especifica o banco de dados selecionado do servidor Redis e apenas para o modo de cluster não Redis (modo de instância única ou serviço de nuvem pública Redis que fornece entrada única).', + 'component.pluginForm.limit-count.redis_timeout.tooltip': + 'Ao usar a política redis, essa propriedade especifica o tempo limite em milissegundos de qualquer comando enviado ao servidor Redis.', + 'component.pluginForm.limit-count.redis_cluster_nodes.tooltip': + 'Ao usar a política redis-cluster, essa propriedade é uma lista de endereços de nós de serviço de cluster Redis (pelo menos dois nós).', + 'component.pluginForm.limit-count.redis_cluster_name.tooltip': + 'Ao usar a política redis-cluster, essa propriedade é o nome dos nós de serviço do cluster Redis.', + 'component.pluginForm.limit-count.atLeast2Characters.rule': + 'Por favor insira pelo menos 2 caracteres', +}; diff --git a/web/src/components/PluginFlow/locales/pt-BR.ts b/web/src/components/PluginFlow/locales/pt-BR.ts new file mode 100644 index 0000000000..03f5482649 --- /dev/null +++ b/web/src/components/PluginFlow/locales/pt-BR.ts @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'component.plugin-flow.text.condition.required': 'Configurar regra', + 'component.plugin-flow.text.condition': 'Regra', + 'component.plugin-flow.text.condition2': 'Condições', + 'component.plugin-flow.text.condition.placeholder': 'Por favor insira a regra', + 'component.plugin-flow.text.without-data': 'Nó encontrado sem configuração', + 'component.plugin-flow.text.plugin-without-data.description': 'Por favor, configure o plug-in: ', + 'component.plugin-flow.text.no-start-node': 'Conecte o nó inicial', + 'component.plugin-flow.text.no-root-node': 'Nó raiz não encontrado', + 'component.plugin-flow.text.start-node': 'Começar', + 'component.plugin-flow.text.general': 'Geral', + 'component.plugin-flow.text.nodes-area': 'Nós disponíveis', + 'component.plugin-flow.text.nodes.not-found': 'Não encontrado', + 'component.plugin-flow.text.search-nodes.placeholder': 'Pesquisar plug-in por nome', + 'component.plugin-flow.text.condition-rule.tooltip': + 'A condição de julgamento do nó. por exemplo: código == 503', + 'component.plugin-flow.text.line': 'Linha', + 'component.plugin-flow.text.grid': 'Grade', + 'component.plugin-flow.text.background': 'Background', + 'component.plugin-flow.text.node': 'Nó', + 'component.plugin-flow.text.text': 'Texto', + 'component.plugin-flow.text.condition-without-configuration': + 'Verifique os dados de todos os nós de condição', + 'component.plugin-flow.text.preview.readonly': + 'NOTA: suas ações na gaveta a seguir não serão preservadas.', + 'component.plugin-flow.text.both-modes-exist': + 'A configuração do modo de orquestração substituirá a configuração do modo normal. Tem certeza de que deseja continuar?', + 'component.plugin-flow.text.both-modes-exist.title': 'Atenção', +}; diff --git a/web/src/components/RawDataEditor/locales/pt-BR.ts b/web/src/components/RawDataEditor/locales/pt-BR.ts new file mode 100644 index 0000000000..ff8b4c5632 --- /dev/null +++ b/web/src/components/RawDataEditor/locales/pt-BR.ts @@ -0,0 +1 @@ +export default {}; diff --git a/web/src/components/Upstream/locales/pt-BR.ts b/web/src/components/Upstream/locales/pt-BR.ts new file mode 100644 index 0000000000..3e1d8955d6 --- /dev/null +++ b/web/src/components/Upstream/locales/pt-BR.ts @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'component.upstream.fields.tls.client_key': 'Chave do cliente', + 'component.upstream.fields.tls.client_key.required': 'Insira a chave do cliente', + 'component.upstream.fields.tls.client_cert': 'Certificado de cliente', + 'component.upstream.fields.tls.client_cert.required': 'Insira o certificado do cliente', + + 'component.upstream.fields.upstream_type': 'Tipo upstream', + 'component.upstream.fields.upstream_type.node': 'Nó', + 'component.upstream.fields.upstream_type.service_discovery': 'Descoberta de serviço', + + 'component.upstream.fields.discovery_type': 'Tipo de Descoberta', + 'component.upstream.fields.discovery_type.tooltip': 'Tipo de Descoberta', + 'component.upstream.fields.discovery_type.placeholder': 'Selecione o tipo de descoberta', + 'component.upstream.fields.discovery_type.type.dns': 'DNS', + 'component.upstream.fields.discovery_type.type.consul': 'Consul', + 'component.upstream.fields.discovery_type.type.consul_kv': 'Consul KV', + 'component.upstream.fields.discovery_type.type.nacos': 'Nacos', + 'component.upstream.fields.discovery_type.type.eureka': 'Eureka', + 'component.upstream.fields.discovery_type.type.kubernetes': 'Kubernetes', + + 'component.upstream.fields.discovery_args.group_name': 'Nome do grupo', + 'component.upstream.fields.discovery_args.group_name.tooltip': 'Nome do grupo', + 'component.upstream.fields.discovery_args.group_name.placeholder': + 'Por favor insira o nome do grupo', + 'component.upstream.fields.discovery_args.namespace_id': 'ID do espaço de nomes', + 'component.upstream.fields.discovery_args.namespace_id.tooltip': 'ID do espaço de nomes', + 'component.upstream.fields.discovery_args.namespace_id.placeholder': 'Insira o id do namespace', + + 'component.upstream.fields.service_name': 'Nome do Serviço', + 'component.upstream.fields.service_name.tooltip': 'Nome do Serviço', + 'component.upstream.fields.service_name.placeholder': 'Insira o nome do serviço', + + 'component.upstream.fields.scheme.tooltip.stream': + 'Este tipo é usado apenas para Stream Route, que é um proxy de camada 4. Referência: https://apisix.apache.org/docs/apisix/stream-proxy/', + 'component.upstream.fields.scheme.tooltip.pubsub': + 'Este tipo é usado apenas na assinatura de publicação. Referência: https://apisix.apache.org/docs/apisix/pubsub/', + + 'component.upstream.fields.tls': 'TLS', + 'component.upstream.fields.tls.tooltip': 'Certificado TLS', + + 'component.upstream.fields.hash_on': 'Hash on', + 'component.upstream.fields.hash_on.tooltip': 'O que usar como entrada de hash', + + 'component.upstream.fields.key': 'Chave', + 'component.upstream.fields.key.tooltip': 'Chave como entrada de hash', + + 'component.upstream.fields.retries': 'Novas tentativas', + 'component.upstream.fields.retries.tooltip': + 'O mecanismo de repetição envia a solicitação para o próximo nó upstream. Um valor de 0 desativa o mecanismo de repetição e deixa a tabela vazia para usar o número de nós de back-end disponíveis.', + + 'component.upstream.fields.retry_timeout': 'Repetir tempo limite', + 'component.upstream.fields.retry_timeout.tooltip': + 'Configure um número para limitar a quantidade de segundos em que as novas tentativas podem ser continuadas e não continue as novas tentativas se a solicitação anterior e as solicitações de nova tentativa tiverem demorado muito. 0 significa desativar o mecanismo de tempo limite de repetição.', + + 'component.upstream.fields.keepalive_pool': 'Keepalive Pool', + 'component.upstream.fields.keepalive_pool.tooltip': + 'Definir pool de keepalive independente para Upstream', + 'component.upstream.fields.keepalive_pool.size': 'Tamanho', + 'component.upstream.fields.keepalive_pool.size.placeholder': 'Por favor, insira o tamanho', + 'component.upstream.fields.keepalive_pool.idle_timeout': 'Tempo limite ocioso', + 'component.upstream.fields.keepalive_pool.idle_timeout.placeholder': + 'Insira o tempo limite de inatividade', + 'component.upstream.fields.keepalive_pool.requests': 'Solicitações', + 'component.upstream.fields.keepalive_pool.requests.placeholder': 'Por favor insira os pedidos', + + 'component.upstream.fields.checks.active.type': 'Tipo', + 'component.upstream.fields.checks.active.type.tooltip': + 'Se deve executar verificações de integridade ativas usando HTTP ou HTTPS ou apenas tentar uma conexão TCP.', + + 'component.upstream.fields.checks.active.concurrency': 'Simultaneidade', + 'component.upstream.fields.checks.active.concurrency.tooltip': + 'Número de destinos a serem verificados simultaneamente em verificações de integridade ativas.', + + 'component.upstream.fields.checks.active.host': 'Host', + 'component.upstream.fields.checks.active.host.required': 'Por favor, insira o nome do host', + 'component.upstream.fields.checks.active.host.tooltip': + 'O nome do host da solicitação HTTP usada para executar a verificação de integridade ativa', + 'component.upstream.fields.checks.active.host.scope': 'Apenas letras, números e . são suportados', + + 'component.upstream.fields.checks.active.port': 'Porta', + + 'component.upstream.fields.checks.active.http_path': 'Caminho HTTP', + 'component.upstream.fields.checks.active.http_path.tooltip': + 'O caminho que deve ser usado ao emitir a solicitação HTTP GET para o destino. O valor padrão é /.', + 'component.upstream.fields.checks.active.http_path.placeholder': + 'Insira o caminho da solicitação HTTP', + + 'component.upstream.fields.checks.active.https_verify_certificate': + 'Verifique o certificado HTTP', + 'component.upstream.fields.checks.active.https_verify_certificate.tooltip': + 'Se deve verificar a validade do certificado SSL do host remoto ao executar verificações de integridade ativas usando HTTPS.', + + 'component.upstream.fields.checks.active.req_headers': 'Cabeçalhos de solicitação', + 'component.upstream.fields.checks.active.req_headers.tooltip': + 'Cabeçalhos de solicitação adicionais, exemplo: User-Agent: curl/7.29.0', + + 'component.upstream.fields.checks.active.healthy.interval': 'Intervalo', + 'component.upstream.fields.checks.active.healthy.interval.tooltip': + 'Intervalo entre as verificações de alvos saudáveis (em segundos)', + + 'component.upstream.fields.checks.active.healthy.successes': 'Sucessos', + 'component.upstream.fields.checks.active.healthy.successes.tooltip': + 'Número de sucessos para considerar um alvo saudável', + 'component.upstream.fields.checks.active.healthy.successes.required': + 'Por favor, insira o número de sucessos', + + 'component.upstream.fields.checks.active.healthy.http_statuses': 'Status HTTP', + 'component.upstream.fields.checks.active.healthy.http_statuses.tooltip': + 'Uma matriz de status HTTP para considerar um sucesso, indicando integridade, quando retornado por uma investigação em verificações de integridade ativas.', + + 'component.upstream.fields.checks.active.unhealthy.timeouts': 'Tempo limite', + 'component.upstream.fields.checks.active.unhealthy.timeouts.tooltip': + 'Número de tempos limite em investigações ativas para considerar um destino não íntegro.', + + 'component.upstream.fields.checks.active.unhealthy.http_failures': 'Falhas de HTTP', + 'component.upstream.fields.checks.active.unhealthy.http_failures.tooltip': + 'Número de falhas de HTTP para considerar um destino não íntegro', + 'component.upstream.fields.checks.active.unhealthy.http_failures.required': + 'Insira as falhas de HTTP', + + 'component.upstream.fields.checks.active.unhealthy.tcp_failures': 'Falhas de TCP', + 'component.upstream.fields.checks.active.unhealthy.tcp_failures.tooltip': + 'Número de falhas de TCP para considerar um destino não íntegro', + 'component.upstream.fields.checks.active.unhealthy.tcp_failures.required': + 'Insira as falhas de TCP', + + 'component.upstream.fields.checks.active.unhealthy.interval': 'Intervalo', + 'component.upstream.fields.checks.active.unhealthy.interval.tooltip': + 'Intervalo entre verificações de integridade ativas para destinos não íntegros (em segundos). Um valor de zero indica que as sondagens ativas para alvos íntegros não devem ser executadas.', + 'component.upstream.fields.checks.active.unhealthy.required': 'Insira o intervalo não saudável', + + 'component.upstream.fields.checks.passive.healthy.successes': 'Sucessos', + 'component.upstream.fields.checks.passive.healthy.successes.tooltip': + 'Número de sucessos para considerar um alvo saudável', + 'component.upstream.fields.checks.passive.healthy.successes.required': + 'Por favor, insira o número de sucessos', + + 'component.upstream.fields.checks.passive.unhealthy.timeouts': 'Tempo limite', + 'component.upstream.fields.checks.passive.unhealthy.timeouts.tooltip': + 'Número de tempos limite no tráfego com proxy para considerar um destino não íntegro, conforme observado por verificações de integridade passivas.', + + 'component.upstream.other.none': 'Nenhum (disponível apenas ao vincular o serviço)', + 'component.upstream.other.pass_host-with-multiple-nodes.title': + 'Verifique a configuração do nó de destino', + 'component.upstream.other.pass_host-with-multiple-nodes': + 'Ao usar um nome de host ou IP na lista de nós de destino, verifique se há apenas um nó de destino', + 'component.upstream.other.health-check.passive-only': + 'Quando a verificação de integridade passiva está habilitada, a verificação de integridade ativa precisa ser habilitada ao mesmo tempo.', + 'component.upstream.other.health-check.invalid': + 'Verifique a configuração da verificação de integridade', +}; diff --git a/web/src/locales/pt-BR.ts b/web/src/locales/pt-BR.ts new file mode 100644 index 0000000000..aafa5789e5 --- /dev/null +++ b/web/src/locales/pt-BR.ts @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ActionBarPtBR } from '@/components/ActionBar'; + +import Plugin from '../components/Plugin/locales/pt-BR'; +import PluginFlow from '../components/PluginFlow/locales/pt-BR'; +import RawDataEditor from '../components/RawDataEditor/locales/pt-BR'; +import UpstreamComponent from '../components/Upstream/locales/pt-BR'; +import component from './pt-BR/component'; +import globalHeader from './pt-BR/globalHeader'; +import menu from './pt-BR/menu'; +import other from './pt-BR/other'; +import pwa from './pt-BR/pwa'; +import settings from './pt-BR/setting'; +import settingDrawer from './pt-BR/settingDrawer'; + +export default { + 'navBar.lang': 'Línguas', + 'layout.user.link.help': 'Ajuda', + 'layout.user.link.privacy': 'Privacidade', + 'layout.user.link.terms': 'Termos', + 'app.preview.down.block': 'Baixe esta página para o seu projeto local', + ...globalHeader, + ...menu, + ...settingDrawer, + ...settings, + ...pwa, + ...component, + ...other, + ...ActionBarPtBR, + ...Plugin, + ...PluginFlow, + ...RawDataEditor, + ...UpstreamComponent, +}; diff --git a/web/src/locales/pt-BR/component.ts b/web/src/locales/pt-BR/component.ts new file mode 100644 index 0000000000..4bb143c4e0 --- /dev/null +++ b/web/src/locales/pt-BR/component.ts @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'component.tagSelect.expand': 'Expandir', + 'component.tagSelect.collapse': 'Recolher', + 'component.tagSelect.all': 'Todos', + 'component.global.search': 'Pesquisar', + 'component.global.reset': 'Limpar', + 'component.global.confirm': 'Confirmar', + 'component.global.format': 'Formato', + 'component.global.document': 'Documento', + 'component.global.enable': 'Habilitar', + 'component.global.disable': 'Desativar', + 'component.global.scope': 'Escopo', + 'component.global.example': 'Exemplo', + 'component.global.data.editor': 'Editor de dados brutos', + 'component.global.delete': 'Excluir', + 'component.global.cancel': 'Cancelar', + 'component.global.submit': 'Enviar', + 'component.global.create': 'Criar', + 'component.global.add': 'Adicionar', + 'component.global.save': 'Salvar', + 'component.global.edit': 'Configurar', + 'component.global.view': 'Visualizar', + 'component.global.duplicate': 'Duplicar', + 'component.global.manage': 'Gerenciar', + 'component.global.update': 'Atualizar', + 'component.global.get': 'Pegar', + 'component.global.edit.plugin': 'Configurar plug-in', + 'component.global.loading': 'Carregando', + 'component.global.list': 'Lista', + 'component.global.description': 'Descrição', + 'component.global.description.required': 'Por favor insira a descrição', + 'component.global.labels': 'Etiquetas', + 'component.global.version': 'Versão', + 'component.global.operation': 'Operação', + 'component.status.success': 'Sucesso', + 'component.status.fail': 'Falhou', + 'component.global.popconfirm.title.delete': 'Tem certeza que deseja excluir este registro?', + 'component.global.notification.success.message.deleteSuccess': 'Apagado com sucesso', + 'component.global.create.consumer.success': 'Consumidor criado com sucesso', + 'component.global.delete.consumer.success': 'Sonsumidor removido com sucesso', + 'component.global.delete.routes.success': 'Rota removida com sucesso', + 'component.global.edit.consumer.success': 'Consumidor editado com sucesso', + + 'component.global.steps.stepTitle.basicInformation': 'Informação básica', + 'component.global.steps.stepTitle.preview': 'Visualização', + 'component.global.steps.stepTitle.pluginConfig': 'Configuração do plug-in', + + 'component.global.pleaseEnter': 'Por favor, insira', + 'component.global.pleaseChoose': 'Por favor escolha', + 'component.global.pleaseCheck': 'Por favor, verifique', + + 'component.global.input.ruleMessage.name': + 'Apenas letras, números - e _ são suportados e só podem começar com letras', + + 'component.global.connectionTimeout': 'Tempo limite de conexão', + 'component.global.sendTimeout': 'Tempo limite de envio', + 'component.global.receiveTimeout': 'Tempo Limite de Recebimento', + 'component.global.name': 'Nome', + 'component.global.id': 'ID', + 'component.global.updateTime': 'Tempo de atualização', + 'component.global.form.itemExtraMessage.nameGloballyUnique': + 'O nome deve ser globalmente exclusivo', + 'component.global.input.placeholder.description': + 'Por favor, insira a descrição para esta rota, máx. 256 caracteres', + // User component + 'component.user.loginByPassword': 'Username & Password', + 'component.user.login': 'Login', + + 'component.document': 'Documento', + 'component.label-manager': 'Gerenciador de etiquetas', + + 'component.global.noConfigurationRequired': 'Nenhuma configuração necessária', + 'component.global.copy': 'Copiar', + 'component.global.copySuccess': 'Copiado com sucesso ', + 'component.global.copyFail': 'Falha na cópia', + + 'component.global.invalidYaml': 'Dados Yaml inválidos', + 'component.global.invalidJson': 'Dados Json inválidos', +}; diff --git a/web/src/locales/pt-BR/globalHeader.ts b/web/src/locales/pt-BR/globalHeader.ts new file mode 100644 index 0000000000..48944fa9fd --- /dev/null +++ b/web/src/locales/pt-BR/globalHeader.ts @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'component.globalHeader.search': 'Pesquisar', + 'component.globalHeader.search.example1': 'Exemplo de pesquisa 1', + 'component.globalHeader.search.example2': 'Exemplo de pesquisa 2', + 'component.globalHeader.search.example3': 'Exemplo de pesquisa 3', + 'component.globalHeader.help': 'Ajuda', + 'component.globalHeader.notification': 'Notificação', + 'component.globalHeader.notification.empty': 'Você visualizou todas as notificações.', + 'component.globalHeader.message': 'Mensagem', + 'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.', + 'component.globalHeader.event': 'Evento', + 'component.globalHeader.event.empty': 'Você visualizou todos os eventos.', + 'component.noticeIcon.clear': 'Limpar', + 'component.noticeIcon.cleared': 'Limpo', + 'component.noticeIcon.empty': 'Nenhuma notificação', + 'component.noticeIcon.view-more': 'Ver mais', +}; diff --git a/web/src/locales/pt-BR/menu.ts b/web/src/locales/pt-BR/menu.ts new file mode 100644 index 0000000000..dc9d38cabb --- /dev/null +++ b/web/src/locales/pt-BR/menu.ts @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'menu.more-blocks': 'Mais blocos', + 'menu.home': 'Home', + 'menu.admin': 'Admin', + 'menu.admin.sub-page': 'Sub-Page', + 'menu.login': 'Login', + 'menu.register': 'Registro', + 'menu.register.result': 'Registrar resultado', + 'menu.dashboard': 'Dashboard', + 'menu.dashboard.analysis': 'Análise', + 'menu.dashboard.monitor': 'Monitor', + 'menu.dashboard.workplace': 'Workplace', + 'menu.exception.403': '403', + 'menu.exception.404': '404', + 'menu.exception.500': '500', + 'menu.form': 'Form', + 'menu.form.basic-form': 'Basic Form', + 'menu.form.step-form': 'Step Form', + 'menu.form.step-form.info': 'Step Form(gravar informações de transferência)', + 'menu.form.step-form.confirm': 'Step Form(confirmar informações de transferência)', + 'menu.form.step-form.result': 'Step Form(finalizado)', + 'menu.form.advanced-form': 'Formulário Avançado', + 'menu.list': 'Lista', + 'menu.list.table-list': 'Tabela de pesquisa', + 'menu.list.basic-list': 'Lista Básicat', + 'menu.list.card-list': 'Lista de Cartões', + 'menu.list.search-list': 'lista de pesquisa', + 'menu.list.search-list.articles': 'lista de pesquisa(artigos)', + 'menu.list.search-list.projects': 'lista de pesquisa(projetos)', + 'menu.list.search-list.applications': 'lista de pesquisa(aplicações)', + 'menu.profile': 'Perfil', + 'menu.profile.basic': 'Perfil Básico', + 'menu.profile.advanced': 'Perfil Avançado', + 'menu.result': 'Resultado', + 'menu.result.success': 'Sucesso', + 'menu.result.fail': 'Falhou', + 'menu.exception': 'Exceção', + 'menu.exception.not-permission': '403', + 'menu.exception.not-find': '404', + 'menu.exception.server-error': '500', + 'menu.exception.trigger': 'Acionar', + 'menu.account': 'Conta', + 'menu.account.center': 'Central de Contas', + 'menu.account.trigger': 'Erro de gatilho', + 'menu.account.logout': 'Logout', + 'menu.editor': 'Editor gráfico', + 'menu.editor.flow': 'Editor de Fluxo', + 'menu.editor.mind': 'Editor de mente', + 'menu.editor.koni': 'Editor Koni', + 'menu.routes': 'Rota', + 'menu.pluginTemplate': 'Template de plug-in', + 'menu.ssl': 'SSL', + 'menu.upstream': 'Upstream', + 'menu.consumer': 'Consumidor', + 'menu.plugin': 'Plug-in', + 'menu.service': 'Serviço', + 'menu.proto': 'Buffers de protocolo', + 'menu.setting': 'Configurações', + 'menu.serverinfo': 'Informação do sistema', + 'menu.advanced-feature': 'Avançado', + 'menu.more': 'Mais', + 'menu.close': 'Fechar', +}; diff --git a/web/src/locales/pt-BR/other.ts b/web/src/locales/pt-BR/other.ts new file mode 100644 index 0000000000..7cb72082bb --- /dev/null +++ b/web/src/locales/pt-BR/other.ts @@ -0,0 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'other.global': 'Global', +}; diff --git a/web/src/locales/pt-BR/pwa.ts b/web/src/locales/pt-BR/pwa.ts new file mode 100644 index 0000000000..e28b374fd4 --- /dev/null +++ b/web/src/locales/pt-BR/pwa.ts @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'app.pwa.offline': 'Você está off-line agora', + 'app.pwa.serviceworker.updated': 'Novo conteúdo está disponível', + 'app.pwa.serviceworker.updated.hint': + 'Por favor, pressione o botão "Atualizar" para recarregar a página atual', + 'app.pwa.serviceworker.updated.ok': 'Atualizar', +}; diff --git a/web/src/locales/pt-BR/setting.ts b/web/src/locales/pt-BR/setting.ts new file mode 100644 index 0000000000..86e904509b --- /dev/null +++ b/web/src/locales/pt-BR/setting.ts @@ -0,0 +1,17 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default {}; diff --git a/web/src/locales/pt-BR/settingDrawer.ts b/web/src/locales/pt-BR/settingDrawer.ts new file mode 100644 index 0000000000..c23deb16b7 --- /dev/null +++ b/web/src/locales/pt-BR/settingDrawer.ts @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'app.setting.pagestyle': 'Configuração de estilo de página', + 'app.setting.pagestyle.dark': 'Dark style', + 'app.setting.pagestyle.light': 'Light style', + 'app.setting.content-width': 'Largura do conteúdo', + 'app.setting.content-width.fixed': 'Fixo', + 'app.setting.content-width.fluid': 'Fluido', + 'app.setting.themecolor': 'Cor do tema', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', + 'app.setting.themecolor.geekblue': 'Geek Glue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Modo de Navegação', + 'app.setting.sidemenu': 'Layout do Menu Lateral', + 'app.setting.topmenu': 'Esquema do Menu Superior', + 'app.setting.fixedheader': 'Cabeçalho Fixo', + 'app.setting.fixedsidebar': 'Barra lateral fixa', + 'app.setting.fixedsidebar.hint': 'Funcionamento do layout do menu lateral', + 'app.setting.hideheader': 'Ocultar cabeçalho ao rolar', + 'app.setting.hideheader.hint': 'Funciona quando o cabeçalho oculto está ativado', + 'app.setting.othersettings': 'Outros ajustes', + 'app.setting.weakmode': 'Weak Mode', + 'app.setting.copy': 'Copy Setting', + 'app.setting.copyinfo': 'copiado com sucesso, substitua defaultSettings em src/models/setting.js', + 'app.setting.production.hint': + 'O painel de configuração é exibido apenas no ambiente de desenvolvimento, modifique manualmente', +}; diff --git a/web/src/pages/Consumer/locales/pt-BR.ts b/web/src/pages/Consumer/locales/pt-BR.ts new file mode 100644 index 0000000000..0d9d4c989e --- /dev/null +++ b/web/src/pages/Consumer/locales/pt-BR.ts @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.consumer.form.itemRuleMessage.username': + 'O comprimento máximo é 100, apenas letras, números e _ são suportados.', + 'page.consumer.form.itemExtraMessage.username': 'O nome deve ser único', + 'page.consumer.username': 'Nome', + 'page.consumer.username.required': 'Insira o nome do consumidor', + 'page.consumer.updateTime': 'Tempo de atualização', + 'page.consumer.list': 'Lista de consumidores', + 'page.consumer.description': + 'Os consumidores são os consumidores de rotas, por exemplo, desenvolvedores, usuários finais, chamadas de API, etc.', + 'page.consumer.create': 'Criar consumidor', + 'page.consumer.configure': 'Configurar consumidor', +}; diff --git a/web/src/pages/Dashboard/locales/pt-BR.ts b/web/src/pages/Dashboard/locales/pt-BR.ts new file mode 100644 index 0000000000..1a09d35884 --- /dev/null +++ b/web/src/pages/Dashboard/locales/pt-BR.ts @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.dashboard.empty.description.grafanaNotConfig': 'Você não configurou o Grafana', + 'page.dashboard.button.grafanaConfig': 'Configurar', + 'page.dashboard.tip': + 'Use o localStorage do navegador para armazenar o URL da página do monitor, apenas local.', +}; diff --git a/web/src/pages/Plugin/locales/pt-BR.ts b/web/src/pages/Plugin/locales/pt-BR.ts new file mode 100644 index 0000000000..c0ba26ec6d --- /dev/null +++ b/web/src/pages/Plugin/locales/pt-BR.ts @@ -0,0 +1,24 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.plugin.drawer.popconfirm.title.delete': 'Tem certeza que deseja excluir este item?', + 'page.plugin.list': 'Lista de plug-ins', + 'page.plugin.list.enabled': 'Lista de plugins ativados', + 'page.plugin.market.config': 'Lista Global de Plugins', + 'page.plugin.edit': 'Plug-in configurado com sucesso', + 'page.plugin.delete': 'Plug-in removido com sucesso', +}; diff --git a/web/src/pages/Proto/locales/pt-BR.ts b/web/src/pages/Proto/locales/pt-BR.ts new file mode 100644 index 0000000000..e428ba5459 --- /dev/null +++ b/web/src/pages/Proto/locales/pt-BR.ts @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.proto.list': 'Lista de Protocolos', + 'page.proto.list.description': + 'Os buffers de protocolo são o mecanismo extensível de linguagem neutra e plataforma neutra do Google para serializar dados estruturados. uma variedade de fluxos de dados e usando uma variedade de idiomas. A lista de buffers de protocolo contém os arquivos proto criados. Quando o plug-in grpc transcode está ativado, o ID pode ser configurado para ler o conteúdo dos arquivos proto correspondentes.', + 'page.proto.list.edit': 'Configurar', + 'page.proto.list.confirm.delete': 'Você tem certeza que quer deletar ?', + 'page.proto.list.confirm': 'Confirme', + 'page.proto.list.cancel': 'Cancelar', + 'page.proto.list.delete.successfully': 'Protocolo removido com sucesso', + 'page.proto.list.delete': 'Excluir', + 'page.proto.id.tooltip': 'ID do arquivo .proto', + + 'page.proto.desc': 'descrição', + 'page.proto.desc.tooltip': 'descrição do arquivo .proto', + + 'page.proto.content': 'conteúdo', + 'page.proto.content.tooltip': 'conteúdo do arquivo .proto', + + 'page.proto.drawer.create': 'Criar protocolo', + 'page.proto.drawer.edit': 'Configurar protocolo', + 'page.proto.drawer.create.successfully': 'Protocolo criado com sucesso', + 'page.proto.drawer.edit.successfully': 'Protocolo configurado com sucesso', + 'page.proto.drawer.delete.successfully': 'Protocolo removido com sucesso', +}; diff --git a/web/src/pages/Route/locales/pt-BR.ts b/web/src/pages/Route/locales/pt-BR.ts new file mode 100644 index 0000000000..b7c78a476d --- /dev/null +++ b/web/src/pages/Route/locales/pt-BR.ts @@ -0,0 +1,231 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.route.button.returnList': 'Ir para lista', + 'page.route.button.send': 'Enviar', + 'page.route.onlineDebug': 'Depuração on-line', + 'page.route.pluginTemplateConfig': 'Configuração do modelo de plug-in', + + 'page.route.parameterPosition': 'Posição do Parâmetro', + 'page.route.httpRequestHeader': 'Cabeçalho da solicitação HTTP', + 'page.route.requestParameter': 'Parâmetro de Solicitação', + 'page.route.postRequestParameter': 'Parâmetro de solicitação POST', + 'page.route.builtinParameter': 'Parâmetro embutido', + 'page.route.parameterName': 'Nome do parâmetro', + 'page.route.operationalCharacter': 'Personagem Operacional', + 'page.route.equal': 'Igual(==)', + 'page.route.unequal': 'Diferente(~=)', + 'page.route.greaterThan': 'Maior que (>)', + 'page.route.lessThan': 'Menos de (<)', + 'page.route.regexMatch': 'Correspondência Regex (~~)', + 'page.route.caseInsensitiveRegexMatch': + 'Correspondência regular que não diferencia maiúsculas de minúsculas (~*)', + 'page.route.in': 'EM', + 'page.route.has': 'TEM', + 'page.route.reverse': 'Inverta o resultado (!)', + 'page.route.rule': 'Regra', + 'page.route.httpHeaderName': 'Nome do cabeçalho da solicitação HTTP', + 'page.route.service': 'Serviço', + 'page.route.instructions': 'Instruções', + 'page.route.import': 'Importar', + 'page.route.createRoute': 'Criar rota', + 'page.route.editRoute': 'Configurar Rota', + 'page.route.batchDeletion': 'Excluir rotas em lote', + 'page.route.unSelect': 'Desmarcar', + 'page.route.item': 'itens', + 'page.route.chosen': 'escolhido', + + 'page.route.input.placeholder.parameterNameHttpHeader': + 'Nome do cabeçalho da solicitação, por exemplo: HOST', + 'page.route.input.placeholder.parameterNameRequestParameter': + 'Nome do parâmetro, por exemplo: id', + 'page.route.input.placeholder.requestUrl': 'insira o URL de solicitação válido', + 'page.route.input.placeholder.paramKey': 'Chave de parâmetro', + 'page.route.input.placeholder.paramValue': 'Valor do parâmetro', + 'page.route.input.placeholder.paramType': 'Tipo de parâmetro', + + 'page.route.form.itemRulesRequiredMessage.parameterName': + 'Apenas letras e números são suportados e só podem começar com letras', + 'page.route.value': 'Valor do parâmetro', + 'page.route.panelSection.title.advancedMatchRule': + 'Condições Avançadas de Correspondência de Roteamento', + + 'page.route.panelSection.title.nameDescription': 'Nome e descrição', + 'page.route.form.itemRulesPatternMessage.apiNameRule': + 'O comprimento máximo deve ser de apenas 100', + + 'page.route.panelSection.title.requestConfigBasicDefine': 'Solicitar Definição Básica', + 'page.route.form.itemLabel.httpMethod': 'Métodos HTTP', + 'page.route.form.itemLabel.scheme': 'Esquema', + 'page.route.form.itemLabel.priority': 'Prioridade', + 'page.route.form.itemLabel.redirect': 'Redirecionar', + 'page.route.select.option.enableHttps': 'Ativar HTTPS', + 'page.route.select.option.configCustom': 'Personalizado', + 'page.route.select.option.forbidden': 'Proibido', + 'page.route.form.itemLabel.redirectCustom': 'Redirecionamentos personalizados', + 'page.route.input.placeholder.redirectCustom': 'Por exemplo: /foo/index.html', + 'page.route.select.option.redirect301': '301(Permanent Redirect)', + 'page.route.select.option.redirect302': '302(Temporary Redirect)', + 'page.route.form.itemLabel.username': 'Nome de usuário', + 'page.route.form.itemLabel.password': 'Senha', + 'page.route.form.itemLabel.token': 'Token', + 'page.route.form.itemLabel.apikey': 'Apikey', + + 'page.route.form.itemExtraMessage.domain': + 'Nome de domínio ou IP, suporte para nome de domínio genérico, por exemplo: *.test.com', + 'page.route.form.itemRulesPatternMessage.domain': + 'Apenas letras, números, -,_ e * são suportados, mas * precisa estar no início.', + 'page.route.form.itemExtraMessage1.path': + 'Caminho de solicitação HTTP, por exemplo: /foo/index.html, suporta o prefixo de caminho de solicitação /foo/* ; /* representa todos os caminhos', + 'page.route.form.itemRulesPatternMessage.remoteAddrs': + 'Insira um endereço IP válido, por exemplo: 192.168.1.101, 192.168.1.0/24, ::1, fe80::1, fe80::1/64', + 'page.route.form.itemExtraMessage1.remoteAddrs': + 'IP do cliente, por exemplo: 192.168.1.101, 192.168.1.0/24, ::1, fe80::1, fe80::1/64', + + 'page.route.httpAction': 'Ação', + 'page.route.httpOverrideOrCreate': 'Substituir/Criar', + 'page.route.panelSection.title.httpOverrideRequestHeader': + 'Substituir cabeçalho de solicitação HTTP', + 'page.route.status': 'Status', + 'page.route.groupName': 'Nome do grupo', + 'page.route.offline': 'Offline', + 'page.route.publish': 'Publicar', + 'page.route.published': 'Publicado', + 'page.route.unpublished': 'Não publicado', + + 'page.route.select.option.inputManually': 'Inserir manualmente', + 'page.route.select.option.methodRewriteNone': 'Não modificar', + 'page.route.form.itemLabel.domainNameOrIp': 'Nome de domínio/IP', + 'page.route.form.itemExtraMessage.domainNameOrIp': + 'Ao usar Domain Name, ele irá analisar o local: /etc/resolv.conf por padrão', + 'page.route.portNumber': 'Número da porta', + 'page.route.weight': 'Peso', + 'page.route.radio.staySame': 'Continue o mesmo', + 'page.route.form.itemLabel.newPath': 'novo caminho', + 'page.route.form.itemLabel.newHost': 'Novo host', + 'page.route.form.itemLabel.regex': 'Regexp', + 'page.route.form.itemLabel.template': 'Template', + 'page.route.form.itemLabel.URIRewriteType': 'Substituição de URI', + 'page.route.form.itemLabel.hostRewriteType': 'Substituição do host', + 'page.route.form.itemLabel.methodRewrite': 'Substituição de método', + 'page.route.form.itemLabel.redirectURI': 'URIs de redirecionamento', + 'page.route.input.placeholder.newPath': 'Por exemplo: /foo/bar/index.html', + + 'page.route.steps.stepTitle.defineApiRequest': 'Definir solicitação de API', + 'page.route.steps.stepTitle.defineApiBackendServe': 'Definir servidor de back-end da API', + + 'page.route.popconfirm.title.offline': 'Tem certeza de que esta rota está off-line?', + 'page.route.radio.static': 'Estático', + 'page.route.radio.regex': 'Regex', + 'page.route.form.itemLabel.from': 'De', + 'page.route.form.itemHelp.status': + 'Se uma rota pode ser usada depois de criada, o valor padrão é false.', + + 'page.route.host': 'Host', + 'page.route.path': 'Path', + 'page.route.remoteAddrs': 'Endereços remotos', + 'page.route.PanelSection.title.defineRequestParams': 'Definir parâmetros de solicitação', + 'page.route.PanelSection.title.responseResult': 'Resultado da resposta', + 'page.route.debug.showResultAfterSendRequest': 'Mostrar resultado após enviar solicitação', + 'page.route.TabPane.queryParams': 'Parâmetros de consulta', + 'page.route.TabPane.bodyParams': 'Parâmetros do corpo', + 'page.route.TabPane.headerParams': 'Parâmetros do Cabeçalho', + 'page.route.TabPane.authentication': 'Autenticação', + 'page.route.TabPane.response': 'Resposta', + 'page.route.TabPane.header': 'Cabeçalho de resposta', + 'page.route.debugWithoutAuth': 'Esta solicitação não usa nenhuma autorização.', + 'page.route.button.exportOpenApi': 'Exportar OpenAPI', + 'page.route.exportRoutesTips': 'Escolha o tipo de arquivo que deseja exportar', + 'page.route.button.importOpenApi': 'Importar OpenAPI', + 'page.route.button.selectFile': 'Selecione o arquivo', + 'page.route.list': 'Rotas', + 'page.route.panelSection.title.requestOverride': 'Substituição de Solicitação', + 'page.route.form.itemLabel.headerRewrite': 'Substituição de Cabeçalho', + 'page.route.tooltip.pluginOrchOnlySupportChrome': + 'A orquestração de plug-in é compatível apenas com o Chrome.', + 'page.route.tooltip.pluginOrchWithoutProxyRewrite': + 'O modo de orquestração de plug-in não pode ser usado quando a substituição de solicitação é configurada na Etapa 1.', + 'page.route.tooltip.pluginOrchWithoutRedirect': + 'O modo de orquestração de plug-in não pode ser usado quando Redirecionar na Etapa 1 é selecionado para habilitar HTTPS.', + + 'page.route.tabs.normalMode': 'Normal', + 'page.route.tabs.orchestration': 'Orquestração', + + 'page.route.list.description': + 'A rota é o ponto de entrada de uma solicitação, que define as regras de correspondência entre uma solicitação do cliente e um serviço. Uma rota pode ser associada a um serviço (Service), um upstream (Upstream), um serviço pode corresponder a um conjunto de rotas e uma rota pode corresponder a um objeto upstream (um conjunto de nós de serviço de back-end), portanto, cada solicitação correspondente para uma rota será feito proxy pelo gateway para o serviço upstream vinculado à rota.', + + 'page.route.configuration.name.rules.required.description': 'Por favor, insira o nome da rota', + 'page.route.configuration.name.placeholder': 'Por favor, insira o nome da rota', + 'page.route.configuration.desc.tooltip': 'Por favor, insira a descrição da rota', + 'page.route.configuration.publish.tooltip': + 'Usado para controlar se uma rota é publicada no gateway imediatamente após sua criação', + 'page.route.configuration.version.placeholder': 'Insira o número da versão de roteamento', + 'page.route.configuration.version.tooltip': 'Número da versão da rota, por exemplo, V1', + 'page.route.configuration.normal-labels.tooltip': + 'Adicione rótulos personalizados a rotas que podem ser usadas para agrupamento de rotas.', + + 'page.route.configuration.path.rules.required.description': + 'Insira um caminho de solicitação HTTP válido', + 'page.route.configuration.path.placeholder': 'Insira o caminho da solicitação HTTP', + 'page.route.configuration.remote_addrs.placeholder': 'Insira o endereço do cliente', + 'page.route.configuration.host.placeholder': 'Insira o nome do host da solicitação HTTP', + + 'page.route.service.none': 'Nenhum', + + 'page.route.rule.create': 'Criar regra', + 'page.route.rule.edit': 'Configurar regras', + + 'page.route.advanced-match.operator.sample.IN': 'Insira uma matriz, por exemplo ["1", "2"]', + 'page.route.advanced-match.operator.sample.~~': + 'Insira uma expressão regular, por exemplo [a-z]+', + 'page.route.fields.service_id.invalid': 'Verifique a configuração do serviço de ligação', + 'page.route.fields.service_id.without-upstream': + 'Se você não vincular o serviço, deverá definir o Upstream (Etapa 2)', + 'page.route.advanced-match.tooltip': + 'Ele oferece suporte à correspondência de rota por meio de cabeçalhos de solicitação, parâmetros de solicitação e cookies e pode ser aplicado a cenários como publicação em escala de cinza e teste azul-verde.', + 'page.route.advanced-match.message': 'Pontas', + 'page.route.advanced-match.tips.requestParameter': + 'Parâmetro de solicitação: Consulta da URL da solicitação', + 'page.route.advanced-match.tips.postRequestParameter': + 'Parâmetro de solicitação POST: suporta apenas o formulário x-www-form-urlencoded', + 'page.route.advanced-match.tips.builtinParameter': + 'Parâmetros integrados: parâmetros internos do Nginx', + + 'page.route.fields.custom.redirectOption.tooltip': + 'Isso está relacionado ao plug-in de redirecionamento', + 'page.route.fields.service_id.tooltip': + 'Vincular objetos de serviço para reutilizar sua configuração.', + + 'page.route.fields.vars.invalid': + 'Verifique a configuração avançada da condição de correspondência', + 'page.route.fields.vars.in.invalid': + 'When using the IN operator, enter the parameter values in array format.', + + 'page.route.data_loader.import': 'Importar', + 'page.route.data_loader.import_panel': 'Importar dados', + 'page.route.data_loader.types.openapi3': 'OpenAPI 3', + 'page.route.data_loader.types.openapi_legacy': 'OpenAPI 3 Legada', + 'page.route.data_loader.labels.loader_type': 'Tipo de dados carregados', + 'page.route.data_loader.labels.task_name': 'Nome da tarefa', + 'page.route.data_loader.labels.upload': 'Upload', + 'page.route.data_loader.labels.openapi3_merge_method': 'Mesclar métodos HTTP', + 'page.route.data_loader.tips.select_type': 'Selecione o carregador de dados', + 'page.route.data_loader.tips.input_task_name': 'Insira o nome da tarefa de importação', + 'page.route.data_loader.tips.click_upload': 'Clique para Carregar', + 'page.route.data_loader.tips.openapi3_merge_method': + 'Se deve mesclar vários métodos HTTP no caminho OpenAPI em uma única rota. Quando você tem vários métodos HTTP em seu caminho com configurações de detalhes diferentes (por exemplo, securitySchema), pode desativar essa opção para gerá-los em várias rotas.', +}; diff --git a/web/src/pages/SSL/locales/pt-BR.ts b/web/src/pages/SSL/locales/pt-BR.ts new file mode 100644 index 0000000000..11cb9026bf --- /dev/null +++ b/web/src/pages/SSL/locales/pt-BR.ts @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.ssl.form.itemLabel.expireTime': 'Data de expiração', + 'page.ssl.form.itemLabel.cert': 'Conteúdo do certificado', + 'page.ssl.form.itemRuleMessage.certValueLength': + 'O conteúdo do certificado requer pelo menos 128 caracteres', + 'page.ssl.form.itemLabel.privateKey': 'Chave privada', + 'page.ssl.form.itemRuleMessage.privateKeyLength': + 'A Chave Privada requer pelo menos 128 caracteres', + + 'page.ssl.button.uploadCert': 'Carregar certificado', + + 'page.ssl.form.itemLabel.way': 'Caminho', + 'page.ssl.select.placeholder.selectCreateWays': 'Please select create caminhos', + 'page.ssl.selectOption.input': 'Entrada', + 'page.ssl.upload': 'Upload', + + 'page.ssl.notification.updateCertEnableStatusSuccessfully': + 'Update certificate enable status successfully', + 'page.ssl.list': 'Lista SSL', + 'page.ssl.list.expirationTime': 'Data de expiração', + 'page.ssl.list.ifEnable': 'Se Ativar', + 'page.ssl.list.periodOfValidity': 'Período de expiração', + 'page.ssl.steps.stepTitle.completeCertInfo': 'Informações completas do certificado', + 'component.ssl.removeSSLSuccess': 'SSL de destino removido com sucesso', + 'component.ssl.removeSSLItemModalContent': 'Você vai remover este item!', + + 'component.ssl.description': + 'O certificado é usado pelo gateway para processar solicitações criptografadas, que serão associadas ao SNI e vinculadas ao nome do host na rota.', + 'component.ssl.fields.cert.required': 'Por favor insira o certificado', + 'component.ssl.fields.key.required': 'Por favor insira a chave', +}; diff --git a/web/src/pages/ServerInfo/locales/pt-BR.ts b/web/src/pages/ServerInfo/locales/pt-BR.ts new file mode 100644 index 0000000000..9028ec0ec2 --- /dev/null +++ b/web/src/pages/ServerInfo/locales/pt-BR.ts @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.systemStatus.pageContainer.title': 'Informação do sistema', + 'page.systemStatus.select.placeholder': 'Por favor, selecione um nó Apache apisix', + 'page.systemStatus.desc': + 'O plug-in relevante precisa ser ativado para relatar as informações do servidor.', + 'page.systemStatus.link': 'Como habilitar?', + 'page.systemStatus.dashboardInfo': 'Dashboard', + 'page.systemStatus.nodeInfo': 'Nós APISIX', +}; diff --git a/web/src/pages/Service/locales/pt-BR.ts b/web/src/pages/Service/locales/pt-BR.ts new file mode 100644 index 0000000000..cbb6f8865c --- /dev/null +++ b/web/src/pages/Service/locales/pt-BR.ts @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.service.steps.stepTitle.basicInformation': 'Básico', + 'page.service.steps.stepTitle.pluginConfig': 'Plugin', + 'page.service.steps.stepTitle.preview': 'Visualização', + 'page.service.list': 'Lista de serviços', + 'page.service.description': + 'Um serviço consiste em uma combinação de configuração de plug-in público e informações de destino upstream em uma rota. Os serviços estão associados a rotas e upstreams, e um serviço pode corresponder a um conjunto de nós upstream e pode ser vinculado por várias rotas.', + 'page.service.fields.name.required': 'Insira o nome do serviço', + 'page.service.fields.hosts': 'Hosts', + 'page.service.fields.hosts.placeholder': 'Insira os hosts de serviço', + 'page.service.create': 'Criar serviço', + 'page.service.configure': 'Configurar Serviço', +}; diff --git a/web/src/pages/Setting/locales/pt-BR.ts b/web/src/pages/Setting/locales/pt-BR.ts new file mode 100644 index 0000000000..9c2b6f753d --- /dev/null +++ b/web/src/pages/Setting/locales/pt-BR.ts @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.setting.notification.update.configuration.successfully': + 'Configuração atualizada com sucesso', + 'page.setting.pageContainer.title': 'Configurações', + 'page.setting.form.item.grafanaURL': 'Endereço Grafana', + 'page.setting.form.item.grafanaURL.inputHelpMessage': + 'O endereço Grafana deve começar com HTTP ou HTTPS', + 'page.setting.form.item.grafanaURL.inputErrorMessage': 'O endereço é inválido', +}; diff --git a/web/src/pages/Upstream/locales/pt-BR.ts b/web/src/pages/Upstream/locales/pt-BR.ts new file mode 100644 index 0000000000..c5e824d11e --- /dev/null +++ b/web/src/pages/Upstream/locales/pt-BR.ts @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export default { + 'page.upstream.step.select.upstream': 'Upstream', + 'page.upstream.step.select.upstream.select.option': 'Personalizado', + 'page.upstream.step.select.upstream.select.option.serviceSelected': + 'Personalizado (a configuração atual substituirá o serviço vinculado)', + 'page.upstream.step.select.upstream.select.none': 'Nenhum', + 'page.upstream.step.backend.server.domain.or.ip': 'Host/IP do servidor de back-end', + 'page.upstream.form.item-label.node.domain.or.ip': 'Alvos', + 'page.upstream.step.input.domain.name.or.ip': 'Por favor, insira o domínio ou IP', + 'page.upstream.step.valid.domain.name.or.ip': 'Insira um domínio ou IP válido', + 'page.upstream.step.domain.name.or.ip': 'Nome do host ou IP', + 'page.upstream.step.host': 'Host', + 'page.upstream.step.input.port': 'Insira o número da porta', + 'page.upstream.step.port': 'Porta', + 'page.upstream.step.input.weight': 'Por favor, insira o peso', + 'page.upstream.step.weight': 'Peso', + 'page.upstream.step.create': 'Criar', + 'page.upstream.step.name': 'Nome', + 'page.upstream.step.name.should.unique': 'O nome deve ser único', + 'page.upstream.step.input.upstream.name': 'Insira o nome do upstream', + 'page.upstream.step.description': 'Descrição', + 'page.upstream.step.input.description': 'Insira a descrição do upstream', + 'page.upstream.step.type': 'Algoritmos', + 'page.upstream.step.pass-host': 'Hostname', + 'page.upstream.step.pass-host.pass': 'Mantenha o mesmo host da solicitação do cliente', + 'page.upstream.step.pass-host.node': 'Use o domínio ou IP da lista de nós', + 'page.upstream.step.pass-host.rewrite': 'Host personalizado (será obsoleto no futuro)', + 'page.upstream.step.pass-host.upstream_host': 'Host personalizado', + 'page.upstream.step.connect.timeout': 'Tempo limite de conexão', + 'page.upstream.step.connect.timeout.desc': + 'Tempo limite para estabelecer uma conexão da solicitação para o servidor upstream', + 'page.upstream.step.input.connect.timeout': 'Insira o tempo limite de conexão', + 'page.upstream.step.send.timeout': 'Tempo limite de envio', + 'page.upstream.step.send.timeout.desc': 'Tempo limite para enviar dados para servidores upstream', + 'page.upstream.step.input.send.timeout': 'Insira o tempo limite de envio', + 'page.upstream.step.read.timeout': 'Tempo de leitura esgotado', + 'page.upstream.step.read.timeout.desc': 'Tempo limite para receber dados de servidores upstream', + 'page.upstream.step.input.read.timeout': 'Insira o tempo limite de leitura', + 'page.upstream.step.healthyCheck.healthy.check': 'Exame de saúde', + 'page.upstream.step.healthyCheck.healthy': 'Saudável', + 'page.upstream.step.healthyCheck.unhealthy': 'Pouco saudável', + 'page.upstream.step.healthyCheck.healthy.status': 'Estado saudável', + 'page.upstream.step.healthyCheck.unhealthyStatus': 'Estado não saudável', + 'page.upstream.step.healthyCheck.active': 'Ativo', + 'page.upstream.step.healthyCheck.active.timeout': 'Tempo esgotado', + 'page.upstream.step.input.healthyCheck.active.timeout': 'Insira o tempo limite', + 'page.upstream.step.input.healthyCheck.activeInterval': 'Insira o intervalo', + 'page.upstream.step.input.healthyCheck.active.req_headers': 'Insira os cabeçalhos da solicitação', + 'page.upstream.step.healthyCheck.passive': 'Passivo', + 'page.upstream.step.healthyCheck.passive.http_statuses': 'Status HTTP', + 'page.upstream.step.input.healthyCheck.passive.http_statuses': 'Insira o status http', + 'page.upstream.step.healthyCheck.passive.tcp_failures': 'Falhas de TCP', + 'page.upstream.step.input.healthyCheck.passive.tcp_failures': 'Insira falhas de TCP', + 'page.upstream.step.keepalive_pool': 'Keepalive Pool', + 'page.upstream.notificationMessage.enableHealthCheckFirst': + 'Ative a verificação de integridade primeiro.', + 'page.upstream.upstream_host.required': 'Insira o host personalizado', + + 'page.upstream.create': 'Criar upstream', + 'page.upstream.configure': 'Configurar upstream', + 'page.upstream.create.upstream.successfully': 'Upstream criado com sucesso', + 'page.upstream.edit.upstream.successfully': 'Upstream configurado com sucesso', + 'page.upstream.create.basic.info': 'Informação básica', + 'page.upstream.create.preview': 'Visualização', + + 'page.upstream.list.id': 'ID', + 'page.upstream.list.name': 'Nome', + 'page.upstream.list.type': 'Tipo', + 'page.upstream.list.description': 'Descrição', + 'page.upstream.list.edit.time': 'Tempo de atualização', + 'page.upstream.list.operation': 'Operações', + 'page.upstream.list.edit': 'Configurar', + 'page.upstream.list.confirm.delete': 'Você tem certeza que quer deletar?', + 'page.upstream.list.confirm': 'Confirme', + 'page.upstream.list.cancel': 'Cancelar', + 'page.upstream.list.delete.successfully': 'Upstream removido com sucesso', + 'page.upstream.list.delete': 'Excluir', + 'page.upstream.list': 'Lista upstream', + 'page.upstream.list.input': 'Por favor, insira', + 'page.upstream.list.create': 'Criar', + + 'page.upstream.type.roundrobin': 'Round Robin', + 'page.upstream.type.chash': 'CHash', + 'page.upstream.type.ewma': 'EWMA', + 'page.upstream.type.least_conn': 'Least conn', + + 'page.upstream.list.content': + 'A lista upstream contém os serviços upstream criados (ou seja, serviços de back-end) e permite balanceamento de carga e verificação de integridade de vários nós de destino dos serviços upstream.', + + 'page.upstream.checks.active.timeout.description': + 'Tempo limite de soquete para verificações ativas (em segundos)', + 'page.upstream.checks.active.unhealthy.interval.description': + 'Intervalo entre as verificações de alvos não íntegros (em segundos)', + 'page.upstream.checks.passive.healthy.http_statuses.description': + 'Quais status HTTP considerar um sucesso', + 'page.upstream.checks.passive.unhealthy.http_statuses.description': + 'Quais status HTTP considerar uma falha', + 'page.upstream.checks.passive.unhealthy.http_failures.description': + 'Número de falhas de HTTP para considerar um destino não íntegro', + 'page.upstream.checks.passive.unhealthy.tcp_failures.description': + 'Número de falhas de TCP para considerar um destino não íntegro', + 'page.upstream.scheme': 'Esquema', + + 'page.upstream.other.configuration.invalid': 'Verifique a configuração Upstream', +}; diff --git a/web/src/pages/User/locales/pt-BR.ts b/web/src/pages/User/locales/pt-BR.ts new file mode 100644 index 0000000000..421899bf90 --- /dev/null +++ b/web/src/pages/User/locales/pt-BR.ts @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export default { + 'component.user.login': 'Login', + 'component.user.loginMethodPassword': 'Usuário & Senha', + 'component.user.loginMethodPassword.username': 'Usuário', + 'component.user.loginMethodPassword.password': 'Senha', + 'component.user.loginMethodPassword.inputUsername': 'Insira o nome de usuário', + 'component.user.loginMethodPassword.inputPassword': 'Insira a senha', + 'component.user.loginMethodPassword.incorrectPassword': 'Usuário ou senha incorretos', + 'component.user.loginMethodPassword.fieldInvalid': 'Verifique o nome de usuário e a senha', + 'component.user.loginMethodPassword.success': 'Login com sucesso', + 'component.user.loginMethodPassword.changeDefaultAccount': + 'Como atualizar o nome de usuário/senha?', + 'component.user.loginMethodPassword.modificationMethod': + 'Modifique o campo de usuários no arquivo /api/conf/conf.yaml', +};