diff --git a/po/pt-BR.po b/po/pt-BR.po index d6a6262c..9c2304b6 100644 --- a/po/pt-BR.po +++ b/po/pt-BR.po @@ -22,27 +22,27 @@ msgstr "Executando o Curso" #: src/SUMMARY.md:5 msgid "Course Structure" -msgstr "Estrutura do curso" +msgstr "Estrutura do Curso" #: src/SUMMARY.md:6 msgid "Keyboard Shortcuts" -msgstr "Atalhos do teclado" +msgstr "Atalhos do Teclado" #: src/SUMMARY.md:7 msgid "Using Cargo" -msgstr "Usando Cargo" +msgstr "Usando o Cargo" #: src/SUMMARY.md:8 msgid "Rust Ecosystem" -msgstr "Ecossistema de rust" +msgstr "O Ecossistema do Rust" #: src/SUMMARY.md:9 msgid "Code Samples" -msgstr "Amostras de código" +msgstr "Amostras de Código" #: src/SUMMARY.md:10 msgid "Running Cargo Locally" -msgstr "Executando Cargo Localmente" +msgstr "Executando o Cargo Localmente" #: src/SUMMARY.md:13 msgid "Day 1: Morning" @@ -62,7 +62,7 @@ msgstr "Olá Mundo!" #: src/SUMMARY.md:20 msgid "Small Example" -msgstr "Pequeno Exemplo" +msgstr "Um Pequeno Exemplo" #: src/SUMMARY.md:21 msgid "Why Rust?" @@ -70,15 +70,15 @@ msgstr "Por que Rust?" #: src/SUMMARY.md:22 msgid "Compile Time Guarantees" -msgstr "Garantias em tempo de compilação" +msgstr "Garantias em Tempo de Compilação" #: src/SUMMARY.md:23 msgid "Runtime Guarantees" -msgstr "Garantias de tempo de execução" +msgstr "Garantias em Tempo de Execução" #: src/SUMMARY.md:24 msgid "Modern Features" -msgstr "Recursos modernos" +msgstr "Recursos Modernos" #: src/SUMMARY.md:25 msgid "Basic Syntax" @@ -86,11 +86,11 @@ msgstr "Sintaxe Básica" #: src/SUMMARY.md:26 msgid "Scalar Types" -msgstr "Tipos escalares" +msgstr "Tipos Escalares" #: src/SUMMARY.md:27 msgid "Compound Types" -msgstr "Tipos de compostos" +msgstr "Tipos Compostos" #: src/SUMMARY.md:28 msgid "References" @@ -98,7 +98,7 @@ msgstr "Referências" #: src/SUMMARY.md:29 msgid "Dangling References" -msgstr "Referências pendentes" +msgstr "Referências Pendentes" #: src/SUMMARY.md:30 msgid "Slices" @@ -118,7 +118,7 @@ msgstr "Métodos" #: src/SUMMARY.md:34 msgid "Overloading" -msgstr "Sobrecargo" +msgstr "Sobrecarga" #: src/SUMMARY.md:35 src/SUMMARY.md:64 src/SUMMARY.md:88 src/SUMMARY.md:117 src/SUMMARY.md:146 src/SUMMARY.md:174 #: src/SUMMARY.md:197 src/SUMMARY.md:224 @@ -127,11 +127,11 @@ msgstr "Exercícios" #: src/SUMMARY.md:36 msgid "Implicit Conversions" -msgstr "Conversões implícitas" +msgstr "Conversões Implícitas" #: src/SUMMARY.md:37 msgid "Arrays and for Loops" -msgstr "Arrays e for Loops" +msgstr "Vetores e Laços For" #: src/SUMMARY.md:39 msgid "Day 1: Afternoon" @@ -143,7 +143,7 @@ msgstr "Variáveis" #: src/SUMMARY.md:42 msgid "Type Inference" -msgstr "Inferência de tipo" +msgstr "Inferência de Tipo" #: src/SUMMARY.md:43 msgid "static & const" @@ -151,15 +151,15 @@ msgstr "static & const" #: src/SUMMARY.md:44 msgid "Scopes and Shadowing" -msgstr "Escopos e Sombra" +msgstr "Escopos e Sobreposição" #: src/SUMMARY.md:45 msgid "Memory Management" -msgstr "Gerenciamento de memória" +msgstr "Gerenciamento de Memória" #: src/SUMMARY.md:46 msgid "Stack vs Heap" -msgstr "Pilha vs Heap" +msgstr "Stack vs Heap" #: src/SUMMARY.md:47 msgid "Stack Memory" @@ -171,15 +171,15 @@ msgstr "Gerenciamento Manual de Memória" #: src/SUMMARY.md:49 msgid "Scope-Based Memory Management" -msgstr "Gerenciamento de memória baseado em escopo" +msgstr "Gerenciamento de Memória Baseado em Escopo" #: src/SUMMARY.md:50 msgid "Garbage Collection" -msgstr "Garbage Collection (Coleta de lixo)" +msgstr "Garbage Collection (Coletor de lixo)" #: src/SUMMARY.md:51 msgid "Rust Memory Management" -msgstr "Gerenciamento de Memória Rust" +msgstr "Gerenciamento de Memória do Rust" #: src/SUMMARY.md:52 msgid "Comparison" @@ -191,23 +191,23 @@ msgstr "Ownership" #: src/SUMMARY.md:54 msgid "Move Semantics" -msgstr "Mover semântica" +msgstr "Semântica do move (mover)" #: src/SUMMARY.md:55 msgid "Moved Strings in Rust" -msgstr "Strings movidas em Rust" +msgstr "Strings Movidas em Rust" #: src/SUMMARY.md:56 msgid "Double Frees in Modern C++" -msgstr "Liberações duplas em C++ moderno" +msgstr "Liberações Duplas em C++ Moderno" #: src/SUMMARY.md:57 msgid "Moves in Function Calls" -msgstr "Movimentos em Chamadas de Função" +msgstr "Move em Chamadas de Função" #: src/SUMMARY.md:58 msgid "Copying and Cloning" -msgstr "Copiar e clonar" +msgstr "Copiar e Clonar" #: src/SUMMARY.md:59 msgid "Borrowing" @@ -219,23 +219,23 @@ msgstr "Empréstimos Compartilhados e Únicos" #: src/SUMMARY.md:61 msgid "Lifetimes" -msgstr "Tempos de vida (Lifetimes)" +msgstr "Tempos de Vida (Lifetimes)" #: src/SUMMARY.md:62 msgid "Lifetimes in Function Calls" -msgstr "Tempos de vida (Lifetimes) em chamadas de função" +msgstr "Tempos de vida (Lifetimes) em Chamadas de Função" #: src/SUMMARY.md:63 msgid "Lifetimes in Data Structures" -msgstr "Tempos de vida em estruturas de dados" +msgstr "Tempos de Vida em Estruturas de Dados" #: src/SUMMARY.md:65 msgid "Designing a Library" -msgstr "Projetando uma biblioteca" +msgstr "Projetando uma Biblioteca" #: src/SUMMARY.md:66 msgid "Iterators and Ownership" -msgstr "Iteradores e Ownership" +msgstr "Iteradores e Propriedade (Ownership)" #: src/SUMMARY.md:69 msgid "Day 2: Morning" @@ -247,19 +247,19 @@ msgstr "Structs" #: src/SUMMARY.md:75 msgid "Tuple Structs" -msgstr "Structs Tuplas" +msgstr "Structs como Tuplas" #: src/SUMMARY.md:76 msgid "Field Shorthand Syntax" -msgstr "Sintaxe abreviada de campos" +msgstr "Sintaxe Abreviada de Campos" #: src/SUMMARY.md:77 msgid "Enums" -msgstr "Enums" +msgstr "Enumerações (Enums)" #: src/SUMMARY.md:78 msgid "Variant Payloads" -msgstr "Cargos úteis variantes" +msgstr "Variantes de Carga Útil (payload)" #: src/SUMMARY.md:79 msgid "Enum Sizes" @@ -267,7 +267,7 @@ msgstr "Tamanhos de Enum" #: src/SUMMARY.md:81 msgid "Method Receiver" -msgstr "Receptor do método" +msgstr "Receptor de Método" #: src/SUMMARY.md:82 src/SUMMARY.md:157 src/SUMMARY.md:192 msgid "Example" @@ -275,7 +275,7 @@ msgstr "Exemplo" #: src/SUMMARY.md:83 msgid "Pattern Matching" -msgstr "Correspondência de padrões" +msgstr "Correspondência de Padrões" #: src/SUMMARY.md:84 msgid "Destructuring Enums" @@ -283,23 +283,23 @@ msgstr "Desestruturando Enums" #: src/SUMMARY.md:85 msgid "Destructuring Structs" -msgstr "Structs Destruidoras" +msgstr "Desestruturando Structs" #: src/SUMMARY.md:86 msgid "Destructuring Arrays" -msgstr "Desestruturando Arrays" +msgstr "Desestruturando Vetores" #: src/SUMMARY.md:87 msgid "Match Guards" -msgstr "Guardas de Match" +msgstr "Guardas de Correspondência (match)" #: src/SUMMARY.md:89 msgid "Health Statistics" -msgstr "Estatísticas de saúde" +msgstr "Estatísticas de Saúde" #: src/SUMMARY.md:90 msgid "Points and Polygons" -msgstr "Points e polígonos" +msgstr "Pontos e Polígonos" #: src/SUMMARY.md:92 msgid "Day 2: Afternoon" @@ -307,7 +307,7 @@ msgstr "Dia 2: Tarde" #: src/SUMMARY.md:94 msgid "Control Flow" -msgstr "Controle de fluxo" +msgstr "Controle de Fluxo" #: src/SUMMARY.md:95 msgid "Blocks" @@ -315,31 +315,31 @@ msgstr "Blocos" #: src/SUMMARY.md:96 msgid "if expressions" -msgstr "if expressões" +msgstr "Expressões Se (if)" #: src/SUMMARY.md:97 msgid "if let expressions" -msgstr "if let expressões" +msgstr "Expressões Se (if let)" #: src/SUMMARY.md:98 msgid "while expressions" -msgstr "enquanto expressões" +msgstr "Expressões Enquanto (while)" #: src/SUMMARY.md:99 msgid "while let expressions" -msgstr "while let expressões" +msgstr "Expressões Enquanto (while let)" #: src/SUMMARY.md:100 msgid "for expressions" -msgstr "for expressões" +msgstr "Expressões Para (for)" #: src/SUMMARY.md:101 msgid "loop expressions" -msgstr "expressões de loop" +msgstr "Expressões de Laço (loop)" #: src/SUMMARY.md:102 msgid "match expressions" -msgstr "expressões de match" +msgstr "Expressões de Correspondência (match)" #: src/SUMMARY.md:103 msgid "break & continue" @@ -347,7 +347,7 @@ msgstr "break e continue" #: src/SUMMARY.md:104 msgid "Standard Library" -msgstr "Biblioteca padrão" +msgstr "Biblioteca Padrão" #: src/SUMMARY.md:105 msgid "Option and Result" @@ -371,7 +371,7 @@ msgstr "Box" #: src/SUMMARY.md:110 msgid "Recursive Data Types" -msgstr "Tipos de dados recursivos" +msgstr "Tipos de Dados Recursivos" #: src/SUMMARY.md:111 msgid "Niche Optimization" @@ -387,7 +387,7 @@ msgstr "Módulos" #: src/SUMMARY.md:114 msgid "Visibility" -msgstr "Visibilage" +msgstr "Visibilidade" #: src/SUMMARY.md:115 msgid "Paths" @@ -395,15 +395,15 @@ msgstr "Caminhos" #: src/SUMMARY.md:116 msgid "Filesystem Hierarchy" -msgstr "Hierarquia do sistema de arquivos" +msgstr "Hierarquia do Sistema de Arquivos" #: src/SUMMARY.md:118 msgid "Luhn Algorithm" -msgstr "Algoritmo de LuhnName" +msgstr "Algoritmo de Luhn" #: src/SUMMARY.md:119 msgid "Strings and Iterators" -msgstr "Strings e iteradores" +msgstr "Strings e Iteradores" #: src/SUMMARY.md:122 msgid "Day 3: Morning" @@ -415,15 +415,15 @@ msgstr "Traits" #: src/SUMMARY.md:128 msgid "Deriving Traits" -msgstr "Traits derivados" +msgstr "Traits Derivados" #: src/SUMMARY.md:129 msgid "Default Methods" -msgstr "Métodos padrão" +msgstr "Métodos Padrão" #: src/SUMMARY.md:130 msgid "Important Traits" -msgstr "Traits importantes" +msgstr "Traits Importantes" #: src/SUMMARY.md:131 msgid "Iterator" @@ -451,15 +451,15 @@ msgstr "Drop" #: src/SUMMARY.md:137 msgid "Default" -msgstr "Métodos padrão" +msgstr "Default" #: src/SUMMARY.md:138 msgid "Generics" -msgstr "Genéricos" +msgstr "Generics" #: src/SUMMARY.md:139 msgid "Generic Data Types" -msgstr "Tipos de dados genéricos" +msgstr "Tipos de Dados Genéricos" #: src/SUMMARY.md:140 msgid "Generic Methods" @@ -471,11 +471,11 @@ msgstr "Limites de trait" #: src/SUMMARY.md:142 msgid "impl Trait" -msgstr "impl Trait" +msgstr "Trait impl" #: src/SUMMARY.md:143 msgid "Closures" -msgstr "fechamentos" +msgstr "Closures" #: src/SUMMARY.md:144 msgid "Monomorphization" @@ -483,11 +483,11 @@ msgstr "Monomorfização" #: src/SUMMARY.md:145 msgid "Trait Objects" -msgstr "Objetos de Trait" +msgstr "Objetos Trait" #: src/SUMMARY.md:147 msgid "A Simple GUI Library" -msgstr "Uma biblioteca GUI simples" +msgstr "Uma Biblioteca GUI Simples" #: src/SUMMARY.md:149 msgid "Day 3: Afternoon" @@ -495,23 +495,23 @@ msgstr "Dia 3: Tarde" #: src/SUMMARY.md:151 msgid "Error Handling" -msgstr "Manipulação de erros" +msgstr "Manipulação de Erros" #: src/SUMMARY.md:152 msgid "Panics" -msgstr "Pânico" +msgstr "Panics (Pânico)" #: src/SUMMARY.md:153 msgid "Catching Stack Unwinding" -msgstr "Capturando pilha desenrolando" +msgstr "Capturando o Desenrolar da Pilha" #: src/SUMMARY.md:154 msgid "Structured Error Handling" -msgstr "Tratamento de Erros Estruturado" +msgstr "Tratamento Estruturado de Erros" #: src/SUMMARY.md:155 msgid "Propagating Errors with ?" -msgstr "Propagando erros com ?" +msgstr "Propagando Erros com ?" #: src/SUMMARY.md:156 msgid "Converting Error Types" @@ -519,11 +519,11 @@ msgstr "Convertendo Tipos de Erro" #: src/SUMMARY.md:158 msgid "Deriving Error Enums" -msgstr "Derivando Enums de erro" +msgstr "Derivando Enums de Erro" #: src/SUMMARY.md:159 msgid "Dynamic Error Types" -msgstr "Tipos de erros dinâmicos" +msgstr "Tipos de Erros Dinâmicos" #: src/SUMMARY.md:160 msgid "Adding Context to Errors" @@ -531,39 +531,39 @@ msgstr "Adicionando Contexto aos Erros" #: src/SUMMARY.md:161 msgid "Testing" -msgstr "tests" +msgstr "Testando" #: src/SUMMARY.md:162 msgid "Unit Tests" -msgstr "tests de unage" +msgstr "Testes Unitários" #: src/SUMMARY.md:163 msgid "Test Modules" -msgstr "Módulos de teste" +msgstr "Módulos de Teste" #: src/SUMMARY.md:164 msgid "Documentation Tests" -msgstr "tests de Documentação" +msgstr "Testes de Documentação" #: src/SUMMARY.md:165 msgid "Integration Tests" -msgstr "tests de Integração" +msgstr "Testes de Integração" #: src/SUMMARY.md:166 msgid "Unsafe Rust" -msgstr "Unsafe Rust" +msgstr "Rust Inseguro (unsafe)" #: src/SUMMARY.md:167 msgid "Dereferencing Raw Pointers" -msgstr "Desreferenciando ponteiros brutos" +msgstr "Desreferenciando Ponteiros Brutos" #: src/SUMMARY.md:168 msgid "Mutable Static Variables" -msgstr "Variáveis estáticas mutáveis" +msgstr "Variáveis Estáticas Mutáveis" #: src/SUMMARY.md:169 msgid "Unions" -msgstr "Sindicatos" +msgstr "Uniões" #: src/SUMMARY.md:170 msgid "Calling Unsafe Functions" @@ -591,27 +591,27 @@ msgstr "Dia 4: Manhã" #: src/SUMMARY.md:183 msgid "Concurrency" -msgstr "Simultaneage" +msgstr "Concorrência" #: src/SUMMARY.md:184 msgid "Threads" -msgstr "Tópicos" +msgstr "Threads" #: src/SUMMARY.md:185 msgid "Scoped Threads" -msgstr "Tópicos com Escopo" +msgstr "Threads com Escopo" #: src/SUMMARY.md:186 msgid "Channels" -msgstr "Channels" +msgstr "Canais (channels)" #: src/SUMMARY.md:187 msgid "Unbounded Channels" -msgstr "Channels Ilimitados" +msgstr "Canais Ilimitados" #: src/SUMMARY.md:188 msgid "Bounded Channels" -msgstr "Channels Delimitados" +msgstr "Canais Delimitados" #: src/SUMMARY.md:189 msgid "Shared State" @@ -643,11 +643,11 @@ msgstr "Exemplos" #: src/SUMMARY.md:198 msgid "Dining Philosophers" -msgstr "Jantar com philosophers" +msgstr "Filósofos Jantando" #: src/SUMMARY.md:199 msgid "Multi-threaded Link Checker" -msgstr "Verificador de links multiencadeados" +msgstr "Verificador de Links Multi-Threads" #: src/SUMMARY.md:201 msgid "Day 4: Afternoon" @@ -663,7 +663,7 @@ msgstr "Configurar" #: src/SUMMARY.md:207 msgid "Build Rules" -msgstr "Regras de construção" +msgstr "Regras de Construção" #: src/SUMMARY.md:208 msgid "Binary" @@ -703,11 +703,11 @@ msgstr "Alterando API" #: src/SUMMARY.md:217 msgid "Logging" -msgstr "Exploração madeireira" +msgstr "Gerando Registros (Log)" #: src/SUMMARY.md:218 msgid "Interoperability" -msgstr "Interoperabilage" +msgstr "Interoperabilidade" #: src/SUMMARY.md:219 msgid "With C" @@ -719,7 +719,7 @@ msgstr "Chamando C com Bindgen" #: src/SUMMARY.md:221 msgid "Calling Rust from C" -msgstr "Chamando Rust de C" +msgstr "Chamando Rust do C" #: src/SUMMARY.md:222 msgid "With C++" @@ -788,7 +788,7 @@ msgid "" "and error handling. It also includes Android-specific content on the last day." msgstr "" "Este é um curso de Rust de quatro dias desenvolvido pela equipe do Android. O curso abrange\n" -"o espectro completo de Rust, desde a sintaxe básica até tópicos avançados como 'generics'\n" +"o espectro completo do Rust, desde a sintaxe básica até tópicos avançados como 'generics'\n" "e tratamento de erros. Também inclui conteúdo específico para Android no último dia." #: src/welcome.md:7 @@ -805,7 +805,7 @@ msgid "" "* Enable you to modify existing programs and write new programs in Rust.\n" "* Show you common Rust idioms." msgstr "" -"* Dar a você uma compreensão abrangente da sintaxe e linguagem de Rust.\n" +"* Dar a você uma compreensão abrangente da linguagem e da sintaxe de Rust.\n" "* Permitir que você modifique programas existentes e escreva novos programas em Rust.\n" "* Demonstrar expressões idiomáticas comuns de Rust." @@ -955,7 +955,7 @@ msgstr "" #: src/running-the-course.md:1 msgid "# Running the Course" -msgstr "# Executando o Curso" +msgstr "# Executando o curso" #: src/running-the-course.md:3 src/running-the-course/course-structure.md:3 msgid "> This page is for the course instructor." @@ -1036,7 +1036,7 @@ msgstr "" "5. Deixe as pessoas resolverem os exercícios sozinhas ou em pequenos grupos. Tenha certeza de\n" " perguntar às pessoas se elas estão com dificuldades ou se há algo em que você possa ajudar. Quando\n" " você vê que várias pessoas têm o mesmo problema, chame a turma\n" -" e oferecer uma solução, por exemplo, mostrando às pessoas onde encontrar as informações relevantes\n" +" e ofereça uma solução, por exemplo, mostrando às pessoas onde encontrar as informações relevantes\n" " na biblioteca padrão." #: src/running-the-course.md:38 @@ -1110,8 +1110,8 @@ msgid "" "* Day 4: Concurrency in Rust and interoperability with other languages" msgstr "" "* Dia 1: Rust básico, ownership e verificador de empréstimo.\n" -"* Dia 2: Tipos de dados compostos, correspondência de padrões, a biblioteca padrão.\n" -"* Dia 3: Traits e generics, tratamento de erros, testes, Rust inseguro.\n" +"* Dia 2: Tipos de dados compostos, correspondência de padrões e a biblioteca padrão.\n" +"* Dia 3: Traits e generics, tratamento de erros, testes e Rust inseguro.\n" "* Dia 4: Concorrência em Rust e interoperabilidade com outras linguagens" #: src/running-the-course/course-structure.md:12 @@ -1158,7 +1158,7 @@ msgstr "" #: src/cargo.md:1 msgid "# Using Cargo" -msgstr "# Usando cargo" +msgstr "# Usando o Cargo" #: src/cargo.md:3 msgid "" @@ -1232,7 +1232,7 @@ msgid "" "you prefer them, you can install the [Rust Plugin][5]. Please take note that as of January 2023 debugging only works on the " "CLion version of the JetBrains IDEA suite." msgstr "" -"Algumas Persons também gostam de usar a família de IDEs [JetBrains][4], que fazem suas próprias análises, mas têm suas " +"Algumas pessoas também gostam de usar a família de IDEs [JetBrains][4], que fazem suas próprias análises, mas têm suas " "próprias vantagens e desvantagens. Se você preferir, pode instalar o [Plugin Rust][5]. Observe que, a partir de Janeiro de " "2023, a depuração funciona apenas na versão CLion do pacote JetBrains IDEA." @@ -1253,7 +1253,7 @@ msgstr "" #: src/cargo/rust-ecosystem.md:1 msgid "# The Rust Ecosystem" -msgstr "# O ecossistema da rust" +msgstr "# O ecossistema do Rust" #: src/cargo/rust-ecosystem.md:3 msgid "The Rust ecosystem consists of a number of tools, of which the main ones are:" @@ -1289,9 +1289,9 @@ msgid "" msgstr "" "* `rustup`: o instalador e atualizador do toolchain do Rust. Esta ferramenta é utilizada para\n" " instalar e atualizar o `rustc` e o `cargo` quando novas versões do Rust forem lançadas.\n" -" Além disso, `rustup` também pode baixar documentação da biblioteca\n" +" Além disso, `rustup` também pode baixar a documentação da biblioteca\n" " padrão. Você pode ter várias versões do Rust instaladas ao mesmo tempo e `rustup`\n" -" permitirá que você alterne entre eles conforme necessário." +" permitirá que você alterne entre elas conforme necessário." #: src/cargo/rust-ecosystem.md:21 src/hello-world.md:25 src/hello-world/small-example.md:27 src/why-rust/runtime.md:10 #: src/why-rust/modern.md:21 src/basic-syntax/compound-types.md:30 src/error-handling/try-operator.md:50 @@ -1374,7 +1374,7 @@ msgstr "" "recursos avançados, incluindo, entre outros:\n" " * Estrutura do projeto/pacote\n" " * [workspaces]\n" -" * Gerenciamento de Dependências de desenvolvimento e dependências de tempo de execução/cache\n" +" * Gerenciamento de dependências de desenvolvimento e dependências de tempo de execução/cache\n" " * [scripts de compilação]\n" " * [instalação global]\n" " * Também é extensível com plugins de subcomando (como [cargo clippy]).\n" @@ -1426,7 +1426,7 @@ msgid "" msgstr "" "A instalação do Cargo ainda assim é incentivada: será mais fácil para você fazer os\n" "exercícios. No último dia, faremos um exercício maior que mostra como\n" -"trabalhar com dependências e para isso você precisa do Cargo." +"trabalhar com dependências e para isso você precisará do Cargo." #: src/cargo/code-samples.md:11 msgid "The code blocks in this course are fully interactive:" @@ -1467,7 +1467,7 @@ msgid "" "* The embedded playgrounds cannot execute unit tests. Copy-paste the\n" " code and open it in the real Playground to demonstrate unit tests." msgstr "" -"* Os playgrounds incorporados não podem executar testes de unitários. Copie e cole o\n" +"* Os playgrounds incorporados não podem executar testes unitários. Copie e cole o\n" " código e abra-o no Playground real para demonstrar os testes unitários." #: src/cargo/code-samples.md:30 @@ -1520,7 +1520,7 @@ msgid "" "of the examples in this training:" msgstr "" "Com isso finalizado, siga estas etapas para criar um binário Rust a partir de um\n" -"dos exemplos neste treinamento:" +"dos exemplos deste treinamento:" #: src/cargo/running-locally.md:18 msgid "1. Click the \"Copy to clipboard\" button on the example you want to copy." @@ -1606,7 +1606,7 @@ msgid "" msgstr "" "7. Você pode adicionar dependências ao seu projeto editando `Cargo.toml`. Quando você\n" " executar os comandos `cargo`, ele irá baixar e compilar automaticamente\n" -" dependências para você." +" as dependências para você." #: src/cargo/running-locally.md:66 msgid "[1]: https://doc.rust-lang.org/book/ch01-01-installation.html" @@ -1674,13 +1674,13 @@ msgstr "" "* Eles devem fazer perguntas na hora, não as guarde para o fim.\n" "* A aula é para ser interativa e as discussões são muito encorajadas!\n" " * Como instrutor, você deve tentar manter as discussões relevantes, ou seja,\n" -" mantenha o que é relacionado a como Rust faz as coisas versus alguma outra linguagem. Pode ser\n" +" mantenha o que é relacionado a como o Rust faz as coisas versus alguma outra linguagem. Pode ser\n" " difícil encontrar o equilíbrio certo, mas erra ao permitir discussões\n" " uma vez que envolvem as pessoas muito mais do que uma comunicação unidirecional.\n" "* As perguntas provavelmente parecerão que estamos falando sobre as coisas antes dos slides.\n" " * Isso está perfeitamente OK! A repetição é uma parte importante do aprendizado. Lembre-se\n" " que os slides são apenas um suporte e você está livre para ignorá-los quando\n" -" Quiser." +" quiser." #: src/welcome-day-1.md:29 msgid "" @@ -1776,13 +1776,13 @@ msgstr "[1]: https://doc.rust-lang.org/std/sync/struct.Arc.html" #: src/hello-world.md:1 msgid "# Hello World!" -msgstr "# Olá Mundo!" +msgstr "# Olá mundo!" #: src/hello-world.md:3 msgid "" "Let us jump into the simplest possible Rust program, a classic Hello World\n" "program:" -msgstr "Vamos pular para o programa em Rust mais simples possível, um clássico Hello World:" +msgstr "Vamos pular para o programa em Rust mais simples possível, o clássico \"Olá Mundo\":" #: src/hello-world.md:6 msgid "" @@ -1792,6 +1792,11 @@ msgid "" "}\n" "```" msgstr "" +"```rust\n" +"fn main() {\n" +" println!(\"Olá 🌍!\");\n" +"}\n" +"```" #: src/hello-world.md:12 msgid "What you see:" @@ -1843,7 +1848,7 @@ msgstr "" #: src/hello-world/small-example.md:1 msgid "# Small Example" -msgstr "# Pequeno Exemplo" +msgstr "# Um pequeno exemplo" #: src/hello-world/small-example.md:3 msgid "Here is a small example program in Rust:" @@ -1870,7 +1875,7 @@ msgstr "" "```rust,editable\n" "fn main() { // Ponto de entrada do programa\n" " let mut x: i32 = 6; // Atribuição de uma variável mutável\n" -" print!(\"{x}\"); // Macro para escrever na tela, como printf\n" +" print!(\"{x}\"); // Macro para escrever na tela, como printf\n" " while x != 1 { // Sem parênteses ao redor de expressões\n" " if x % 2 == 0 { // Matemática como em outras linguagens\n" " x = x / 2;\n" @@ -2002,11 +2007,11 @@ msgid "" msgstr "" "* Nenhuma variável não inicializada.\n" "* Sem vazamentos de memória (_quase_, veja as notas).\n" -"* Sem double-free.\n" -"* Sem 'user-afer-free'.\n" +"* Sem _double-free_.\n" +"* Sem _user-afer-free_'.\n" "* Sem ponteiros `NULL`.\n" "* Sem mutexes bloqueados esquecidos.\n" -"* Sem condições de corridas threads.\n" +"* Sem concorrência de dados entre _threads_.\n" "* Nenhuma invalidação de iteradores." #: src/why-rust/compile-time.md:16 @@ -2032,7 +2037,7 @@ msgstr "" " ser para obter variáveis estáticas inicializadas e dimensionadas em tempo de execução\n" "* Você pode usar [`std::mem::forget`] para fazer o compilador \"esquecer\" sobre\n" " um valor (o que significa que o destrutor nunca é executado).\n" -"* Você também pode criar acidentalmente um [referência cíclica] com `Rc` ou\n" +"* Você também pode criar acidentalmente uma [referência cíclica] com `Rc` ou\n" " `Arc`.\n" "* Na verdade, alguns considerarão preencher infinitamente uma coleção\n" " como vazamento de memória e Rust não protege disso." @@ -2068,7 +2073,7 @@ msgid "" "* Array access is bounds checked.\n" "* Integer overflow is defined." msgstr "" -"* O acesso à arrays tem limites verificados.\n" +"* O acesso à vetores tem limites verificados.\n" "* Estouro de números inteiros é definido." #: src/why-rust/runtime.md:12 @@ -2144,7 +2149,7 @@ msgid "" msgstr "" "* Abstrações de custo zero, semelhantes ao C++, significa que você não precisa 'pagar'\n" " com memória ou CPU por construções de programação de alto nível. Por exemplo,\n" -" escrever um loop usando `for` deve resultar aproximadamente nos mesmas instruções\n" +" escrever um loop usando `for` deve resultar aproximadamente nas mesmas instruções\n" " de baixo nível como ao usar a construção `.iter().fold()`." #: src/why-rust/modern.md:28 @@ -2196,7 +2201,7 @@ msgid "" " community is still working on finding the best solution --- and perhaps there\n" " isn't a single \"best solution\" for some of these things." msgstr "" -" O raciocínio por trás disso é que a funcionalidades na biblioteca padrão não podem\n" +" O raciocínio por trás disso é que as funcionalidades na biblioteca padrão não podem\n" " ser descartadas, portanto têm que ser muito estáveis. Para os exemplos acima, a comunidade\n" " Rust ainda está trabalhando para encontrar a melhor solução --- e talvez não\n" " haja uma única \"melhor solução\" para algumas dessas coisas." @@ -2241,7 +2246,7 @@ msgstr "" #: src/basic-syntax.md:1 msgid "# Basic Syntax" -msgstr "# Sintaxe Básica" +msgstr "# Sintaxe básica" #: src/basic-syntax.md:3 msgid "Much of the Rust syntax will be familiar to you from C, C++ or Java:" @@ -2279,8 +2284,8 @@ msgid "" msgstr "" "| | Tipos | Literais |\n" "|---------------------------|--------------------------------------------|-------------------------------|\n" -"| Inteiro sinalizado | `i8`, `i16`, `i32`, `i64`, `i128`, `isize` | `-10`, `0`, `1_000`, `123i64` |\n" -"| Inteiro não sinalizado | `u8`, `u16`, `u32`, `u64`, `u128`, `usize` | `0`, `123`, `10u16` |\n" +"| Inteiro com sinal | `i8`, `i16`, `i32`, `i64`, `i128`, `isize` | `-10`, `0`, `1_000`, `123i64` |\n" +"| Inteiro sem sinal | `u8`, `u16`, `u32`, `u64`, `u128`, `usize` | `0`, `123`, `10u16` |\n" "| Ponto flutuante | `f32`, `f64` | `3.14`, `-10.0e20`, `2f32` |\n" "| Strings | `&str` | `\"foo\"`, `r#\"\\\\\"#` |\n" "| Valores Unicode escalares | `char` | `'a'`, `'α'`, `'∞'` |\n" @@ -2316,12 +2321,12 @@ msgid "" msgstr "" "| | Tipos | Literais |\n" "|--------|-------------------------------|-----------------------------------|\n" -"| Arrays | `[T; N]` | `[20, 30, 40]`, `[0; 3]` |\n" -"| Tuplas | `()`, `(T,)`, `(T1, T2)`, ... | `()`, `('x',)`, `('x', 1.2)`, ... |" +"| Vetores | `[T; N]` | `[20, 30, 40]`, `[0; 3]` |\n" +"| Tuplas | `()`, `(T,)`, `(T1, T2)`, ... | `()`, `('x',)`, `('x', 1.2)`, ... |" #: src/basic-syntax/compound-types.md:8 msgid "Array assignment and access:" -msgstr "Atribuição e acesso a arrays:" +msgstr "Atribuição e acesso a vetores:" #: src/basic-syntax/compound-types.md:10 msgid "" @@ -2355,10 +2360,17 @@ msgid "" "}\n" "```" msgstr "" +"```rust,editable\n" +"fn main() {\n" +" let t: (i8, bool) = (7, true);\n" +" println!(\"1º índice: {}\", t.0);\n" +" println!(\"2º índice: {}\", t.1);\n" +"}\n" +"```" #: src/basic-syntax/compound-types.md:32 msgid "Arrays:" -msgstr "Arrays:" +msgstr "Vetores:" #: src/basic-syntax/compound-types.md:34 msgid "" @@ -2366,13 +2378,13 @@ msgid "" " Note that the length of the array is *part of its type*, which means that `[u8; 3]` and\n" " `[u8; 4]` are considered two different types." msgstr "" -"* Arrays possuem elementos do mesmo tipo, `T`, e comprimento, `N`, que é uma constante de tempo de compilação.\n" -" Observe que o comprimento do array é *parte de seu tipo*, o que significa que `[u8; 3]` e\n" +"* Vetores possuem elementos do mesmo tipo, `T`, e comprimento, `N`, que é uma constante de tempo de compilação.\n" +" Observe que o comprimento do vetor é *parte de seu tipo*, o que significa que `[u8; 3]` e\n" " `[u8; 4]` são considerados dois tipos diferentes." #: src/basic-syntax/compound-types.md:38 msgid "* We can use literals to assign values to arrays." -msgstr "* Podemos usar literais para atribuir valores a arrays." +msgstr "* Podemos usar literais para atribuir valores a vetores." #: src/basic-syntax/compound-types.md:40 msgid "" @@ -2388,7 +2400,7 @@ msgstr "" #: src/basic-syntax/compound-types.md:45 msgid "* Adding `#`, eg `{a:#?}`, invokes a \"pretty printing\" format, which can be easier to read." -msgstr "* Adicionando `#`, por exemplo `{a:#?}`, chama um formatado de \"impressão bonita\", que pode ser mais fácil de ler." +msgstr "* Adicionando `#`, por exemplo `{a:#?}`, chama um formatador de \"impressão bonita\", que pode ser mais fácil de ler." #: src/basic-syntax/compound-types.md:47 msgid "Tuples:" @@ -2396,7 +2408,7 @@ msgstr "Tuplas:" #: src/basic-syntax/compound-types.md:49 msgid "* Like arrays, tuples have a fixed length." -msgstr "* Assim como os arrays, as tuplas têm um comprimento fixo." +msgstr "* Assim como os vetores, as tuplas têm um comprimento fixo." #: src/basic-syntax/compound-types.md:51 msgid "* Tuples group together values of different types into a compound type." @@ -2560,7 +2572,7 @@ msgstr "" #: src/basic-syntax/slices.md:26 msgid "* To easily create a slice of the full array, we can therefore use `&a[..]`." -msgstr "* Para criar facilmente uma slice do array completo, podemos usar `&a[..]`." +msgstr "* Para criar facilmente uma slice do vetor completo, podemos usar `&a[..]`." #: src/basic-syntax/slices.md:28 msgid "" @@ -2575,7 +2587,7 @@ msgid "" " you cannot do it through `a` after you created a slice, but you can read the data from both `a` and `s` safely. \n" " More details will be explained in the borrow checker section." msgstr "" -"* `s` é uma referência a uma slice de `i32`s. Observe que o tipo de `s` (`&[i32]`) não menciona mais o tamanho do array. " +"* `s` é uma referência a uma slice de `i32`. Observe que o tipo de `s` (`&[i32]`) não menciona mais o tamanho do vetor. " "Isso nos permite realizar cálculos em slices de tamanhos diferentes.\n" " \n" "* As slices sempre pegam emprestado de outro objeto. Neste exemplo, `a` deve permanecer 'vivo' (no escopo) por pelo menos " @@ -2601,6 +2613,10 @@ msgid "" " let s1: &str = \"World\";\n" " println!(\"s1: {s1}\");" msgstr "" +"```rust,editable\n" +"fn main() {\n" +" let s1: &str = \"Mundo\";\n" +" println!(\"s1: {s1}\");" #: src/basic-syntax/string-slices.md:10 msgid "" @@ -2614,6 +2630,15 @@ msgid "" "}\n" "```" msgstr "" +" let mut s2: String = String::from(\"Olá \");\n" +" println!(\"s2: {s2}\");\n" +" s2.push_str(s1);\n" +" println!(\"s2: {s2}\");\n" +" \n" +" let s3: &str = &s2[6..];\n" +" println!(\"s3: {s3}\");\n" +"}\n" +"```" #: src/basic-syntax/string-slices.md:20 msgid "Rust terminology:" @@ -2660,7 +2685,7 @@ msgid "" " \n" "" msgstr "" -"* A macro `format!()` é uma maneira conveniente de gerar uma string a partir de valores dinâmicos. Isto\n" +"* A macro `format!()` é uma maneira conveniente de gerar uma string a partir de valores dinâmicos. Ela\n" " aceita os mesmos formatadores que `println!()`.\n" " \n" "* Você pode emprestar slices `&str` de `String` via `&` e, opcionalmente, selecionar um intervalo.\n" @@ -2718,7 +2743,7 @@ msgid "" " }\n" "}" msgstr "" -"fn fizzbuzz(n: u32) -> () { // // Nenhum valor de retorno significa retornar o tipo `()`\n" +"fn fizzbuzz(n: u32) -> () { // // Nenhum valor de retorno significa retornar o tipo unitário `()`\n" " match (is_divisible_by(n, 3), is_divisible_by(n, 5)) {\n" " (true, true) => println!(\"fizzbuzz\"),\n" " (true, false) => println!(\"fizz\"),\n" @@ -2804,9 +2829,9 @@ msgid "" "}" msgstr "" "```rust,editable\n" -"struct Rectangle {\n" -" width: u32,\n" -" height: u32,\n" +"struct Retangulo {\n" +" largura: u32,\n" +" altura: u32,\n" "}" #: src/basic-syntax/methods.md:12 @@ -2816,6 +2841,10 @@ msgid "" " self.width * self.height\n" " }" msgstr "" +"impl Retangulo {\n" +" fn area(&self) -> u32 {\n" +" self.largura * self.altura\n" +" }" #: src/basic-syntax/methods.md:17 msgid "" @@ -2824,6 +2853,10 @@ msgid "" " }\n" "}" msgstr "" +" fn aumenta_largura(&mut self, delta: u32) {\n" +" self.largura += delta;\n" +" }\n" +"}" #: src/basic-syntax/methods.md:22 msgid "" @@ -2835,6 +2868,13 @@ msgid "" "}\n" "```" msgstr "" +"fn main() {\n" +" let mut ret = Retangulo { largura: 10, altura: 5 };\n" +" println!(\"Área inicial: {}\", ret.area());\n" +" ret.aumenta_largura(5);\n" +" println!(\"Nova área: {}\", ret.area());\n" +"}\n" +"```" #: src/basic-syntax/methods.md:30 msgid "* We will look much more at methods in today's exercise and in tomorrow's class." @@ -2875,6 +2915,10 @@ msgid "" " if std::process::id() % 2 == 0 { a } else { b }\n" "}" msgstr "" +"```rust,editable\n" +"fn escolha_um(a: T, b: T) -> T {\n" +" if std::process::id() % 2 == 0 { a } else { b }\n" +"}" #: src/basic-syntax/functions-interlude.md:19 msgid "" @@ -2884,13 +2928,18 @@ msgid "" "}\n" "```" msgstr "" +"fn main() {\n" +" println!(\"Cara ou coroa: {}\", escolha_um(\"cara\", \"coroa\"));\n" +" println!(\"Bônus: {}\", escolha_um(500, 1000));\n" +"}\n" +"```" #: src/basic-syntax/functions-interlude.md:27 msgid "" "* When using generics, the standard library's `Into` can provide a kind of limited\n" " polymorphism on argument types. We will see more details in a later section." msgstr "" -"* Ao usar generics, o `Into` da biblioteca padrão pode fornecer um tipo polimorfismo\n" +"* Ao usar generics, o `Into` da biblioteca padrão pode fornecer um tipo polimórfico\n" " limitado nos tipos do argumento. Veremos mais detalhes em uma seção posterior." #: src/basic-syntax/functions-interlude.md:30 @@ -2911,7 +2960,7 @@ msgstr "* Conversões implícitas entre tipos." #: src/exercises/day-1/morning.md:7 msgid "* Arrays and `for` loops." -msgstr "* Arrays e loops `for`." +msgstr "* Vetores e laços `for`." #: src/exercises/day-1/morning.md:11 msgid "A few things to consider while solving the exercises:" @@ -2995,7 +3044,7 @@ msgid "" "Implementing these traits is how a type expresses that it can be converted into\n" "another type." msgstr "" -"Todos os tipos inteiro do Rust implementam os traits [`From`][1] e [`Into`][2]\n" +"Todos os tipos inteiros do Rust implementam os traits [`From`][1] e [`Into`][2]\n" "para nos deixar converter entre eles. Os traits `From` tem um único `from()`\n" "e da mesma forma, o trait `Into` tem um único método `into()`.\n" "A implementação dessas características é como um tipo expressa que pode ser convertido em\n" @@ -3055,11 +3104,11 @@ msgstr "" #: src/exercises/day-1/for-loops.md:1 msgid "# Arrays and `for` Loops" -msgstr "# Arrays e loops `for`" +msgstr "# Vetores e laços `for`" #: src/exercises/day-1/for-loops.md:3 msgid "We saw that an array can be declared like this:" -msgstr "Vimos que um array pode ser declarado assim:" +msgstr "Vimos que um vetor pode ser declarado assim:" #: src/exercises/day-1/for-loops.md:5 msgid "" @@ -3067,10 +3116,13 @@ msgid "" "let array = [10, 20, 30];\n" "```" msgstr "" +"```rust\n" +"let vetor = [10, 20, 30];\n" +"```" #: src/exercises/day-1/for-loops.md:9 msgid "You can print such an array by asking for its debug representation with `{:?}`:" -msgstr "Você pode imprimir tal array solicitando sua representação de depuração com `{:?}`:" +msgstr "Você pode imprimir tal vetor solicitando sua representação de depuração com `{:?}`:" #: src/exercises/day-1/for-loops.md:11 msgid "" @@ -3081,13 +3133,19 @@ msgid "" "}\n" "```" msgstr "" +"```rust,editable\n" +"fn main() {\n" +" let vetor = [10, 20, 30];\n" +" println!(\"Vetor: {vetor:?}\");\n" +"}\n" +"```" #: src/exercises/day-1/for-loops.md:18 msgid "" "Rust lets you iterate over things like arrays and ranges using the `for`\n" "keyword:" msgstr "" -"Rust permite iterar em coisas como arrays e intervalos usando um `for`\n" +"Rust permite iterar em coisas como vetores e intervalos usando um laço `for`\n" ":" #: src/exercises/day-1/for-loops.md:21 @@ -3101,6 +3159,14 @@ msgid "" " }\n" " println!();" msgstr "" +"```rust,editable\n" +"fn main() {\n" +" let vetor = [10, 20, 30];\n" +" print!(\"Interagindo com o vetor:\");\n" +" for n in vetor {\n" +" print!(\" {n}\");\n" +" }\n" +" println!();" #: src/exercises/day-1/for-loops.md:30 msgid "" @@ -3112,27 +3178,34 @@ msgid "" "}\n" "```" msgstr "" +" print!(\"Interagindo sobre uma faixa:\");\n" +" for i in 0..3 {\n" +" print!(\" {}\", vetor[i]);\n" +" }\n" +" println!();\n" +"}\n" +"```" #: src/exercises/day-1/for-loops.md:38 msgid "" "Use the above to write a function `pretty_print` which pretty-print a matrix and\n" "a function `transpose` which will transpose a matrix (turn rows into columns):" msgstr "" -"Use o exercício acima para escrever uma função `pretty_print` que imprime um array e\n" -"uma função `transpose` que irá transpor um array (transformar linhas em colunas):" +"Use o exercício acima para escrever uma função `pretty_print` que imprime uma matriz e\n" +"uma função `transpose` que irá transpor uma matriz (transformar linhas em colunas):" #: src/exercises/day-1/for-loops.md:41 msgid "" "```bob\n" -" ⎛⎡1 2 3⎤⎞ ⎡1 4 7⎤\n" -"\"transpose\"⎜⎢4 5 6⎥⎟ \"==\"⎢2 5 8⎥\n" -" ⎝⎣7 8 9⎦⎠ ⎣3 6 9⎦\n" +" ⎛⎡1 2 3⎤⎞ ⎡1 4 7⎤\n" +"\"transpose\" ⎜⎢4 5 6⎥⎟ \"==\" ⎢2 5 8⎥\n" +" ⎝⎣7 8 9⎦⎠ ⎣3 6 9⎦\n" "```" msgstr "" #: src/exercises/day-1/for-loops.md:47 msgid "Hard-code both functions to operate on 3 × 3 matrices." -msgstr "Limite ambas as funções a operar em arrays 3 × 3." +msgstr "Limite ambas as funções a operar em matrizes 3 × 3." #: src/exercises/day-1/for-loops.md:49 msgid "" @@ -3155,6 +3228,9 @@ msgid "" " unimplemented!()\n" "}" msgstr "" +"fn transposta(matriz: [[i32; 3]; 3]) -> [[i32; 3]; 3] {\n" +" unimplemented!()\n" +"}" #: src/exercises/day-1/for-loops.md:60 msgid "" @@ -3162,6 +3238,9 @@ msgid "" " unimplemented!()\n" "}" msgstr "" +"fn impressao_formatada(matriz: &[[i32; 3]; 3]) {\n" +" unimplemented!()\n" +"}" #: src/exercises/day-1/for-loops.md:64 msgid "" @@ -3173,7 +3252,7 @@ msgid "" " ];" msgstr "" "fn main() {\n" -" let matrix = [\n" +" let matriz = [\n" " [101, 102, 103], // <-- o comentário faz com que o rustfmt adicione uma nova linha\n" " [201, 202, 203],\n" " [301, 302, 303],\n" @@ -3184,6 +3263,8 @@ msgid "" " println!(\"matrix:\");\n" " pretty_print(&matrix);" msgstr "" +" println!(\"matriz:\");\n" +" impressao_formatada(&matriz);" #: src/exercises/day-1/for-loops.md:74 msgid "" @@ -3193,6 +3274,11 @@ msgid "" "}\n" "```" msgstr "" +" let transposta = transposta(matriz);\n" +" println!(\"Transposta:\");\n" +" impressao_formatada(&transposta);\n" +"}\n" +"```" #: src/exercises/day-1/for-loops.md:80 msgid "## Bonus Question" @@ -3204,7 +3290,7 @@ msgid "" "argument and return types? Something like `&[&[i32]]` for a two-dimensional\n" "slice-of-slices. Why or why not?" msgstr "" -"Você poderia usar slices `&[i32]` em vez de Arrays 3 × 3 estáticos para o seu\n" +"Você poderia usar slices `&[i32]` em vez de matrizes 3 × 3 estáticos para o seu\n" "argumentos e tipos de retorno? Algo como `&[&[i32]]` para um slice-de-slices\n" "bidimensional. Por que ou por que não?" @@ -3221,8 +3307,8 @@ msgid "" "The solution and the answer to the bonus section are available in the \n" "[Solution](solutions-morning.md#arrays-and-for-loops) section." msgstr "" -"A solução e a resposta para a seção de bônus estão disponíveis no\n" -"Seção [Solution](solutions-morning.md#arrays-and-for-loops)." +"A solução e a resposta para a seção de bônus estão disponíveis na\n" +"Seção [Soluções](solutions-morning.md#arrays-and-for-loops)." #: src/basic-syntax/variables.md:1 msgid "# Variables" @@ -3273,6 +3359,10 @@ msgid "" " println!(\"u32: {x}\");\n" "}" msgstr "" +"```rust,editable\n" +"fn recebe_u32(x: u32) {\n" +" println!(\"u32: {x}\");\n" +"}" #: src/basic-syntax/type-inference.md:10 msgid "" @@ -3280,6 +3370,9 @@ msgid "" " println!(\"i8: {y}\");\n" "}" msgstr "" +"fn recebe_u8(y: i8) {\n" +" println!(\"i8: {y}\");\n" +"}" #: src/basic-syntax/type-inference.md:14 msgid "" @@ -3296,18 +3389,22 @@ msgid "" "}\n" "```" msgstr "" +" recebe_u32(x);\n" +" recebe_u8(y);\n" +" // recebe_u32(y);\n" +"}\n" +"```" #: src/basic-syntax/type-inference.md:26 msgid "" "This slide demonstrates how the Rust compiler infers types based on constraints given by variable declarations and usages.\n" -msgstr "" -"Este slide demonstra como o compilador Rust infere tipos com base em restrições dadas por declarações e usos de variáveis.\n" - -msgid "" +" \n" "It is very important to emphasize that variables declared like this are not of some sort of dynamic \"any type\" that can\n" "hold any data. The machine code generated by such declaration is identical to the explicit declaration of a type.\n" "The compiler does the job for us and helps us to write a more concise code." msgstr "" +"Este slide demonstra como o compilador Rust infere tipos com base em restrições dadas por declarações e usos de variáveis.\n" +" \n" "É muito importante enfatizar que variáveis declaradas assim não são de um tipo dinâmico \"qualquer tipo\" que possa\n" "armazenar quaisquer dados. O código de máquina gerado por tal declaração é idêntico à declaração explícita de um tipo.\n" "O compilador faz o trabalho para nós e nos ajuda a escrever um código mais conciso." @@ -3348,7 +3445,7 @@ msgstr "" #: src/basic-syntax/static-and-const.md:1 msgid "# Static and Constant Variables" -msgstr "# Variáveis Estáticas e Constantes" +msgstr "# Variáveis estáticas e constantes" #: src/basic-syntax/static-and-const.md:3 msgid "Global state is managed with static and constant variables." @@ -3391,7 +3488,7 @@ msgstr "" #: src/basic-syntax/static-and-const.md:27 msgid "According the the [Rust RFC Book][1] these are inlined upon use." -msgstr "De acordo com o [Rust RFC Book] [1], eles são expandidos no próprio local (inline) após o uso." +msgstr "De acordo com o [Rust RFC Book][1], eles são expandidos no próprio local (inline) após o uso." #: src/basic-syntax/static-and-const.md:29 msgid "## `static`" @@ -3422,7 +3519,7 @@ msgid "" "As noted in the [Rust RFC Book][1], these are not inlined upon use and have an actual associated memory location. This is " "useful for unsafe and embedded code, and the variable lives through the entirety of the program execution." msgstr "" -"Conforme observado no [Rust RFC Book][1], `static` e `const` não são expandidos em linha (inlined) quando utilizados uso e " +"Conforme observado no [Rust RFC Book][1], `static` e `const` não são expandidos em linha (inlined) quando utilizados e " "possuem um local de memória real associado. Isso é útil para código inseguro e embarcado, e a variável sobrevive durante " "toda a execução do programa." @@ -3447,7 +3544,7 @@ msgstr "[1]: https://rust-lang.github.io/rfcs/0246-const-vs-static.html" #: src/basic-syntax/scopes-shadowing.md:1 msgid "# Scopes and Shadowing" -msgstr "# Escopos e Sobreposição" +msgstr "# Escopos e sobreposição" #: src/basic-syntax/scopes-shadowing.md:3 msgid "" @@ -3464,6 +3561,10 @@ msgid "" " let a = 10;\n" " println!(\"before: {a}\");" msgstr "" +"```rust,editable\n" +"fn main() {\n" +" let a = 10;\n" +" println!(\"Antes: {a}\");" #: src/basic-syntax/scopes-shadowing.md:11 msgid "" @@ -3471,6 +3572,9 @@ msgid "" " let a = \"hello\";\n" " println!(\"inner scope: {a}\");" msgstr "" +" {\n" +" let a = \"Olá\";\n" +" println!(\"Escopo interno: {a}\");" #: src/basic-syntax/scopes-shadowing.md:15 msgid "" @@ -3478,6 +3582,9 @@ msgid "" " println!(\"shadowed in inner scope: {a}\");\n" " }" msgstr "" +" let a = true;\n" +" println!(\"Sobreposição no escopo interno: {a}\");\n" +" }" #: src/basic-syntax/scopes-shadowing.md:19 msgid "" @@ -3485,6 +3592,9 @@ msgid "" "}\n" "```" msgstr "" +" println!(\"Depois: {a}\");\n" +"}\n" +"```" #: src/basic-syntax/scopes-shadowing.md:25 msgid "" @@ -3527,7 +3637,7 @@ msgid "" "* Full control via manual memory management: C, C++, Pascal, ...\n" "* Full safety via automatic memory management at runtime: Java, Python, Go, Haskell, ..." msgstr "" -"* Controle total através gerenciamento manual de memória: C, C++, Pascal, ...\n" +"* Controle total através do gerenciamento manual de memória: C, C++, Pascal, ...\n" "* Segurança total através do gerenciamento automático de memória em tempo de execução: Java, Python, Go, Haskell, ..." #: src/memory-management.md:8 @@ -3552,7 +3662,7 @@ msgstr "Primeiro, vamos rever como o gerenciamento de memória funciona." #: src/memory-management/stack-vs-heap.md:1 msgid "# The Stack vs The Heap" -msgstr "# O Stack vs O Heap" +msgstr "# Stack (pilha) vs Heap" #: src/memory-management/stack-vs-heap.md:3 msgid "" @@ -3582,7 +3692,7 @@ msgstr "" #: src/memory-management/stack.md:1 msgid "# Stack Memory" -msgstr "# Memória de Pilha (stack Memory)" +msgstr "# Memória de pilha (stack Memory)" #: src/memory-management/stack.md:3 msgid "" @@ -3602,10 +3712,9 @@ msgid "" msgstr "" #: src/memory-management/stack.md:12 -#, fuzzy msgid "" "```bob\n" -" Stack Heap\n" +" Stack Heap\n" ".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - -.\n" ": : : :\n" ": s1 : : :\n" @@ -3618,6 +3727,19 @@ msgid "" "`- - - - - - - - - - - - - -'\n" "```" msgstr "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - -.\n" +": : : :\n" +": s1 : : :\n" +": +-----------+-------+ : : +----+----+----+----+----+ :\n" +": | ptr | o---+---+-----+-->| H | e | l | l | o | :\n" +": | len | 5 | : : +----+----+----+----+----+ :\n" +": | capacity | 5 | : : :\n" +": +-----------+-------+ : : :\n" +": : `- - - - - - - - - - - - - - - -'\n" +"`- - - - - - - - - - - - - -'\n" +"```" #: src/memory-management/stack.md:28 msgid "" @@ -3637,7 +3759,7 @@ msgstr "" #: src/memory-management/stack.md:32 msgid "* We can inspect the memory layout with `unsafe` code. However, you should point out that this is rightfully unsafe!" -msgstr "* Pode-se inspecionar o layout de memória com `unsafe` code. Entretanto, deve-se salientar que isto é inseguro!" +msgstr "* Pode-se inspecionar o layout de memória com código `unsafe`. Entretanto, deve-se salientar que isto é inseguro!" #: src/memory-management/stack.md:34 msgid "" @@ -3656,6 +3778,20 @@ msgid "" "}\n" "```" msgstr "" +"```rust,editable\n" +"fn main() {\n" +" let mut s1 = String::from(\"Olá\");\n" +" s1.push(' ');\n" +" s1.push_str(\"mundo\");\n" +" // NÃO FAÇA ISSO EM CASA! Somente com propósito educacional.\n" +" // String não provém nenhuma garantia sobre o seu layout, então isso pode levar\n" +" // a um comportamento indefinido.\n" +" unsafe {\n" +" let (capacity, ptr, len): (usize, usize, usize) = std::mem::transmute(s1);\n" +" println!(\"Ponteiro = {ptr:#x}, tamanho = {len}, capacidade = {capacity}\");\n" +" }\n" +"}\n" +"```" #: src/memory-management/stack.md:51 msgid "" @@ -3713,7 +3849,7 @@ msgstr "# Gerenciamento de memória baseado em escopo" #: src/memory-management/scope-based.md:3 msgid "Constructors and destructors let you hook into the lifetime of an object." -msgstr "Construtores e destruidores permitem que a tempo de vida de um objeto seja rastreado." +msgstr "Construtores e destrutores permitem que o tempo de vida de um objeto seja rastreado." #: src/memory-management/scope-based.md:5 msgid "" @@ -3746,6 +3882,11 @@ msgid "" "}\n" "```" msgstr "" +"```c++\n" +"void say_hello(std::unique_ptr person) {\n" +" std::cout << \"Olá \" << person->name << std::endl;\n" +"}\n" +"```" #: src/memory-management/scope-based.md:20 msgid "" @@ -3761,7 +3902,7 @@ msgstr "" #: src/memory-management/scope-based.md:25 msgid "Special move constructors are used when passing ownership to a function:" -msgstr "Construtores de movimentos especiais são usados ao passar a \"ownership\" para uma função:" +msgstr "Construtores especiais de movimento (move) são usados ao passar a \"ownership\" para uma função:" #: src/memory-management/scope-based.md:27 msgid "" @@ -3773,7 +3914,7 @@ msgstr "" #: src/memory-management/garbage-collection.md:1 msgid "# Automatic Memory Management" -msgstr "# Gerenciamento Automático de Memória" +msgstr "# Gerenciamento automático de memória" #: src/memory-management/garbage-collection.md:3 msgid "" @@ -3807,10 +3948,15 @@ msgid "" "}\n" "```" msgstr "" +"```java\n" +"void sayHello(Person person) {\n" +" System.out.println(\"Olá \" + person.getName());\n" +"}\n" +"```" #: src/memory-management/rust.md:1 msgid "# Memory Management in Rust" -msgstr "# Gerenciamento de memória em Rust" +msgstr "# Gerenciamento de memória do Rust" #: src/memory-management/rust.md:3 msgid "Memory management in Rust is a mix:" @@ -3832,7 +3978,7 @@ msgstr "" #: src/memory-management/rust.md:10 msgid "It achieves this by modeling _ownership_ explicitly." -msgstr "Ele consegue isso modelando _ownership_ explicitamente." +msgstr "Ele consegue isso modelando a propriedade (_ownership_) explicitamente." #: src/memory-management/rust.md:14 msgid "" @@ -3841,11 +3987,11 @@ msgid "" "errors in C." msgstr "" "* Neste ponto, se perguntado como, você pode mencionar que em Rust isso geralmente é tratado por wrappers RAII como [Box], " -"[Vec], [Rc] ou [Arc]. Eles encapsulam a ownership e a alocação de memória por vários meios e evitam possíveis erros em C." +"[Vec], [Rc] ou [Arc]. Eles encapsulam a propriedade (ownership) e a alocação de memória por vários meios e evitam possíveis erros em C." #: src/memory-management/rust.md:16 msgid "* You may be asked about destructors here, the [Drop] trait is the Rust equivalent." -msgstr "* Você pode ser questionado sobre destruidores aqui, o trait [Drop] é o equivalente ao Rust." +msgstr "* Você pode ser questionado sobre destrutores aqui, o trait [Drop] é o equivalente em Rust." #: src/memory-management/rust.md:20 msgid "" @@ -3922,7 +4068,7 @@ msgid "" " * Can reject valid programs." msgstr "" "* Manual como C:\n" -" * Use-after-free.\n" +" * Uso após a liberação (use-after-free).\n" " * Liberações duplas (double-free).\n" " * Vazamento de memória.\n" "* Automático como Java:\n" @@ -3930,7 +4076,7 @@ msgstr "" " * Atrasos na execução de destrutores.\n" "* Baseado em escopo como C++:\n" " * Complexo, o programador deve optar em utilizá-las.\n" -" * Potencial para uso pós-livre (user-after-free).\n" +" * Potencial para uso após a liberação (user-after-free).\n" "* Obrigado pelo compilador e baseado em escopo como Rust:\n" " * Alguma complexidade inicial.\n" " * Pode rejeitar programas válidos." @@ -3952,6 +4098,8 @@ msgid "" "```rust,editable,compile_fail\n" "struct Point(i32, i32);" msgstr "" +"```rust,editable,compile_fail\n" +"struct Ponto(i32, i32);" #: src/ownership.md:9 msgid "" @@ -3964,6 +4112,14 @@ msgid "" "}\n" "```" msgstr "" +"fn main() {\n" +" {\n" +" let p = Ponto(3, 4);\n" +" println!(\"x: {}\", p.0);\n" +" }\n" +" println!(\"y: {}\", p.1);\n" +"}\n" +"```" #: src/ownership.md:18 msgid "" @@ -3977,11 +4133,11 @@ msgstr "" #: src/ownership/move-semantics.md:1 msgid "# Move Semantics" -msgstr "# Semântica de mover (move)" +msgstr "# Semântica do `move` (mover)" #: src/ownership/move-semantics.md:3 msgid "An assignment will transfer ownership between variables:" -msgstr "Uma atribuição transferirá a ownership entre variáveis:" +msgstr "Uma atribuição transferirá a propriedade (ownership) entre variáveis:" #: src/ownership/move-semantics.md:5 msgid "" @@ -3994,6 +4150,14 @@ msgid "" "}\n" "```" msgstr "" +"```rust,editable\n" +"fn main() {\n" +" let s1: String = String::from(\"Olá!\");\n" +" let s2: String = s1;\n" +" println!(\"s2: {s2}\");\n" +" // println!(\"s1: {s1}\");\n" +"}\n" +"```" #: src/ownership/move-semantics.md:14 msgid "" @@ -4041,7 +4205,7 @@ msgid "" "* When `s1` goes out of scope, nothing happens (it has been moved from)." msgstr "" "* Os dados no heap de `s1` são reutilizados para `s2`.\n" -"* Quando `s1` sai do escopo, nada acontece (foi movido de)." +"* Quando `s1` sai do escopo, nada acontece (foi movido dele)." #: src/ownership/moved-strings-rust.md:13 msgid "Before move to `s2`:" @@ -4065,19 +4229,32 @@ msgid "" "`- - - - - - - - - - - - - -'\n" "```" msgstr "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - -.\n" +": : : :\n" +": s1 : : :\n" +": +-----------+-------+ : : +----+----+----+----+ :\n" +": | ptr | o---+---+-----+-->| R | u | s | t | :\n" +": | len | 4 | : : +----+----+----+----+ :\n" +": | capacity | 4 | : : :\n" +": +-----------+-------+ : : :\n" +": : `- - - - - - - - - - - - - -'\n" +": :\n" +"`- - - - - - - - - - - - - -'\n" +"```" #: src/ownership/moved-strings-rust.md:30 msgid "After move to `s2`:" msgstr "Depois de mover para `s2`:" #: src/ownership/moved-strings-rust.md:32 -#, fuzzy msgid "" "```bob\n" " Stack Heap\n" ".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - -.\n" ": : : :\n" -": s1 \"(inaccessible)\" : : :\n" +": s1 \"(inaccessible)\" : : :\n" ": +-----------+-------+ : : +----+----+----+----+ :\n" ": | ptr | o---+---+--+--+-->| R | u | s | t | :\n" ": | len | 4 | : | : +----+----+----+----+ :\n" @@ -4094,6 +4271,26 @@ msgid "" "`- - - - - - - - - - - - - -'\n" "```" msgstr "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - -.\n" +": : : :\n" +": s1 \"(inacessível)\" : : :\n" +": +------------+------+ : : +----+----+----+----+ :\n" +": | ponteiro | o---+---+--+--+-->| R | u | s | t | :\n" +": | tamanho | 4 | : | : +----+----+----+----+ :\n" +": | capacidade | 4 | : | : :\n" +": +------------+------+ : | : :\n" +": : | `- - - - - - - - - - - - - -'\n" +": s2 : |\n" +": +------------+------+ : |\n" +": | ponteiro | o---+---+--'\n" +": | tamanho | 4 | :\n" +": | capacidade | 4 | :\n" +": +------------+------+ :\n" +": :\n" +"`- - - - - - - - - - - - - -'\n" +"```" #: src/ownership/double-free-modern-cpp.md:1 msgid "# Double Frees in Modern C++" @@ -4176,7 +4373,7 @@ msgstr "" #: src/ownership/moves-function-calls.md:1 msgid "# Moves in Function Calls" -msgstr "# Movimentos em chamadas de Função" +msgstr "# Move (mover) em chamadas de Função" #: src/ownership/moves-function-calls.md:3 msgid "" @@ -4193,6 +4390,10 @@ msgid "" " println!(\"Hello {name}\")\n" "}" msgstr "" +"```rust,editable\n" +"fn diz_ola(nome: String) {\n" +" println!(\"Olá {nome}\")\n" +"}" #: src/ownership/moves-function-calls.md:11 msgid "" @@ -4203,6 +4404,12 @@ msgid "" "}\n" "```" msgstr "" +"fn main() {\n" +" let nome = String::from(\"Alice\");\n" +" diz_ola(nome);\n" +" // diz_ola(nome);\n" +"}\n" +"```" #: src/ownership/moves-function-calls.md:20 msgid "" @@ -4221,7 +4428,7 @@ msgstr "" "* `main` pode manter a ownership se passar `name` como uma referência (`&name`) e se `say_hello` aceitar uma referência " "como um parâmetro.\n" "* Alternativamente, `main` pode passar um clone de `name` na primeira chamada (`name.clone()`).\n" -"* Rust torna mais difícil do que C++ criar cópias inadvertidamente, tornando a semântica de movimento o padrão e forçando " +"* Rust torna mais difícil do que o C++ a criação de cópias inadvertidamente, tornando a semântica de movimento o padrão e forçando " "os programadores a tornar os clones explícitos." #: src/ownership/copy-clone.md:1 @@ -4268,7 +4475,7 @@ msgid "" msgstr "" "```rust, editable\n" "#[derive(Copy, Clone, Debug)]\n" -"struct Point(i32, i32);" +"struct Ponto(i32, i32);" #: src/ownership/copy-clone.md:22 msgid "" @@ -4281,7 +4488,7 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let p1 = Point(3, 4);\n" +" let p1 = Ponto(3, 4);\n" " let p2 = p1;\n" " println!(\"p1: {p1:?}\");\n" " println!(\"p2: {p2:?}\");\n" @@ -4340,15 +4547,15 @@ msgstr "" #: src/ownership/borrowing.md:1 msgid "# Borrowing" -msgstr "# Empréstimo" +msgstr "# Empréstimo (Borrowing)" #: src/ownership/borrowing.md:3 msgid "" "Instead of transferring ownership when calling a function, you can let a\n" "function _borrow_ the value:" msgstr "" -"Em vez de transferir a ownership ao chamar uma função, você pode permitir que um\n" -"função _emprestar_ o valor:" +"Em vez de transferir a ownership ao chamar uma função, você pode permitir que uma\n" +"função _empreste_ o valor:" #: src/ownership/borrowing.md:6 src/ownership/lifetimes-function-calls.md:5 msgid "" @@ -4358,7 +4565,7 @@ msgid "" msgstr "" "```rust, editable\n" "#[derive(Debug)]\n" -"struct Point(i32, i32);" +"struct Ponto(i32, i32);" #: src/ownership/borrowing.md:10 msgid "" @@ -4366,8 +4573,8 @@ msgid "" " Point(p1.0 + p2.0, p1.1 + p2.1)\n" "}" msgstr "" -"fn add(p1: &Point, p2: &Point) -> Point {\n" -" Point(p1.0 + p2.0, p1.1 + p2.1)\n" +"fn somar(p1: &Ponto, p2: &Ponto) -> Ponto {\n" +" Ponto(p1.0 + p2.0, p1.1 + p2.1)\n" "}" #: src/ownership/borrowing.md:14 @@ -4381,9 +4588,9 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let p1 = Point(3, 4);\n" -" let p2 = Point(10, 20);\n" -" let p3 = add(&p1, &p2);\n" +" let p1 = Ponto(3, 4);\n" +" let p2 = Ponto(10, 20);\n" +" let p3 = somar(&p1, &p2);\n" " println!(\"{p1:?} + {p2:?} = {p3:?}\");\n" "}\n" "```" @@ -4393,30 +4600,67 @@ msgid "" "* The `add` function _borrows_ two points and returns a new point.\n" "* The caller retains ownership of the inputs." msgstr "" -"* A função `add` _pega emprestado_ dois Points e retorna um novo Point.\n" -"* O chamador mantém a ownership das entradas." +"* A função `somar` _pega emprestado_ (_borrowing_) dois Pontos e retorna um novo Ponto.\n" +"* O chamador mantém a _ownership_ das entradas." #: src/ownership/borrowing.md:27 msgid "" "Notes on stack returns:\n" -msgstr "" -"Notas sobre retornos de pilha:\n" - -msgid "" "* Demonstrate that the return from `add` is cheap because the compiler can eliminate the copy operation. Change the above " "code to print stack addresses and run it on the [Playground]. In the \"DEBUG\" optimization level, the addresses should " "change, while the stay the same when changing to the \"RELEASE\" setting:" msgstr "" -"* Demonstre que o retorno de `add` é barato porque o compilador pode eliminar a operação de cópia. Altere o código acima " +"Notas sobre retornos de pilha:\n" +"* Demonstre que o retorno de `somar` é barato porque o compilador pode eliminar a operação de cópia. Altere o código acima " "para imprimir endereços de pilha e execute-o no [Playground]. No nível de otimização \"DEBUG\", os endereços devem mudar, " -"enquanto os permanecem os mesmos ao mudar para a configuração \"RELEASE\":" +"enquanto permanecem os mesmos ao mudar para a configuração \"RELEASE\":" + +#: src/ownership/borrowing.md:30 +msgid "" +" ```rust,editable\n" +" #[derive(Debug)]\n" +" struct Point(i32, i32);" +msgstr "" +" ```rust, editable\n" +" #[derive(Debug)]\n" +" struct Ponto(i32, i32);" + +#: src/ownership/borrowing.md:34 +msgid "" +" fn add(p1: &Point, p2: &Point) -> Point {\n" +" let p = Point(p1.0 + p2.0, p1.1 + p2.1);\n" +" println!(\"&p.0: {:p}\", &p.0);\n" +" p\n" +" }" +msgstr "" +" fn somar(p1: &Ponto, p2: &Ponto) -> Ponto {\n" +" let p = Ponto(p1.0 + p2.0, p1.1 + p2.1);\n" +" println!(\"&p.0: {:p}\", &p.0);\n" +" p\n" +" }" #: src/ownership/borrowing.md:40 msgid "" +" fn main() {\n" +" let p1 = Point(3, 4);\n" +" let p2 = Point(10, 20);\n" +" let p3 = add(&p1, &p2);\n" +" println!(\"&p3.0: {:p}\", &p3.0);\n" +" println!(\"{p1:?} + {p2:?} = {p3:?}\");\n" +" }\n" +" ```\n" "* The Rust compiler can do return value optimization (RVO).\n" "* In C++, copy elision has to be defined in the language specification because constructors can have side effects. In Rust, " "this is not an issue at all. If RVO did not happen, Rust will always performs a simple and efficient `memcpy` copy." msgstr "" +" fn main() {\n" +" let p1 = Ponto(3, 4);\n" +" let p2 = Ponto(10, 20);\n" +" let p3 = somar(&p1, &p2);\n" +" println!(\"&p3.0: {:p}\", &p3.0);\n" +" println!(\"{p1:?} + {p2:?} = {p3:?}\");\n" +" }\n" +" ```\n" "* O compilador Rust pode fazer otimização de valor de retorno (RVO).\n" "* Em C++, a elisão de cópia deve ser definida na especificação da linguagem porque os construtores podem ter efeitos " "colaterais. Em Rust, isso não é um problema. Se o RVO não aconteceu, o Rust sempre executará uma cópia `memcpy` simples e " @@ -4498,7 +4742,7 @@ msgstr "# Tempos de vida" #: src/ownership/lifetimes.md:3 msgid "A borrowed value has a _lifetime_:" -msgstr "Um valor emprestado tem um _lifetime_:" +msgstr "Um valor emprestado tem um tempo de vida (_lifetime_):" #: src/ownership/lifetimes.md:5 msgid "" @@ -4511,9 +4755,9 @@ msgid "" " * Lifetime annotations create constraints; the compiler verifies that there is\n" " a valid solution." msgstr "" -"* O tempo de vida pode ser excluído: `add(p1: &Point, p2: &Point) -> Point`.\n" +"* O tempo de vida pode ser omitido: `add(p1: &Point, p2: &Point) -> Point`.\n" "* Tempos de vida também podem ser explícitos: `&'a Point`, `&'document str`.\n" -"* Leia `&'um Point` como \"um `Point` emprestado que é válido por pelo menos o\n" +"* Leia `&'a Point` como \"um `Point` emprestado que é válido por pelo menos o\n" " tempo de vida `a`\".\n" "* Os tempos de vida são sempre inferidos pelo compilador: você não pode atribuir um tempo de vida\n" " você mesmo.\n" @@ -4522,7 +4766,7 @@ msgstr "" #: src/ownership/lifetimes-function-calls.md:1 msgid "# Lifetimes in Function Calls" -msgstr "# Tempos de vida em Chamadas de Função" +msgstr "# Tempos de vida em chamadas de função" #: src/ownership/lifetimes-function-calls.md:3 msgid "In addition to borrowing its arguments, a function can return a borrowed value:" @@ -4534,7 +4778,7 @@ msgid "" " if p1.0 < p2.0 { p1 } else { p2 }\n" "}" msgstr "" -"fn left_most<'a>(p1: &'a Point, p2: &'a Point) -> &'a Point {\n" +"fn mais_a_esquerda<'a>(p1: &'a Ponto, p2: &'a Ponto) -> &'a Ponto{\n" " if p1.0 < p2.0 { p1 } else { p2 }\n" "}" @@ -4549,10 +4793,10 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let p1: Point = Point(10, 10);\n" -" let p2: Point = Point(20, 20);\n" -" let p3: &Point = left_most(&p1, &p2);\n" -" println!(\"Point mais à esquerda: {:?}\", p3);\n" +" let p1: Ponto = Ponto(10, 10);\n" +" let p2: Ponto = Ponto(20, 20);\n" +" let p3: &Ponto = mais_a_esquerda(&p1, &p2);\n" +" println!(\"Ponto mais à esquerda: {:?}\", p3);\n" "}\n" "```" @@ -4566,7 +4810,7 @@ msgid "" msgstr "" "* `'a` é um parâmetro genérico, é inferido pelo compilador.\n" "* Os tempos de vida começam com `'` e `'a` é um name padrão típico.\n" -"* Leia `&'um Point` como \"um `Point` emprestado que é válido por pelo menos o\n" +"* Leia `&'a Ponto` como \"um `Ponto` emprestado que é válido por pelo menos o\n" " tempo de vida `a`\".\n" " * A parte _pelo menos_ é importante quando os parâmetros estão em escopos diferentes." @@ -4580,7 +4824,7 @@ msgstr "" "* Mova a declaração de `p2` e `p3` para um novo escopo (`{ ... }`), resultando no seguinte código:\n" " ```rust, ignore\n" " #[derive(Debug)]\n" -" struct Point(i32, i32);" +" struct Ponto(i32, i32);" #: src/ownership/lifetimes-function-calls.md:36 msgid "" @@ -4588,7 +4832,7 @@ msgid "" " if p1.0 < p2.0 { p1 } else { p2 }\n" " }" msgstr "" -" fn left_most<'a>(p1: &'a Point, p2: &'a Point) -> &'a Point {\n" +" fn mais_a_esquerda<'a>(p1: &'a Ponto, p2: &'a Ponto) -> &'a Ponto {\n" " if p1.0 < p2.0 { p1 } else { p2 }\n" " }" @@ -4607,13 +4851,13 @@ msgid "" " Note how this does not compile since `p3` outlives `p2`." msgstr "" " fn main() {\n" -" let p1: Point = Point(10, 10);\n" -" let p3: &Point;\n" +" let p1: Ponto = Ponto(10, 10);\n" +" let p3: &Ponto;\n" " {\n" -" let p2: Point = Point(20, 20);\n" -" p3 = left_most(&p1, &p2);\n" +" let p2: Ponto = Ponto(20, 20);\n" +" p3 = mais_a_esquerda(&p1, &p2);\n" " }\n" -" println!(\"left-most point: {:?}\", p3);\n" +" println!(\"Ponto mais à esquerda: {:?}\", p3);\n" " }\n" " ```\n" " Observe como isso não compila, pois `p3` sobrevive a `p2`." @@ -4629,8 +4873,8 @@ msgid "" " * Which one is it? The compiler needs to to know, so at the call site the returned reference is not used\n" " for longer than a variable from where the reference came from." msgstr "" -"* Redefina o espaço de trabalho e altere a assinatura da função para `fn left_most<'a, 'b>(p1: &'a Point, p2: &'a Point) -> " -"&'b Point`. Isso não será compilado porque a relação entre os tempos de vida `'a` e `'b` não é clara.\n" +"* Redefina o espaço de trabalho e altere a assinatura da função para `fn mais_a_esquerda<'a, 'b>(p1: &'a Ponto, p2: &'a Ponto) -> " +"&'b Ponto`. Isso não será compilado porque a relação entre os tempos de vida `'a` e `'b` não é clara.\n" "* Outra forma de explicar:\n" " * Duas referências a dois valores são emprestadas por uma função e a função retorna\n" " outra referência.\n" @@ -4640,7 +4884,7 @@ msgstr "" #: src/ownership/lifetimes-data-structures.md:1 msgid "# Lifetimes in Data Structures" -msgstr "# Tempos de vida em Structs de dados" +msgstr "# Tempos de vida em estruturas de dados" #: src/ownership/lifetimes-data-structures.md:3 msgid "If a data type stores borrowed data, it must be annotated with a lifetime:" @@ -4654,7 +4898,7 @@ msgid "" msgstr "" "```rust, editable\n" "#[derive(Debug)]\n" -"struct Highlight<'doc>(&'doc str);" +"struct Destaque<'doc>(&'doc str);" #: src/ownership/lifetimes-data-structures.md:9 msgid "" @@ -4662,7 +4906,7 @@ msgid "" " println!(\"Bye {text}!\");\n" "}" msgstr "" -"fn erase(texto: String) {\n" +"fn apagar(texto: String) {\n" " println!(\"Tchau {texto}!\");\n" "}" @@ -4679,12 +4923,12 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let text = String::from(\"The quick brown fox jumps over the lazy dog.\");\n" -" let fox = Highlight(&text[4..19]);\n" -" let dog = Highlight(&text[35..43]);\n" -" // erase(texto);\n" -" println!(\"{fox:?}\");\n" -" println!(\"{dog:?}\");\n" +" let texto = String::from(\"A esperta raposa marrom pula sobre o cachorro preguiçoso.\");\n" +" let raposa = Destaque(&texto[2..23]);\n" +" let cachorro = Destaque(&texto[37..57]);\n" +" // apagar(texto);\n" +" println!(\"{raposa:?}\");\n" +" println!(\"{cachorro:?}\");\n" "}\n" "```" @@ -4701,15 +4945,15 @@ msgid "" "itself. Those are very advanced use cases.\n" "" msgstr "" -"* No exemplo acima, a anotação em `Highlight` impõe que os dados subjacentes ao `&str` contido vivam pelo menos tanto " -"quanto qualquer instância de `Highlight` que usa esses dados.\n" -"* Se `text` for consumido antes do final do tempo de vida de `fox` (ou `dog`), o verificador de empréstimo lançará um " +"* No exemplo acima, a anotação em `Destaque` impõe que os dados subjacentes ao `&str` contido vivam pelo menos tanto " +"quanto qualquer instância de `Destaque` que usa esses dados.\n" +"* Se `texto` for consumido antes do final do tempo de vida de `raposa` (ou `cachorro`), o verificador de empréstimo lançará um " "erro.\n" "* Tipos com dados emprestados forçam os usuários a manter os dados originais. Isso pode ser útil para criar exibições " -"leves, mas geralmente as torna um pouco mais difíceis de usar.\n" -"* Quando possível, faça com que as Structs de dados possuam seus dados diretamente.\n" -"* Algumas Structs com várias referências internas podem ter mais de uma anotação vitalícia. Isso pode ser necessário se " -"houver necessage de descrever relacionamentos de tempo de vida entre as próprias referências, além do tempo de vida da " +"leves, mas geralmente as tornam um pouco mais difíceis de usar.\n" +"* Quando possível, faça com que as _Structs_ de dados possuam seus dados diretamente.\n" +"* Algumas _Structs_ com várias referências internas podem ter mais de uma anotação vitalícia. Isso pode ser necessário se " +"houver necessidade de descrever relacionamentos de tempo de vida entre as próprias referências, além do tempo de vida da " "própria estrutura. Esses são casos de uso muito avançados.\n" "" @@ -4742,7 +4986,7 @@ msgid "" "We will learn much more about structs and the `Vec` type tomorrow. For now,\n" "you just need to know part of its API:" msgstr "" -"Aprenderemos muito mais sobre structs e o tipo `Vec` amanhã. Por agora,\n" +"Aprenderemos muito mais sobre structs e o tipo `Vec` amanhã. Por hora,\n" "você só precisa conhecer parte de sua API:" #: src/exercises/day-1/book-library.md:6 @@ -4760,10 +5004,10 @@ msgid "" msgstr "" "```rust, editable\n" "fn main() {\n" -" let mut vec = vec![10, 20];\n" -" vec.push(30);\n" -" println!(\"valor do meio: {}\", vec[vec.len() / 2]);\n" -" for item in vec.iter() {\n" +" let mut vetor = vec![10, 20];\n" +" vetor.push(30);\n" +" println!(\"valor do meio: {}\", vetor[vetor.len() / 2]);\n" +" for item in vetor.iter() {\n" " println!(\"item: {item}\");\n" " }\n" "}\n" @@ -4783,25 +5027,23 @@ msgid "" " books: Vec,\n" "}" msgstr "" -"struct Library {\n" -" books: Vec,\n" +"struct Biblioteca {\n" +" livros: Vec,\n" "}" #: src/exercises/day-1/book-library.md:28 src/exercises/day-1/solutions-afternoon.md:27 -#, fuzzy msgid "" "struct Book {\n" " title: String,\n" " year: u16,\n" "}" msgstr "" -"struct Book {\n" -" título: String,\n" -" year: u16,\n" +"struct Livro {\n" +" titulo: String,\n" +" ano: u16,\n" "}" #: src/exercises/day-1/book-library.md:33 src/exercises/day-1/solutions-afternoon.md:32 -#, fuzzy msgid "" "impl Book {\n" " // This is a constructor, used below.\n" @@ -4813,12 +5055,12 @@ msgid "" " }\n" "}" msgstr "" -"impl Book {\n" +"impl Livro {\n" " // Este é um construtor, usado abaixo.\n" -" fn new(title: &str, ano: u16) -> Book {\n" -" Book {\n" -" title: String::from(title),\n" -" year,\n" +" fn new(titulo: &str, ano: u16) -> Livro {\n" +" Livro {\n" +" titulo: String::from(titulo),\n" +" ano,\n" " }\n" " }\n" "}" @@ -4833,22 +5075,21 @@ msgid "" "}" msgstr "" "// Isso torna possível imprimir valores de livro com {}.\n" -"impl std::fmt::Display for Book {\n" +"impl std::fmt::Display for Livro {\n" " fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n" -" write!(f, \"{} ({})\", self.title, self.year)\n" +" write!(f, \"{} ({})\", self.titulo, self.ano)\n" " }\n" "}" #: src/exercises/day-1/book-library.md:50 -#, fuzzy msgid "" "impl Library {\n" " fn new() -> Library {\n" " unimplemented!()\n" " }" msgstr "" -"impl Library {\n" -" fn new() -> Library {\n" +"impl Biblioteca {\n" +" fn new() -> Biblioteca {\n" " unimplemented!()\n" " }" @@ -4858,7 +5099,7 @@ msgid "" " // unimplemented!()\n" " //}" msgstr "" -" //fn len(self) -> usize {\n" +" //fn tamanho(self) -> usize {\n" " // unimplemented!()\n" " //}" @@ -4868,7 +5109,7 @@ msgid "" " // unimplemented!()\n" " //}" msgstr "" -" //fn is_empty(self) -> bool {\n" +" //fn tem_livros(self) -> bool {\n" " // unimplemented!()\n" " //}" @@ -4878,7 +5119,7 @@ msgid "" " // unimplemented!()\n" " //}" msgstr "" -" //fn add_book(self, book: Book) {\n" +" //fn adiciona_livro(self, livro: Livro) {\n" " // unimplemented!()\n" " //}" @@ -4888,7 +5129,7 @@ msgid "" " // unimplemented!()\n" " //}" msgstr "" -" //fn print_books(self) {\n" +" //fn imprime_acervo(self) {\n" " // unimplemented!()\n" " //}" @@ -4899,7 +5140,7 @@ msgid "" " //}\n" "}" msgstr "" -" //fn oldest_book(self) -> Option<&Book> {\n" +" //fn livro_mais_antigo(self) -> Option<&Livro> {\n" " // unimplemented!()\n" " //}\n" "}" @@ -4914,14 +5155,13 @@ msgid "" " let library = Library::new();" msgstr "" "// Isso mostra o comportamento desejado. Descomente o código abaixo e\n" -"// implementa os métodos ausentes. Você precisará atualizar o\n" -"// assinaturas de método, incluindo o parâmetro \"self\"! Você pode\n" -"// também precisa atualizar as ligações de variáveis dentro de main.\n" +"// implemente os métodos ausentes. Você precisará atualizar as\n" +"// assinaturas de método, incluindo o parâmetro \"self\"! Você poderá\n" +"// também precisar atualizar as ligações de variáveis dentro de main.\n" "fn main() {\n" -" let library = Library::new();" +" let biblioteca = Biblioteca::new();" #: src/exercises/day-1/book-library.md:83 -#, fuzzy msgid "" " //println!(\"Our library is empty: {}\", library.is_empty());\n" " //\n" @@ -4939,27 +5179,31 @@ msgid "" "}\n" "```" msgstr "" -" //println!(\"Nossa biblioteca está vazia: {}\", library.is_empty());\n" -" //\n" -" //library.add_book(Book::new(\"Lord of the Rings\", 1954));\n" -" //library.add_book(Book::new(\"Alice's Adventures in Wonderland\", 1865));\n" -" //\n" -" //library.print_books();\n" -" //\n" -" //corresponde à library.oldest_book() {\n" -" // Some(book) => println!(\"Meu livro mais antigo é {book}\"),\n" -" // None => println!(\"Minha biblioteca está vazia!\"),\n" -" //}\n" -" //\n" -" //println!(\"Nossa biblioteca tem {} livros\", library.len());\n" +" // println!(\"Nossa biblioteca está vazia: {}\", biblioteca.tem_livros());\n" +" // \n" +" // biblioteca.adiciona_livro(Livro::new(\"Lord of the Rings\", 1954));\n" +" // biblioteca.adiciona_livro(Livro::new(\"Alice's Adventures in Wonderland\", 1865));\n" +" // \n" +" // biblioteca.imprime_acervo();\n" +" // \n" +" // match biblioteca.livro_mais_antigo() {\n" +" // Some(livro) => println!(\"Meu livro mais antigo é {livro}\"),\n" +" // None => println!(\"Minha biblioteca está vazia!\"),\n" +" // }\n" +" // \n" +" // println!(\"Nossa biblioteca tem {} livros\", biblioteca.tamanho());\n" "}\n" "```" #: src/exercises/day-1/book-library.md:99 msgid "" +"
\n" +" \n" "[Solution](solutions-afternoon.md#designing-a-library)" msgstr "" -"[Solution](solutions-afternoon.md#designing-a-library)" +"
\n" +" \n" +"[Soluções](solutions-afternoon.md#designing-a-library)" #: src/exercises/day-1/iterators-and-ownership.md:1 msgid "# Iterators and Ownership" @@ -4972,22 +5216,21 @@ msgid "" "[`IntoIterator`](https://doc.rust-lang.org/std/iter/trait.IntoIterator.html)\n" "traits." msgstr "" -"O modelo de ownership do Rust afeta muitas APIs. Um exemplo disso é o\n" +"O modelo de _ownership_ do Rust afeta muitas APIs. Um exemplo disso são os _traits_\n" "[`Iterator`](https://doc.rust-lang.org/std/iter/trait.Iterator.html) e\n" -"[`IntoIterator`](https://doc.rust-lang.org/std/iter/trait.IntoIterator.html)\n" -"características." +"[`IntoIterator`](https://doc.rust-lang.org/std/iter/trait.IntoIterator.html)." #: src/exercises/day-1/iterators-and-ownership.md:8 msgid "## `Iterator`" -msgstr "## `Iterador`" +msgstr "## `Iterator` (iterador)" #: src/exercises/day-1/iterators-and-ownership.md:10 msgid "" "Traits are like interfaces: they describe behavior (methods) for a type. The\n" "`Iterator` trait simply says that you can call `next` until you get `None` back:" msgstr "" -"Os traits são como interfaces: eles descrevem o comportamento (métodos) para um tipo. o\n" -"O trait `Iterator` simplesmente diz que você pode chamar `next` até obter `None` de volta:" +"Os _traits_ são como interfaces: eles descrevem o comportamento (métodos) para um tipo. o\n" +"O _trait_ `Iterator` simplesmente diz que você pode chamar `next` até obter `None` como retorno:" #: src/exercises/day-1/iterators-and-ownership.md:13 msgid "" @@ -5078,7 +5321,7 @@ msgid "" "The `Iterator` trait tells you how to _iterate_ once you have created an\n" "iterator. The related trait `IntoIterator` tells you how to create the iterator:" msgstr "" -"O trait `Iterator` informa como _iterar_ depois de criar um\n" +"O _trait_ `Iterator` informa como _iterar_ depois de criar um\n" "iterador. A característica relacionada `IntoIterator` informa como criar o iterador:" #: src/exercises/day-1/iterators-and-ownership.md:53 @@ -5145,7 +5388,7 @@ msgstr "" #: src/exercises/day-1/iterators-and-ownership.md:83 msgid "## `for` Loops" -msgstr "## `for` Loops" +msgstr "## Laços `for`" #: src/exercises/day-1/iterators-and-ownership.md:85 msgid "" @@ -5153,7 +5396,7 @@ msgid "" "They call `into_iter()` on an expression and iterates over the resulting\n" "iterator:" msgstr "" -"Agora que conhecemos `Iterator` e `IntoIterator`, podemos construir loops `for`.\n" +"Agora que conhecemos `Iterator` e `IntoIterator`, podemos construir laços `for`.\n" "Eles chamam `into_iter()` em uma expressão e itera sobre o resultado\n" "iterador:" @@ -5173,8 +5416,8 @@ msgid "" " println!(\"word: {word}\");\n" " }" msgstr "" -" for word in &v {\n" -" println!(\"word: {word}\");\n" +" for palavra in &v {\n" +" println!(\"Palavra: {palavra}\");\n" " }" #: src/exercises/day-1/iterators-and-ownership.md:97 @@ -5185,15 +5428,15 @@ msgid "" "}\n" "```" msgstr "" -" for word in v {\n" -" println!(\"word: {word}\");\n" +" for palavra in v {\n" +" println!(\"Palavra: {palavra}\");\n" " }\n" "}\n" "```" #: src/exercises/day-1/iterators-and-ownership.md:103 msgid "What is the type of `word` in each loop?" -msgstr "Qual é o tipo de `palavra` em cada loop?" +msgstr "Qual é o tipo de `palavra` em cada laço?" #: src/exercises/day-1/iterators-and-ownership.md:105 msgid "" @@ -5213,19 +5456,19 @@ msgstr "" #: src/welcome-day-2.md:1 msgid "# Welcome to Day 2" -msgstr "# Bem-vindo ao Dia 2" +msgstr "# Bem-vindo ao dia 2" #: src/welcome-day-2.md:3 msgid "Now that we have seen a fair amount of Rust, we will continue with:" -msgstr "Agora que vimos uma boa quantage de Rust, continuaremos com:" +msgstr "Agora que vimos uma boa quantidade de Rust, continuaremos com:" #: src/welcome-day-2.md:5 msgid "* Structs, enums, methods." -msgstr "* Structs, enums, métodos." +msgstr "* Estruturas (`structs`), enumerações (`enums`) e métodos." #: src/welcome-day-2.md:7 msgid "* Pattern matching: destructuring enums, structs, and arrays." -msgstr "* Correspondência de padrões: desestruturando enums, structs e arrays." +msgstr "* Correspondência de padrões: desestruturando enumerações, estruturas e vetores." #: src/welcome-day-2.md:9 msgid "" @@ -5245,15 +5488,15 @@ msgstr "" #: src/welcome-day-2.md:15 msgid "* Modules: visibility, paths, and filesystem hierarchy." -msgstr "* Módulos: visibilage, caminhos e hierarquia do sistema de arquivos." +msgstr "* Módulos: visibilidade, caminhos e hierarquia do sistema de arquivos." #: src/structs.md:1 msgid "# Structs" -msgstr "# Structs" +msgstr "# Estruturas (Structs)" #: src/structs.md:3 msgid "Like C and C++, Rust has support for custom structs:" -msgstr "Como C e C++, Rust tem suporte para structs personalizados:" +msgstr "Como C e C++, Rust tem suporte para `structs` personalizadas:" #: src/structs.md:5 msgid "" @@ -5264,9 +5507,9 @@ msgid "" "}" msgstr "" "```rust, editable\n" -"struct Person {\n" -" name: String,\n" -" age: u8,\n" +"struct Pessoa {\n" +" nome: String,\n" +" idade: u8,\n" "}" #: src/structs.md:11 @@ -5290,28 +5533,30 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let mut pedro = Person {\n" -" name: String::from(\"Pedro\"),\n" -" age: 27,\n" +" let mut pedro = Pessoa {\n" +" nome: String::from(\"Pedro\"),\n" +" idade: 27,\n" " };\n" -" println!(\"{} is {} years old\", pedro.name, pedro.age);\n" +" println!(\"{} tem {} anos.\", pedro.nome, pedro.idade);\n" " \n" -" pedro.age = 28;\n" -" println!(\"{} is {} years old\", pedro.name, pedro.age);\n" +" pedro.idade= 28;\n" +" println!(\"{} tem {} anos.\", pedro.nome, pedro.idade);\n" " \n" -" let jackie = Person {\n" -" name: String::from(\"Jackie\"),\n" +" let jackie = Pessoa {\n" +" nome: String::from(\"Jackie\"),\n" " ..pedro\n" " };\n" -" println!(\"{} is {} years old\", jackie.name, jackie.age);\n" +" println!(\"{} tem {} anos.\", jackie.nome, jackie.idade);\n" "}\n" "```" #: src/structs.md:29 msgid "" +"
\n" "Key Points: " msgstr "" -"Points chave:" +"
\n" +"Pontos chave:" #: src/structs.md:32 msgid "" @@ -5325,23 +5570,26 @@ msgid "" " * The next slide will introduce Tuple structs, used when the field names are not important.\n" "* The syntax `..peter` allows us to copy the majority of the fields from the old struct without having to explicitly type " "it all out. It must always be the last element." + msgstr "" "* Structs funcionam como em C ou C++.\n" " * Como em C++, e ao contrário de C, nenhum typedef é necessário para definir um tipo.\n" " * Ao contrário do C++, não há herança entre structs.\n" "* Os métodos são definidos em um bloco `impl`, que veremos nos próximos slides.\n" -"* Este pode ser um bom momento para que as Persons saibam que existem diferentes tipos de structs.\n" -" * Structs de tamanho zero `por exemplo, struct Foo;` podem ser usadas ao implementar uma característica em algum tipo, " -"mas não possuem nenhum dado que você deseja armazenar no próprio valor.\n" -" * O próximo slide apresentará as Structs Tuple." +"* Este pode ser um bom momento para que as pessoas saibam que existem diferentes tipos de structs.\n" +" * _Structs_ de tamanho zero `por exemplo, struct Foo;` podem ser usadas ao implementar uma característica em algum tipo,\n" +"mas não possuem nenhum dado que você deseja armazenar nelas.\n" +" * O próximo slide apresentará as estruturas tuplas (_Tuple Structs_) usadas quando o nome dos campos não são importantes.\n" +"* A sintaxe `..pedro` permite a cópia da maioria do campos de uma _struct_ sem precisar explicitar seus tipos.\n" +" Ele precisa ser o último elemento." #: src/structs/tuple-structs.md:1 msgid "# Tuple Structs" -msgstr "# Structs Tuplas" +msgstr "# Estruturas Tupla (Tuple Structs)" #: src/structs/tuple-structs.md:3 msgid "If the field names are unimportant, you can use a tuple struct:" -msgstr "Se os names dos campos não forem importantes, você pode usar uma estrutura de tupla:" +msgstr "Se os nomes dos campos não forem importantes, você pode usar uma estrutura de tupla:" #: src/structs/tuple-structs.md:5 msgid "" @@ -5349,7 +5597,7 @@ msgid "" "struct Point(i32, i32);" msgstr "" "```rust, editable\n" -"struct Point(i32, i32);" +"struct Ponto(i32, i32);" #: src/structs/tuple-structs.md:8 msgid "" @@ -5360,7 +5608,7 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let p = Point(17, 23);\n" +" let p = Ponto(17, 23);\n" " println!(\"({}, {})\", p.0, p.1);\n" "}\n" "```" @@ -5408,7 +5656,7 @@ msgid "" msgstr "" "fn main() {\n" " let force = compute_thruster_force();\n" -" ift_thruster_force(force);\n" +" set_thruster_force(force);\n" "}" #: src/structs/tuple-structs.md:33 src/traits/default.md:36 src/generics/trait-objects.md:86 @@ -5418,17 +5666,18 @@ msgstr "```" #: src/structs/tuple-structs.md:37 msgid "" "Newtypes are a great way to encode additional information about the value in a primitive type, for example:\n" -msgstr "" -"Newtypes são uma ótima maneira de codificar informações adicionais sobre o valor em um tipo primitivo, por exemplo:\n" - -msgid "" " * The number is measured in some units: `Newtons` in the example above.\n" " * The value passed some validation when it was created, so you no longer have to validate it again at every use: " -"'PhoneNumber(String)` or `OddNumber(u32)`.\n" +" `PhoneNumber(String)` or `OddNumber(u32)`.\n" +" \n" +"
" msgstr "" -" * O número é medido em algumas unages: `Newtons` no exemplo acima.\n" +"Newtypes são uma ótima maneira de codificar informações adicionais sobre o valor em um tipo primitivo, por exemplo:\n" +" * O número é medido em algumas unidades: `Newtons` no exemplo acima.\n" " * O valor passou por alguma validação quando foi criado, então você não precisa mais validá-lo novamente a cada uso: " -"'PhoneNumber(String)` ou `OddNumber(u32)`.\n" +" `PhoneNumber(String)` ou `OddNumber(u32)`.\n" +" \n" +"
" #: src/structs/field-shorthand.md:1 msgid "# Field Shorthand Syntax" @@ -5439,7 +5688,7 @@ msgid "" "If you already have variables with the right names, then you can create the\n" "struct using a shorthand:" msgstr "" -"Se você já tiver variáveis com os names corretos, poderá criar o\n" +"Se você já tiver variáveis com os nomes corretos, poderá criar o\n" "struct usando uma abreviação:" #: src/structs/field-shorthand.md:6 src/methods.md:6 @@ -5453,9 +5702,9 @@ msgid "" msgstr "" "```rust, editable\n" "#[derive(Debug)]\n" -"struct Person {\n" -" name: String,\n" -" age: u8,\n" +"struct Pessoa {\n" +" nome: String,\n" +" idade: u8,\n" "}" #: src/structs/field-shorthand.md:13 @@ -5466,9 +5715,9 @@ msgid "" " }\n" "}" msgstr "" -"impl Person {\n" -" fn new(name: String, age: u8) -> Person {\n" -" Person { name, age }\n" +"impl Pessoa {\n" +" fn new(nome: String, idade: u8) -> Pessoa {\n" +" Pessoa { nome, idade }\n" " }\n" "}" @@ -5481,14 +5730,14 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let peter = Person::new(String::from(\"Peter\"), 27);\n" -" println!(\"{peter:?}\");\n" +" let pedro = Pessoa::new(String::from(\"Pedro\"), 27);\n" +" println!(\"{pedro:?}\");\n" "}\n" "```" #: src/structs/field-shorthand.md:27 msgid "The `new` function could be written using `Self` as a type, as it is interchangeable with the struct type name" -msgstr "A função `new` pode ser escrita usando `Self` como um tipo, já que é intercambiável com o name do tipo struct" +msgstr "A função `new` pode ser escrita usando `Self` como um tipo, já que é intercambiável com o name do tipo _struct_" #: src/structs/field-shorthand.md:29 msgid "" @@ -5503,9 +5752,9 @@ msgid "" "
" msgstr "" "```rust, ignore\n" -"impl Person {\n" -" fn new(name: String, age: u8) -> Self {\n" -" Self { name, age }\n" +"impl Pessoa {\n" +" fn new(nome: String, idade: u8) -> Self {\n" +" Self { nome, idade }\n" " }\n" "}\n" "```\n" @@ -5514,15 +5763,15 @@ msgstr "" #: src/enums.md:1 msgid "# Enums" -msgstr "# Enums" +msgstr "# Enumerações (Enums)" #: src/enums.md:3 msgid "" "The `enum` keyword allows the creation of a type which has a few\n" "different variants:" msgstr "" -"A palavra-chave `enum` permite a criação de um tipo que possui alguns\n" -"diferentes variantes:" +"A palavra-chave `enum` permite a criação de um tipo que possui algumas\n" +"variações diferentes:" #: src/enums.md:6 msgid "" @@ -5532,7 +5781,7 @@ msgid "" "}" msgstr "" "```rust, editable\n" -"fn generate_random_number() -> i32 {\n" +"fn gerador_numero_aleatorio() -> i32 {\n" " 4 // Escolhido por jogada de dados justa. Garantido para ser aleatório.\n" "}" @@ -5545,9 +5794,9 @@ msgid "" "}" msgstr "" "#[derive(Debug)]\n" -"enum CoinFlip {\n" -" Heads,\n" -" Tails,\n" +"enum CaraCoroa {\n" +" Cara,\n" +" Coroa,\n" "}" #: src/enums.md:17 @@ -5561,12 +5810,12 @@ msgid "" " }\n" "}" msgstr "" -"fn flip_coin() -> CoinFlip {\n" -" let random_number = generate_random_number();\n" -" if random_number % 2 == 0 {\n" -" return CoinFlip::Heads;\n" +"fn jogar_moeda() -> CaraCoroa {\n" +" let numero_aleatorio = gerador_numero_aleatorio();\n" +" if numero_aleatorio % 2 == 0 {\n" +" return CaraCoroa::Cara;\n" " } else {\n" -" return CoinFlip::Tails;\n" +" return CaraCoroa::Coroa;\n" " }\n" "}" @@ -5578,15 +5827,19 @@ msgid "" "```" msgstr "" "fn main() {\n" -" println!(\"You got: {:?}\", flip_coin());\n" +" println!(\"Você tem: {:?}\", jogar_moeda());\n" "}\n" "```" #: src/enums.md:31 msgid "" +"
\n" +" \n" "Key Points:" msgstr "" -"Points chave:" +"
\n" +" \n" +"Pontos chave:" #: src/enums.md:35 msgid "" @@ -5614,14 +5867,14 @@ msgstr "" #: src/enums/variant-payloads.md:1 msgid "# Variant Payloads" -msgstr "# cargos úteis variantes" +msgstr "# Variantes de carga útil (payloads)" #: src/enums/variant-payloads.md:3 msgid "" "You can define richer enums where the variants carry data. You can then use the\n" "`match` statement to extract the data from each variant:" msgstr "" -"Você pode definir enums mais ricos onde as variantes carregam dados. Você pode então usar o\n" +"Você pode definir enums mais ricos onde as variantes carregam dados. Você pode então usar a\n" "instrução `match` para extrair os dados de cada variante:" #: src/enums/variant-payloads.md:6 @@ -5651,7 +5904,7 @@ msgid "" " }\n" "}" msgstr "" -"#[rustfmt::pular]\n" +"#[rustfmt::skip]\n" "fn inspect(event: WebEvent) {\n" " match event{\n" " WebEvent::PageLoad => println!(\"página carregada\"),\n" @@ -5697,8 +5950,10 @@ msgid "" "* `WebEvent::Click { ... }` is not exactly the same as `WebEvent::Click(Click)` with a top level `struct Click { ... }`. " "The inlined version cannot implement traits, for example." msgstr "" -"* No exemplo acima, acessar o `char` em `KeyPress`, ou `x` e `y` em `Click` só funciona dentro de uma instrução `match`.\n" +"* No exemplo acima, acessar o `char` em `KeyPress`, ou `x` e `y` em `Click` só funciona dentro de uma instrução `match`\n" +" ou em uma expressão `if let`.\n" "* `match` inspeciona um campo discriminante oculto no `enum`.\n" +"* É possível recuperar o campo discriminante chamando `std::mem::discriminant()`.\n" "* `WebEvent::Click { ... }` não é exatamente o mesmo que `WebEvent::Click(Click)` com um `struct Click { ... }` de nível " "superior. A versão embutida não pode implementar traits, por exemplo." @@ -5708,7 +5963,7 @@ msgstr "# Tamanhos de Enum" #: src/enums/sizes.md:3 msgid "Rust enums are packed tightly, taking constraints due to alignment into account:" -msgstr "Rust enums são empacotados firmemente, levando em consideração as restrições devido ao alinhamento:" +msgstr "Enums, em Rust, são empacotados firmemente, levando em consideração as restrições devido ao alinhamento:" #: src/enums/sizes.md:5 msgid "" @@ -5725,6 +5980,12 @@ msgid "" " };\n" "}" msgstr "" +"macro_rules! dbg_size {\n" +" ($t:ty) => {\n" +" println!(\"{}: tamano: {} byte(s), alinhamento: {} byte(s)\",\n" +" stringify!($t), size_of::<$t>(), align_of::<$t>());\n" +" };\n" +"}" #: src/enums/sizes.md:15 msgid "" @@ -5763,10 +6024,13 @@ msgstr "" #: src/enums/sizes.md:37 msgid "* See the [Rust Reference](https://doc.rust-lang.org/reference/type-layout.html)." -msgstr "* Consulte a [Referência Rust](https://doc.rust-lang.org/reference/type-layout.html)." +msgstr "* Consulte a [Referência do Rust](https://doc.rust-lang.org/reference/type-layout.html)." #: src/enums/sizes.md:39 msgid "" +"
\n" +" \n" +"Key Points: \n" " * Internally Rust is using a field (discriminant) to keep track of the enum variant.\n" " * `Bar` enum demonstrates that there is a way to control the discriminant value and type. If `repr` is removed, the " "discriminant type takes 2 bytes, becuase 10001 fits 2 bytes.\n" @@ -5777,13 +6041,16 @@ msgid "" "`size_of::>()`.\n" " * Zero-sized types allow for efficient implementation of `HashSet` using `HashMap` with `()` as the value." msgstr "" -" * Internamente Rust está usando um campo (discriminante) para acompanhar a variante enum.\n" +"
\n" +" \n" +"Pontos chave:\n" +" * Internamente Rust está usando um campo (discriminante) para acompanhar a variante da enum.\n" " * A Enum `Bar` demonstra que existe uma maneira de controlar o valor e o tipo discriminante. Se `repr` for removido, o " "tipo discriminante ocupa 2 bytes, porque 10001 cabe 2 bytes.\n" " * Como uma otimização de nicho, um discriminante de Enum é mesclado com o ponteiro para que `Option<&Foo>` seja do mesmo " "tamanho que `&Foo`.\n" " * `Option` é outro exemplo de empacotamento compacto.\n" -" * Para [alguns tipos](https://doc.rust-lang.org/std/option/#representation), Rust garante que `size_of::()` é igual a " +" * Para [alguns tipos](https://doc.rust-lang.org/std/option/#representation), Rust garante que o `size_of::()` é igual a " "`size_of:: >()`.\n" " * Tipos de tamanho zero permitem a implementação eficiente de `HashSet` usando `HashMap` com `()` como valor." @@ -5792,7 +6059,9 @@ msgid "" "Example code if you want to show how the bitwise representation *may* look like in practice.\n" "It's important to note that the compiler provides no guarantees regarding this representation, therefore this is totally " "unsafe." -msgstr "" +msgstr "Código de exemplo se você quiser mostrar como a representação bit a bit *pode* parecer na prática.\n" +" É importante observar que o compilador não oferece garantias quanto a essa representação, portanto, isso é totalmente " +"inseguro." #: src/enums/sizes.md:52 msgid "" @@ -5819,6 +6088,13 @@ msgid "" " dbg_bits!(false, u8);\n" " dbg_bits!(true, u8);" msgstr "" +"fn main() {\n" +" // TOTALMENTE INSEGURO. Rust não oferece nenhuma garantia sobre a\n" +" // representação bit a bit de tipos.\n" +" unsafe {\n" +" println!(\"Representação bit a bit do tipo bool\");\n" +" dbg_bits!(false, u8);\n" +" dbg_bits!(true, u8);" #: src/enums/sizes.md:69 msgid "" @@ -5827,6 +6103,10 @@ msgid "" " dbg_bits!(Some(false), u8);\n" " dbg_bits!(Some(true), u8);" msgstr "" +" println!(\"Representação bit a bit do tipo Option\");\n" +" dbg_bits!(None::, u8);\n" +" dbg_bits!(Some(false), u8);\n" +" dbg_bits!(Some(true), u8);" #: src/enums/sizes.md:74 msgid "" @@ -5836,6 +6116,11 @@ msgid "" " dbg_bits!(Some(None::), u8);\n" " dbg_bits!(None::>, u8);" msgstr "" +" println!(\"Representação bit a bit do tipo Option>\");\n" +" dbg_bits!(Some(Some(false)), u8);\n" +" dbg_bits!(Some(Some(true)), u8);\n" +" dbg_bits!(Some(None::), u8);\n" +" dbg_bits!(None::>, u8);" #: src/enums/sizes.md:80 msgid "" @@ -5846,10 +6131,16 @@ msgid "" "}\n" "```" msgstr "" +" println!(\"Representação bit a bit do tipo Option<&i32>\");\n" +" dbg_bits!(None::<&i32>, usize);\n" +" dbg_bits!(Some(&0i32), usize);\n" +" }\n" +"}\n" +"```" #: src/enums/sizes.md:87 msgid "More complex example if you want to discuss what happens when we chain more than 256 `Option`s together." -msgstr "" +msgstr "Exemplo mais complexo se você quiser discutir o que acontece quando encadeamos mais de 256 `Option` juntas." #: src/enums/sizes.md:89 msgid "" @@ -5877,6 +6168,17 @@ msgid "" " };\n" "}" msgstr "" +"// Macro para envolver um valor com Some() 2^n vezes onde n é o número de simbolos \"@\"\n" +"// É necessário aumentar o limite de recursão para utilizar essa macro.\n" +"macro_rules! many_options {\n" +" ($value:expr) => { Some($value) };\n" +" ($value:expr, @) => {\n" +" Some(Some($value))\n" +" };\n" +" ($value:expr, @ $($more:tt)+) => {\n" +" many_options!(many_options!($value, $($more)+), $($more)+)\n" +" };\n" +"}" #: src/enums/sizes.md:112 msgid "" @@ -5888,6 +6190,13 @@ msgid "" " assert_eq!(many_options!(false, @), Some(Some(false)));\n" " assert_eq!(many_options!(false, @@), Some(Some(Some(Some(false)))));" msgstr "" +"fn main() {\n" +" // TOTALMENTE INSEGURO. Rust não oferece nenhuma garantia sobre a\n" +" // representação bit a bit de tipos.\n" +" unsafe {\n" +" assert_eq!(many_options!(false), Some(false));\n" +" assert_eq!(many_options!(false, @), Some(Some(false)));\n" +" assert_eq!(many_options!(false, @@), Some(Some(Some(Some(false)))));" #: src/enums/sizes.md:120 msgid "" @@ -5895,6 +6204,9 @@ msgid "" " dbg_bits!(many_options!(false, @@@@@@@), u8);\n" " dbg_bits!(many_options!(true, @@@@@@@), u8);" msgstr "" +" println!(\"Representação bit a bit de uma cadeia de 128 Option's.\");\n" +" dbg_bits!(many_options!(false, @@@@@@@), u8);\n" +" dbg_bits!(many_options!(true, @@@@@@@), u8);" #: src/enums/sizes.md:124 msgid "" @@ -5902,6 +6214,9 @@ msgid "" " dbg_bits!(many_options!(false, @@@@@@@@), u16);\n" " dbg_bits!(many_options!(true, @@@@@@@@), u16);" msgstr "" +" println!(\"Representação bit a bit de uma cadeia de 256 Option's.\");\n" +" dbg_bits!(many_options!(false, @@@@@@@@), u16);\n" +" dbg_bits!(many_options!(true, @@@@@@@@), u16);" #: src/enums/sizes.md:128 msgid "" @@ -5913,6 +6228,13 @@ msgid "" "}\n" "```" msgstr "" +" println!(\"Representação bit a bit de uma cadeia de 257 Option's.\");\n" +" dbg_bits!(many_options!(Some(false), @@@@@@@@), u16);\n" +" dbg_bits!(many_options!(Some(true), @@@@@@@@), u16);\n" +" dbg_bits!(many_options!(None::, @@@@@@@@), u16);\n" +" }\n" +"}\n" +"```" #: src/methods.md:3 msgid "" @@ -5930,9 +6252,9 @@ msgid "" " }\n" "}" msgstr "" -"impl Person {\n" -" fn say_hello(&self) {\n" -" println!(\"Olá, meu name é {}\", self.name);\n" +"impl Pessoa {\n" +" fn diz_ola(&self) {\n" +" println!(\"Olá, meu nome é {}\", self.nome);\n" " }\n" "}" @@ -5948,16 +6270,17 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let peter = Person {\n" -" name: String::from(\"Peter\"),\n" -" age: 27,\n" +" let pedro = Pessoa {\n" +" nome: String::from(\"Pedro\"),\n" +" idade: 27,\n" " };\n" -" peter.say_hello();\n" +" pedro.diz_ola();\n" "}\n" "```" #: src/methods.md:30 msgid "" +"Key Points:\n" "* It can be helpful to introduce methods by comparing them to functions.\n" " * Methods are called on an instance of a type (such as a struct or enum), the first parameter represents the instance as " "`self`.\n" @@ -5973,34 +6296,35 @@ msgid "" " \n" "
" msgstr "" +"Pontos chave:\n" "* Pode ser útil introduzir métodos comparando-os com funções.\n" " * Métodos são chamados em uma instância de um tipo (como struct ou enum), o primeiro parâmetro representa a instância " "como `self`.\n" " * Os desenvolvedores podem optar por usar métodos para aproveitar a sintaxe do receptor do método e ajudar a mantê-los " "mais organizados. Usando métodos, podemos manter todo o código de implementação em um local previsível.\n" -"* Highlight o uso da palavra-chave `self`, um receptor de método.\n" -" * Mostre que é um termo abreviado para `self:&Self` e talvez mostre como o name struct também poderia ser usado.\n" -" * Explique que Self é um alias de tipo para o tipo em que o bloco `impl` está e pode ser usado em qualquer outro lugar no " +"* Destaque o uso da palavra-chave `self`, um receptor de método.\n" +" * Mostre que é um termo abreviado para `self:&Self` e talvez mostre como o nome da struct também poderia ser usado.\n" +" * Explique que `Self` é um apelido de tipo para o tipo em que o bloco `impl` está e pode ser usado em qualquer outro lugar no " "bloco.\n" -" * Observe como self é usado como outras Structs e a notação de Point pode ser usada para se referir a campos " +" * Observe como _self_ é usado com outras _Structs_ e a notação de _ponto_ pode ser usada para se referir a campos " "individuais.\n" " * Este pode ser um bom momento para demonstrar como `&self` difere de `self` modificando o código e tentando executar " -"say_hello duas vezes.\n" -"* Descrevemos a distinção entre os receptores de método a seguir.\n" +"`diz_ola` duas vezes.\n" +"* Descreveremos a distinção entre os receptores de método a seguir.\n" " \n" "
" #: src/methods/receiver.md:1 msgid "# Method Receiver" -msgstr "# Método Receptor" +msgstr "# Receptores de métodos" #: src/methods/receiver.md:3 msgid "" "The `&self` above indicates that the method borrows the object immutably. There\n" "are other possible receivers for a method:" msgstr "" -"O `&self` acima indica que o método toma emprestado o objeto imutavelmente. Lá\n" -"são outros receptores possíveis para um método:" +"O `&self` acima indica que o método toma emprestado o objeto imutavelmente. Abaixo há\n" +"outros receptores possíveis para um método:" #: src/methods/receiver.md:6 msgid "" @@ -6017,18 +6341,18 @@ msgid "" "* No receiver: this becomes a static method on the struct. Typically used to\n" " create constructors which are called `new` by convention." msgstr "" -"* `&self`: pega emprestado o objeto do chamador usando um compartilhado e imutável\n" -" referência. O objeto pode ser usado novamente depois.\n" -"* `&mut self`: pega emprestado o objeto do chamador usando um único e mutável\n" -" referência. O objeto pode ser usado novamente depois.\n" -"* `self`: toma posse do objeto e o afasta do chamador. o\n" +"* `&self`: pega emprestado o objeto do chamador como uma referência compartilhada\n" +" e mutável. O objeto pode ser usado novamente depois.\n" +"* `&mut self`: pega emprestado o objeto do chamador como uma referência única\n" +" e mutável. O objeto pode ser usado novamente depois.\n" +"* `self`: toma posse do objeto e o afasta do chamador.\n" " O método se torna o proprietário do objeto. O objeto será descartado (desalocado)\n" " quando o método retorna, a menos que sua ownership seja explicitamente\n" -" transmitido.\n" +" transmitida.\n" "* `mut self`: o mesmo que acima, mas enquanto o método possui o objeto, ele pode\n" -" transformá-lo também. A ownership completa não significa automaticamente mutabilage.\n" +" alterá-lo também. A ownership completa não significa automaticamente mutabilidade.\n" "* Sem receptor: isso se torna um método static na estrutura. Normalmente usado para\n" -" crie construtores que são chamados `new` por convenção." +" criar construtores que, por convenção, são chamados `new`." #: src/methods/receiver.md:19 msgid "" @@ -6038,19 +6362,23 @@ msgid "" msgstr "" "Além das variantes de `self`, também existem\n" "[tipos especiais de wrapper](https://doc.rust-lang.org/reference/special-types-and-traits.html)\n" -"podem ser tipos de receptores, como `Box`." +"que podem ser tipos de receptores, como `Box`." #: src/methods/receiver.md:23 msgid "" +"
\n" +" \n" "Consider emphasizing on \"shared and immutable\" and \"unique and mutable\". These constraints always come\n" "together in Rust due to borrow checker rules, and `self` is no exception. It won't be possible to\n" "reference a struct from multiple locations and call a mutating (`&mut self`) method on it.\n" " \n" "
" msgstr "" +"
\n" +" \n" "Considere enfatizar \"compartilhado e imutável\" e \"único e mutável\". Essas restrições sempre vêm\n" -"juntos no Rust devido às regras do verificador emprestado, e `self` não é exceção. Não será possível\n" -"referenciar um struct de vários locais e chamar um método mutante (`&mut self`) nele.\n" +"juntos no Rust devido às regras do verificador de empréstimo, e `self` não é uma exceção. Não será possível\n" +"referenciar um struct de vários locais e chamar um método mutável (`&mut self`) nele.\n" " \n" "
" @@ -6059,7 +6387,6 @@ msgid "# Example" msgstr "# Exemplo" #: src/methods/example.md:3 -#, fuzzy msgid "" "```rust,editable\n" "#[derive(Debug)]\n" @@ -6070,8 +6397,8 @@ msgid "" msgstr "" "```rust, editable\n" "#[derive(Debug)]\n" -"struct Raça {\n" -" name: String,\n" +"struct Corrida {\n" +" nome: String,\n" " voltas: Vec,\n" "}" @@ -6082,20 +6409,22 @@ msgid "" " Race { name: String::from(name), laps: Vec::new() }\n" " }" msgstr "" +"impl Corrida {\n" +" fn new(nome: &str) -> Corrida { // Um método estático, sem a definição de um receptor.\n" +" Corrida { nome: String::from(nome), voltas: Vec::new() }\n" +" }" #: src/methods/example.md:15 -#, fuzzy msgid "" " fn add_lap(&mut self, lap: i32) { // Exclusive borrowed read-write access to self\n" " self.laps.push(lap);\n" " }" msgstr "" -" fn add_lap(&mut self, lap: i32) { // Acesso de leitura e gravação emprestado exclusivo para self\n" -" self.laps.push(volta);\n" +" fn adiciona_volta(&mut self, volta: i32) { // Acesso emprestado de leitura e gravação exclusivo para self\n" +" self.voltas.push(volta);\n" " }" #: src/methods/example.md:19 -#, fuzzy msgid "" " fn print_laps(&self) { // Shared and read-only borrowed access to self\n" " println!(\"Recorded {} laps for {}:\", self.laps.len(), self.name);\n" @@ -6104,10 +6433,10 @@ msgid "" " }\n" " }" msgstr "" -" fn print_laps(&self) { // Acesso emprestado compartilhado e somente leitura a si mesmo\n" -" println!(\"Gravadas {} voltas para {}:\", self.laps.len(), self.name);\n" -" for (idx, lap) in self.laps.iter().enumerate() {\n" -" println!(\"Volta {idx}: {volta} seg\");\n" +" fn imprime_voltas(&self) { // Acesso emprestado compartilhado e somente leitura para self\n" +" println!(\"Gravadas {} voltas para {}:\", self.voltas.len(), self.nome);\n" +" for (idx, volta) in self.voltas.iter().enumerate() {\n" +" println!(\"Volta {idx}: {volta} seg.\");\n" " }\n" " }" @@ -6119,14 +6448,13 @@ msgid "" " }\n" "}" msgstr "" -" fn finish(self) { // ownership exclusiva de self\n" -" let total = self.laps.iter().sum::();\n" -" println!(\"A corrida {} terminou, tempo total da volta: {}\", self.name, total);\n" +" fn finaliza(self) { // ownership exclusiva de self\n" +" let total = self.voltas.iter().sum::();\n" +" println!(\"A corrida {} terminou, tempo total da volta: {}\", self.nome, total);\n" " }\n" "}" #: src/methods/example.md:32 -#, fuzzy msgid "" "fn main() {\n" " let mut race = Race::new(\"Monaco Grand Prix\");\n" @@ -6141,19 +6469,22 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let mut race = Race::new(\"Grande Prêmio de Mônaco\");\n" -" corrida.add_lap(70);\n" -" corrida.add_lap(68);\n" -" corrida.print_laps();\n" -" corrida.add_lap(71);\n" -" corrida.print_laps();\n" -" race.finish();\n" -" // corrida.add_lap(42);\n" +" let mut corrida = Corrida::new(\"Grande Prêmio de Mônaco\");\n" +" corrida.adiciona_volta(70);\n" +" corrida.adiciona_volta(68);\n" +" corrida.imprime_voltas();\n" +" corrida.adiciona_volta(71);\n" +" corrida.imprime_voltas();\n" +" corrida.finaliza();\n" +" // corrida.adiciona_volta(42);\n" "}\n" "```" #: src/methods/example.md:44 msgid "" +"
\n" +" \n" +"Key Points:\n" "* All four methods here use a different method receiver.\n" " * You can point out how that changes what the function can do with the variable values and if/how it can be used again in " "`main`.\n" @@ -6164,6 +6495,9 @@ msgid "" "* You might point out that `print_laps` is using a vector that is iterated over. We describe vectors in more detail in the " "afternoon. " msgstr "" +"
\n" +" \n" +"Pontos chave:\n" "* Todos os quatro métodos aqui usam um receptor de método diferente.\n" " * Você pode apontar como isso muda o que a função pode fazer com os valores das variáveis e se/como ela pode ser usada " "novamente em `main`.\n" @@ -6171,7 +6505,8 @@ msgstr "" "* Observe que, embora os receptores do método sejam diferentes, as funções não estáticas são chamadas da mesma maneira no " "corpo principal. Rust permite referenciar e desreferenciar automaticamente ao chamar métodos. Rust adiciona automaticamente " "`&`, `*`, `muts` para que esse objeto corresponda à assinatura do método.\n" -"* Você pode apontar que `print_laps` está usando um vetor iterado. Descrevemos os vetores com mais detalhes à tarde." +"* Você pode apontar que `print_laps` está usando um vetor iterado. Descreveremos os vetores com mais\n" +"detalhes à tarde." #: src/pattern-matching.md:1 msgid "# Pattern Matching" @@ -6182,8 +6517,8 @@ msgid "" "The `match` keyword let you match a value against one or more _patterns_. The\n" "comparisons are done from top to bottom and the first match wins." msgstr "" -"A palavra-chave `match` permite que você corresponda um valor a um ou mais _patterns_. o\n" -"as comparações são feitas de cima para baixo e a primeira partida vence." +"A palavra-chave `match` permite que você corresponda um valor a um ou mais _padrões_ (_patterns_). As\n" +" comparações são feitas de cima para baixo e a primeira correspondência encontrada é selecionada." #: src/pattern-matching.md:6 msgid "The patterns can be simple values, similarly to `switch` in C and C++:" @@ -6213,7 +6548,7 @@ msgstr "" " match input {\n" " 'q' => println!(\"Sair\"),\n" " 'a' | 's' | 'w' | 'd' => println!(\"Movendo-se\"),\n" -" '0'..='9' => println!(\"Number input\"),\n" +" '0'..='9' => println!(\"Entrada numérica\"),\n" " _ => println!(\"Algo mais\"),\n" " }\n" "}\n" @@ -6225,6 +6560,9 @@ msgstr "O padrão `_` é um padrão curinga que corresponde a qualquer valor." #: src/pattern-matching.md:23 msgid "" +"
\n" +" \n" +"Key Points:\n" "* You might point out how some specific characters are being used when in a pattern\n" " * `|` as an `or`\n" " * `..` can expand as much as it needs to be\n" @@ -6237,7 +6575,10 @@ msgid "" " \n" "
" msgstr "" -"* Você pode apontar como alguns caracteres específicos estão sendo usados quando em um padrão\n" +"
\n" +" \n" +"Pontos chave:\n" +"* Você pode apontar como alguns caracteres específicos podem ser usados em um padrão\n" " * `|` como um `ou`\n" " * `..` pode expandir o quanto for necessário\n" " * `1..=5` representa um intervalo inclusivo\n" @@ -6252,7 +6593,7 @@ msgstr "" #: src/pattern-matching/destructuring-enums.md:1 msgid "# Destructuring Enums" -msgstr "# Desestruturando Enums" +msgstr "# Desestruturando enunerações (Enums)" #: src/pattern-matching/destructuring-enums.md:3 msgid "" @@ -6260,7 +6601,7 @@ msgid "" "you inspect the structure of your types. Let us start with a simple `enum` type:" msgstr "" "Os padrões também podem ser usados para vincular variáveis a partes de seus valores. É assim\n" -"você inspeciona a estrutura de seus tipos. Vamos começar com um tipo `enum` simples:" +"que você inspeciona a estrutura de seus tipos. Vamos começar com um tipo `enum` simples:" #: src/pattern-matching/destructuring-enums.md:6 msgid "" @@ -6270,6 +6611,11 @@ msgid "" " Err(String),\n" "}" msgstr "" +"```rust,editable\n" +"enum Result {\n" +" Ok(i32),\n" +" Err(String),\n" +"}" #: src/pattern-matching/destructuring-enums.md:12 msgid "" @@ -6281,11 +6627,11 @@ msgid "" " }\n" "}" msgstr "" -"fn divide_in_two(n: i32) -> Result {\n" +"fn divide_por_dois(n: i32) -> Result {\n" " if n % 2 == 0 {\n" " Result::Ok(n/2)\n" " } else {\n" -" Result::Err(format!(\"não é possível dividir {} em duas partes iguais\", n))\n" +" Result::Err(format!(\"Não é possível dividir {} em duas partes iguais\", n))\n" " }\n" "}" @@ -6302,9 +6648,9 @@ msgid "" msgstr "" "fn main() {\n" " let n = 100;\n" -" match divide_in_two(n) {\n" +" match divide_por_dois(n) {\n" " Result::Ok(metade) => println!(\"{n} dividido em dois é {metade}\"),\n" -" Result::Err(msg) => println!(\"desculpe, ocorreu um erro: {msg}\"),\n" +" Result::Err(msg) => println!(\"Desculpe, ocorreu um erro: {msg}\"),\n" " }\n" "}\n" "```" @@ -6315,23 +6661,25 @@ msgid "" "arm, `half` is bound to the value inside the `Ok` variant. In the second arm,\n" "`msg` is bound to the error message." msgstr "" -"Aqui usamos os braços para _desestruturar_ o valor `Resultado`. Em primeiro\n" -"arm, `half` está vinculado ao valor dentro da variante `Ok`. No segundo braço,\n" +"Aqui usamos a verificação de correspondência para _desestruturar_ o valor contido em `Result`. Na primeira\n" +"verificação de correspondência, `metade` está vinculado ao valor dentro da variante `Ok`. Na segunda,\n" "`msg` está vinculado à mensagem de erro." #: src/pattern-matching/destructuring-enums.md:35 msgid "" +"Key points:\n" "* The `if`/`else` expression is returning an enum that is later unpacked with a `match`.\n" "* You can try adding a third variant to the enum definition and displaying the errors when running the code. Point out the " "places where your code is now inexhaustive and how the compiler tries to give you hints." msgstr "" +"Pontos chave:\n" "* A expressão `if`/`else` está retornando um enum que é posteriormente descompactado com um `match`.\n" "* Você pode tentar adicionar uma terceira variante à definição de Enum e exibir os erros ao executar o código. Aponte os " -"lugares onde seu código agora é inexaustivo e como o compilador tenta lhe dar dicas." +"lugares onde seu código agora é \"não exaustivo\" e como o compilador tenta lhe dar dicas." #: src/pattern-matching/destructuring-structs.md:1 msgid "# Destructuring Structs" -msgstr "# Desestruturando Structs" +msgstr "# Desestruturando estruturas (Structs)" #: src/pattern-matching/destructuring-structs.md:3 msgid "You can also destructure `structs`:" @@ -6363,8 +6711,9 @@ msgid "" " }\n" "}\n" "```\n" +"
" msgstr "" -"#[rustfmt::pular]\n" +"#[rustfmt::skip]\n" "fn main() {\n" " let foo = Foo { x: (1, 2), y: 3 };\n" " match foo {\n" @@ -6373,7 +6722,7 @@ msgstr "" " Foo { y, .. } => println!(\"y = {y}, outros campos foram ignorados\"),\n" " }\n" "}\n" -"```\n" +"```" #: src/pattern-matching/destructuring-structs.md:23 msgid "" @@ -6381,17 +6730,20 @@ msgid "" "* Add a new field to `Foo` and make changes to the pattern as needed.\n" "
" msgstr "" +"* Altere os valores literais em `foo` para corresponderem com outros padrões.\n" +"* Adicione um novo campo em `Foo` e faça as alterações no padrão" +" conforme necessário.\n" +"
" #: src/pattern-matching/destructuring-arrays.md:1 msgid "# Destructuring Arrays" -msgstr "# Desestruturando Arrays" +msgstr "# Desestruturando Vetores" #: src/pattern-matching/destructuring-arrays.md:3 msgid "You can destructure arrays, tuples, and slices by matching on their elements:" -msgstr "Você pode desestruturar arrays, tuplas e slices combinando seus elementos:" +msgstr "Você pode desestruturar vetores, tuplas e slices combinando seus elementos:" #: src/pattern-matching/destructuring-arrays.md:5 -#, fuzzy msgid "" "```rust,editable\n" "#[rustfmt::skip]\n" @@ -6407,7 +6759,7 @@ msgid "" "```" msgstr "" "```rust, editable\n" -"#[rustfmt::pular]\n" +"#[rustfmt::skip]\n" "fn main() {\n" " let triplo = [0, -2, 3];\n" " println!(\"Fale-me sobre {triplo:?}\");\n" @@ -6421,7 +6773,7 @@ msgstr "" #: src/pattern-matching/destructuring-arrays.md:20 msgid "* Destructuring of slices of unknown length also works with patterns of fixed length." -msgstr "" +msgstr "* Desestruturar slices de tamanho desconhecido também funciona com padrões de tamanho fixo." #: src/pattern-matching/destructuring-arrays.md:22 msgid "" @@ -6430,6 +6782,10 @@ msgid "" " inspect(&[0, -2, 3]);\n" " inspect(&[0, -2, 3, 4]);\n" "}" +msgstr "" + +#: src/pattern-matching/destructuring-arrays.md:28 +msgid "" "#[rustfmt::skip]\n" "fn inspect(slice: &[i32]) {\n" " println!(\"Tell me about {slice:?}\");\n" @@ -6440,24 +6796,33 @@ msgid "" " }\n" "}\n" "```\n" -msgstr "" - -#: src/pattern-matching/destructuring-arrays.md:28 -msgid "" "* Show matching against the tail with patterns `[.., b]` and `[a@..,b]`\n" +"
" msgstr "" +"#[rustfmt::skip]\n" +"fn inspect(slice: &[i32]) {\n" +" println!(\"Fale-me sobre {slice:?}\");\n" +" match slice {\n" +" &[0, y, z] => println!(\"O primeiro é 0, y = {y}, e z = {z}\"),\n" +" &[1, ..] => println!(\"O primeiro é 1 e o restante é ignorado\"),\n" +" _ => println!(\"Todos os elementos foram ignorados\"),\n" +" }\n" +"}\n" +"```\n" +"* Mostre as correspondências com o final do padrão usando `[.., b]` e `[a@..,b]`\n" +"
" #: src/pattern-matching/match-guards.md:1 msgid "# Match Guards" -msgstr "# Guardas de jogo" +msgstr "# Guardas de correspondência (match guards)" #: src/pattern-matching/match-guards.md:3 msgid "" "When matching, you can add a _guard_ to a pattern. This is an arbitrary Boolean\n" "expression which will be executed if the pattern matches:" msgstr "" -"Ao match, você pode adicionar um _guard_ a um padrão. Este é um booleano arbitrário\n" -"expressão que será executada se o padrão corresponder:" +"Ao verificar uma correspondência, você pode adicionar um _guarda_ para um padrão. É uma expressão booleana\n" +"que será executada se o padrão corresponder:" #: src/pattern-matching/match-guards.md:6 msgid "" @@ -6476,7 +6841,7 @@ msgid "" "```" msgstr "" "```rust, editable\n" -"#[rustfmt::pular]\n" +"#[rustfmt::skip]\n" "fn main() {\n" " let pair = (2, -2);\n" " println!(\"Fale-me sobre {pair:?}\");\n" @@ -6491,6 +6856,7 @@ msgstr "" #: src/pattern-matching/match-guards.md:22 msgid "" +"Key Points:\n" "* Match guards as a separate syntax feature are important and necessary when we wish to concisely express more complex " "ideas than patterns alone would allow.\n" "* They are not the same as separate `if` expression inside of the match arm. An `if` expression inside of the branch block " @@ -6501,12 +6867,14 @@ msgid "" "* The condition defined in the guard applies to every expression in a pattern with an `|`.\n" "
" msgstr "" -"* Match guards como um recurso de sintaxe separado são importantes e necessários.\n" -"* Eles não são iguais à expressão 'if' separada dentro do braço de correspondência. Uma expressão `if` dentro do bloco de " -"ramificação (depois de `=>`) acontece depois que o braço de correspondência é selecionado. A falha na condição `if` dentro " -"desse bloco não resultará em outros braços\n" -"da expressão `match` original sendo considerada.\n" -"* Você pode usar as variáveis definidas no padrão em sua expressão if.\n" +"Pontos chave:\n" +"* Guardas de correspondência, como um recurso de sintaxe separado, são importantes e necessários.\n" +"Permitem expressar ideias mais complexas do que somente o padrão permitiria.\n" +"* Eles não são iguais à expressão `if` separada dentro do bloco de correspondência. Uma expressão `if` dentro do bloco de " +"ramificação (depois de `=>`) acontece depois que a correspondência é selecionada. A falha na condição `if` dentro " +"desse bloco não resultará em outras verificações de correspondência\n" +"da expressão `match` original serem consideradas.\n" +"* Você pode usar as variáveis definidas no padrão em sua expressão `if`.\n" "* A condição definida na guarda se aplica a todas as expressões em um padrão com um `|`.\n" "
" @@ -6524,7 +6892,7 @@ msgstr "* Estrutura simples que rastreia as estatísticas de saúde." #: src/exercises/day-2/morning.md:7 msgid "* Multiple structs and enums for a drawing library." -msgstr "* Várias Structs e enumerações para uma biblioteca de desenho." +msgstr "* Várias estruturas e enumerações para uma biblioteca de desenho." #: src/exercises/day-2/health-statistics.md:1 msgid "# Health Statistics" @@ -6536,7 +6904,7 @@ msgid "" "need to keep track of users' health statistics." msgstr "" "Você está trabalhando na implementação de um sistema de monitoramento de saúde. Como parte disso, você\n" -"precisam acompanhar as estatísticas de saúde dos usuários." +"precisa acompanhar as estatísticas de saúde dos usuários." #: src/exercises/day-2/health-statistics.md:6 msgid "" @@ -6544,17 +6912,16 @@ msgid "" "struct definition. Your goal is to implement the stubbed out methods on the\n" "`User` `struct` defined in the `impl` block." msgstr "" -"Você começará com algumas funções fragmentadas em um bloco `impl`, bem como em um bloco `User`\n" -"definição de struct. Seu objetivo é implementar os métodos stubbed out no\n" -"`User` `struct` definido no bloco `impl`." +"Você começará com algumas funções fragmentadas em um bloco `impl` e também com a definição da estrutura `User`.\n" +"Seu objetivo é implementar os métodos esboçados para a\n" +"`struct` `User` definidos no bloco `impl`." #: src/exercises/day-2/health-statistics.md:10 msgid "" "Copy the code below to and fill in the missing\n" "methods:" msgstr "" -"Copie o código abaixo para e preencha os campos que faltam\n" -"métodos:" +"Copie o código abaixo para e implemente os métodos:" #: src/exercises/day-2/health-statistics.md:17 msgid "" @@ -6564,10 +6931,10 @@ msgid "" " weight: f32,\n" "}" msgstr "" -"struct User {\n" -" name: String,\n" -" age: u32,\n" -" weight: f32,\n" +"struct Usuario {\n" +" nome: String,\n" +" idade: u32,\n" +" peso: f32,\n" "}" #: src/exercises/day-2/health-statistics.md:23 @@ -6577,8 +6944,8 @@ msgid "" " unimplemented!()\n" " }" msgstr "" -"impl User {\n" -" pub fn new(name: String, age: u32, weight: f32) -> Self {\n" +"impl Usuario {\n" +" pub fn new(nome: String, idade: u32, peso: f32) -> Self {\n" " unimplemented!()\n" " }" @@ -6588,7 +6955,7 @@ msgid "" " unimplemented!()\n" " }" msgstr "" -" pub fn name(&self) -> &str {\n" +" pub fn nome(&self) -> &str {\n" " unimplemented!()\n" " }" @@ -6598,7 +6965,7 @@ msgid "" " unimplemented!()\n" " }" msgstr "" -" pub fn age(&self) -> u32 {\n" +" pub fn idade(&self) -> u32 {\n" " unimplemented!()\n" " }" @@ -6608,7 +6975,7 @@ msgid "" " unimplemented!()\n" " }" msgstr "" -" pub fn weight(&self) -> f32 {\n" +" pub fn peso(&self) -> f32 {\n" " unimplemented!()\n" " }" @@ -6618,7 +6985,7 @@ msgid "" " unimplemented!()\n" " }" msgstr "" -" pub fn set_age(&mut self, new_age: u32) {\n" +" pub fn setar_idade(&mut self, nova_idade: u32) {\n" " unimplemented!()\n" " }" @@ -6629,7 +6996,7 @@ msgid "" " }\n" "}" msgstr "" -" pub fn set_weight(&mut self, new_weight: f32) {\n" +" pub fn setar_peso(&mut self, novo_peso: f32) {\n" " unimplemented!()\n" " }\n" "}" @@ -6642,8 +7009,8 @@ msgid "" "}" msgstr "" "fn main() {\n" -" let bob = User::new(String::from(\"Bob\"), 32, 155.2);\n" -" println!(\"Tenho {} e minha age é {}\", bob.name(), bob.age());\n" +" let bob = Usuario::new(String::from(\"Bob\"), 32, 155.2);\n" +" println!(\"Sou {} e minha idade é {}\", bob.nome(), bob.idade());\n" "}" #: src/exercises/day-2/health-statistics.md:54 @@ -6655,9 +7022,9 @@ msgid "" "}" msgstr "" "#[test]\n" -"fn test_weight() {\n" -" let bob = User::new(String::from(\"Bob\"), 32, 155.2);\n" -" assert_eq!(bob.weight(), 155.2);\n" +"fn test_peso() {\n" +" let bob = Usuario::new(String::from(\"Bob\"), 32, 155.2);\n" +" assert_eq!(bob.peso(), 155.2);\n" "}" #: src/exercises/day-2/health-statistics.md:60 @@ -6672,17 +7039,17 @@ msgid "" "```" msgstr "" "#[test]\n" -"fn test_set_age() {\n" -" let mut bob = User::new(String::from(\"Bob\"), 32, 155.2);\n" -" assert_eq!(bob.age(), 32);\n" -" bob.set_age(33);\n" -" assert_eq!(bob.age(), 33);\n" +"fn test_setar_idade() {\n" +" let mut bob = Usuario::new(String::from(\"Bob\"), 32, 155.2);\n" +" assert_eq!(bob.idade(), 32);\n" +" bob.setar_idade(33);\n" +" assert_eq!(bob.idade(), 33);\n" "}\n" "```" #: src/exercises/day-2/points-polygons.md:1 msgid "# Polygon Struct" -msgstr "# Estrutura do Polígono" +msgstr "# Estrutura para polígono" #: src/exercises/day-2/points-polygons.md:3 msgid "" @@ -6690,9 +7057,9 @@ msgid "" "to and fill in the missing methods to make the\n" "tests pass:" msgstr "" -"Vamos criar uma estrutura `Polygon` que contém alguns Points. Copie o código abaixo\n" -"para e preencha os métodos que faltam para fazer o\n" -"tests passam:" +"Vamos criar uma estrutura `Poligono` que contém alguns `Pontos`. Copie o código abaixo\n" +"para e preencha os métodos que faltam para fazer os\n" +"testes passarem:" #: src/exercises/day-2/points-polygons.md:7 src/exercises/day-2/luhn.md:23 src/exercises/day-2/strings-iterators.md:12 msgid "" @@ -6710,8 +7077,8 @@ msgid "" " // add fields\n" "}" msgstr "" -"pub struct Point {\n" -" // adiciona campos\n" +"pub struct Ponto {\n" +" // adicione os campos\n" "}" #: src/exercises/day-2/points-polygons.md:15 @@ -6720,52 +7087,48 @@ msgid "" " // add methods\n" "}" msgstr "" -"impl Point {\n" -" // adiciona métodos\n" +"impl Ponto {\n" +" // adicione os métodos\n" "}" #: src/exercises/day-2/points-polygons.md:19 -#, fuzzy msgid "" "pub struct Polygon {\n" " // add fields\n" "}" msgstr "" -"pub struct Polígono {\n" -" // adiciona campos\n" +"pub struct Poligono {\n" +" // adicione os campos\n" "}" #: src/exercises/day-2/points-polygons.md:23 -#, fuzzy msgid "" "impl Polygon {\n" " // add methods\n" "}" msgstr "" -"impl Polígono {\n" -" // adiciona métodos\n" +"impl Poligono {\n" +" // adicione os métodos\n" "}" #: src/exercises/day-2/points-polygons.md:27 -#, fuzzy msgid "" "pub struct Circle {\n" " // add fields\n" "}" msgstr "" -"pub struct Círculo {\n" -" // adiciona campos\n" +"pub struct Circulo {\n" +" // adicione os campos\n" "}" #: src/exercises/day-2/points-polygons.md:31 -#, fuzzy msgid "" "impl Circle {\n" " // add methods\n" "}" msgstr "" -"impl Círculo {\n" -" // adiciona métodos\n" +"impl Circulo {\n" +" // adicione os métodos\n" "}" #: src/exercises/day-2/points-polygons.md:35 @@ -6775,9 +7138,9 @@ msgid "" " Circle(Circle),\n" "}" msgstr "" -"pub enum Shape {\n" -" Polygon(Polygon),\n" -" Circle(Circle),\n" +"pub enum Forma {\n" +" Poligono(Poligono),\n" +" Circulo(Circulo),\n" "}" #: src/exercises/day-2/points-polygons.md:40 src/testing/test-modules.md:15 @@ -6796,7 +7159,7 @@ msgid "" " (x * 100.0).round() / 100.0\n" " }" msgstr "" -" fn round_two_digits(x: f64) -> f64 {\n" +" fn arredonda_dois_digitos(x: f64) -> f64 {\n" " (x * 100.0).round() / 100.0\n" " }" @@ -6809,9 +7172,9 @@ msgid "" " }" msgstr "" " #[test]\n" -" fn test_point_magnitude() {\n" -" let p1 = Point::new(12, 13);\n" -" assert_eq!(round_two_digits(p1.magnitude()), 17,69);\n" +" fn test_magnitude_ponto() {\n" +" let p1 = Ponto::new(12, 13);\n" +" assert_eq!(arredonda_dois_digitos(p1.magnitude()), 17.69);\n" " }" #: src/exercises/day-2/points-polygons.md:54 src/exercises/day-2/solutions-morning.md:175 @@ -6824,10 +7187,10 @@ msgid "" " }" msgstr "" " #[test]\n" -" fn test_point_dist() {\n" -" let p1 = Point::new(10, 10);\n" -" let p2 = Point::new(14, 13);\n" -" assert_eq!(round_two_digits(p1.dist(p2)), 5,00);\n" +" fn test_distancia_pontos() {\n" +" let p1 = Ponto::new(10, 10);\n" +" let p2 = Ponto::new(14, 13);\n" +" assert_eq!(arredonda_dois_digitos(p1.dist(p2)), 5.00);\n" " }" #: src/exercises/day-2/points-polygons.md:61 src/exercises/day-2/solutions-morning.md:182 @@ -6840,10 +7203,10 @@ msgid "" " }" msgstr "" " #[test]\n" -" fn test_point_add() {\n" -" let p1 = Point::new(16, 16);\n" -" let p2 = p1 + Point::new(-4, 3);\n" -" assert_eq!(p2, Point::new(12, 19));\n" +" fn test_somar_pontos() {\n" +" let p1 = Ponto::new(16, 16);\n" +" let p2 = p1 + Ponto::new(-4, 3);\n" +" assert_eq!(p2, Ponto::new(12, 19));\n" " }" #: src/exercises/day-2/points-polygons.md:68 src/exercises/day-2/solutions-morning.md:189 @@ -6854,9 +7217,9 @@ msgid "" " let p2 = Point::new(16, 16);" msgstr "" " #[test]\n" -" fn test_polygon_left_most_point() {\n" -" let p1 = Point::new(12, 13);\n" -" let p2 = Point::new(16, 16);" +" fn test_poligono_ponto_mais_a_esquerda() {\n" +" let p1 = Ponto::new(12, 13);\n" +" let p2 = Ponto::new(16, 16);" #: src/exercises/day-2/points-polygons.md:73 src/exercises/day-2/solutions-morning.md:194 msgid "" @@ -6866,10 +7229,10 @@ msgid "" " assert_eq!(poly.left_most_point(), Some(p1));\n" " }" msgstr "" -" let mut poly = Polygon::new();\n" -" poly.add_point(p1);\n" -" poly.add_point(p2);\n" -" assert_eq!(poly.left_most_point(), Some(p1));\n" +" let mut poly = Poligono::new();\n" +" poly.adiciona_ponto(p1);\n" +" poly.adiciona_ponto(p2);\n" +" assert_eq!(poly.ponto_mais_a_esquerda(), Some(p1));\n" " }" #: src/exercises/day-2/points-polygons.md:79 src/exercises/day-2/solutions-morning.md:200 @@ -6880,9 +7243,9 @@ msgid "" " let p2 = Point::new(16, 16);" msgstr "" " #[test]\n" -" fn test_polygon_iter() {\n" -" let p1 = Point::new(12, 13);\n" -" let p2 = Point::new(16, 16);" +" fn test_poligono_iter() {\n" +" let p1 = Ponto::new(12, 13);\n" +" let p2 = Ponto::new(16, 16);" #: src/exercises/day-2/points-polygons.md:84 src/exercises/day-2/solutions-morning.md:205 msgid "" @@ -6890,9 +7253,9 @@ msgid "" " poly.add_point(p1);\n" " poly.add_point(p2);" msgstr "" -" let mut poly = Polygon::new();\n" -" poly.add_point(p1);\n" -" poly.add_point(p2);" +" let mut poly = Poligono::new();\n" +" poly.adiciona_ponto(p1);\n" +" poly.adiciona_ponto(p2);" #: src/exercises/day-2/points-polygons.md:88 src/exercises/day-2/solutions-morning.md:209 msgid "" @@ -6900,8 +7263,8 @@ msgid "" " assert_eq!(points, vec![Point::new(12, 13), Point::new(16, 16)]);\n" " }" msgstr "" -" let Points = poly.iter().cloned().collect::>();\n" -" assert_eq!(Points, vec![Point::new(12, 13), Point::new(16, 16)]);\n" +" let pontos = poly.iter().cloned().collect::>();\n" +" assert_eq!(pontos, vec![Ponto::new(12, 13), Ponto::new(16, 16)]);\n" " }" #: src/exercises/day-2/points-polygons.md:92 @@ -6926,21 +7289,21 @@ msgid "" "}" msgstr "" " #[test]\n" -" fn test_shape_perimeters() {\n" -" let mut poly = Polygon::new();\n" -" poly.add_point(Point::new(12, 13));\n" -" poly.add_point(Point::new(17, 11));\n" -" poly.add_point(Point::new(16, 16));\n" -" let shapes = vec![\n" -" Shape::de(poly),\n" -" Shape::de(Circle::new(Point::new(10, 20), 5)),\n" +" fn test_perimetros_da_forma() {\n" +" let mut poly = Poligono::new();\n" +" poly.adiciona_ponto(Ponto::new(12, 13));\n" +" poly.adiciona_ponto(Ponto::new(17, 11));\n" +" poly.adiciona_ponto(Ponto::new(16, 16));\n" +" let formas = vec![\n" +" Forma::from(poly),\n" +" Forma::from(Circulo::new(Ponto::new(10, 20), 5)),\n" " ];\n" -" let perimeters = shapes\n" +" let perimetros = formas\n" " .iter()\n" -" .map(Shape::perimeter)\n" -" .map(round_two_digits)\n" +" .map(Forma::perimetro)\n" +" .map(arredonda_dois_digitos)\n" " .collect::>();\n" -" assert_eq!(perimeters, vec![15.48, 31.42]);\n" +" assert_eq!(perimetros, vec![15.48, 31.42]);\n" " }\n" "}" @@ -6959,20 +7322,20 @@ msgid "" "Since the method signatures are missing from the problem statements, the key part\n" "of the exercise is to specify those correctly. Do not modify any of the tests." msgstr "" -"Como as assinaturas do método estão faltando nas declarações do problema, a parte principal\n" -"do exercício é especificá-los corretamente." +"Como as assinaturas dos métodos estão faltando nas declarações do problema, a parte principal\n" +"do exercício é especificá-las corretamente." #: src/exercises/day-2/points-polygons.md:120 msgid "" "Other interesting parts of the exercise:\n" -msgstr "" -"Outras partes interessantes do exercício:\n" - -msgid "* Derive a `Copy` trait for some structs, as in tests the methods sometimes don't borrow their arguments.\n" +" \n" +"* Derive a `Copy` trait for some structs, as in tests the methods sometimes don't borrow their arguments.\n" "* Discover that `Add` trait must be implemented for two objects to be addable via \"+\". Note that we do not discuss " "generics until Day 3." msgstr "" -"* Derive um trait `Copy` para algumas Structs, já que em testes os métodos às vezes não emprestam seus argumentos.\n" +"Outras partes interessantes do exercício:\n" +" \n" +"* Derive um _trait_ `Copy` para algumas estruturas, já que em testes os métodos às vezes não emprestam seus argumentos.\n" "* Descubra que o trait `Add` deve ser implementado para que dois objetos sejam adicionados via \"+\"." #: src/control-flow.md:1 @@ -6989,7 +7352,7 @@ msgstr "" "Como vimos, `if` é uma expressão em Rust. É usado para condicionalmente\n" "avaliar um dos dois blocos, mas os blocos podem ter um valor que então se torna\n" "o valor da expressão `if`. Outras expressões de fluxo de controle funcionam de forma semelhante\n" -"em rust." +"em Rust." #: src/control-flow/blocks.md:1 msgid "# Blocks" @@ -7001,10 +7364,9 @@ msgid "" "block:" msgstr "" "Um bloco em Rust tem um valor e um tipo: o valor é a última expressão do\n" -"quadra:" +"bloco:" #: src/control-flow/blocks.md:6 -#, fuzzy msgid "" "```rust,editable\n" "fn main() {\n" @@ -7035,7 +7397,7 @@ msgstr "" " 3 + 4\n" " };\n" " println!(\"w: {w}\");\n" -" e * w\n" +" y * w\n" " };\n" " println!(\"z: {z}\");\n" " z - y\n" @@ -7059,6 +7421,10 @@ msgid "" " x + x\n" "}" msgstr "" +"```rust,editable\n" +"fn dobro(x: i32) -> i32 {\n" +" x + x\n" +"}" #: src/control-flow/blocks.md:33 msgid "" @@ -7067,32 +7433,38 @@ msgid "" "}\n" "```" msgstr "" +"fn main() {\n" +" println!(\"dobro: {}\", dobro(7));\n" +"}\n" +"```" #: src/control-flow/blocks.md:38 msgid "However if the last expression ends with `;`, then the resulting value and type is `()`." -msgstr "No entanto, se a última expressão terminar com `;`, o valor e o tipo resultante serão `()`." +msgstr "No entanto, se a última expressão terminar com `;` o valor e o tipo do retorno será `()`." #: src/control-flow/blocks.md:42 msgid "" +"Key Points:\n" "* The point of this slide is to show that blocks have a type and value in Rust. \n" "* You can show how the value of the block changes by changing the last line in the block. For instance, adding/removing a " "semicolon or using a `return`.\n" " \n" "
" msgstr "" -"* O objetivo deste slide é mostrar que os blocos têm um tipo e valor em Rust.\n" -"* Você pode mostrar como o valor do bloco muda alterando a última linha do bloco. Por exemplo, adicionar/remover um Point e " -"vírgula ou usar um `return`.\n" +"Pontos chave:\n" +"* O objetivo deste slide é mostrar que os blocos têm um tipo e um valor em Rust.\n" +"* Você pode mostrar como o valor do bloco muda alterando a última linha do bloco. Por exemplo, adicionar/remover um ponto e " +"vírgula (`;`) ou usar um `return`.\n" " \n" "" #: src/control-flow/if-expressions.md:1 msgid "# `if` expressions" -msgstr "# expressões `if`" +msgstr "# Expressões Se (`if`)" #: src/control-flow/if-expressions.md:3 msgid "You use `if` very similarly to how you would in other languages:" -msgstr "Você usa `if` de forma muito semelhante a como faria em outros idiomas:" +msgstr "Você usa `if` de forma muito semelhante a como faria em outras linguagens:" #: src/control-flow/if-expressions.md:5 msgid "" @@ -7154,13 +7526,13 @@ msgid "" "" msgstr "" "Como `if` é uma expressão e deve ter um tipo específico, ambos os blocos de ramificação devem ter o mesmo tipo. Considere " -"mostrar o que acontece se você adicionar `;` depois de `x / 2` no segundo exemplo.\n" +"mostrar o que acontece se você adicionar um `;` depois de `x / 2` no segundo exemplo.\n" " \n" "" #: src/control-flow/if-let-expressions.md:1 msgid "# `if let` expressions" -msgstr "# expressões `if let`" +msgstr "# Expressões Se (`if let`)" #: src/control-flow/if-let-expressions.md:3 msgid "If you want to match a value against a pattern, you can use `if let`:" @@ -7183,9 +7555,9 @@ msgstr "" "fn main() {\n" " let arg = std::env::args().next();\n" " if let Some(value) = arg {\n" -" println!(\"name do programa: {value}\");\n" +" println!(\"nome do programa: {value}\");\n" " } else {\n" -" println!(\"Falta name?\");\n" +" println!(\"Falta o nome?\");\n" " }\n" "}\n" "```" @@ -7197,7 +7569,7 @@ msgid "" "Rust." msgstr "" "Consulte [correspondência de padrões](../pattern-matching.md) para obter mais detalhes sobre padrões em\n" -"rust." +"Rust." #: src/control-flow/if-let-expressions.md:21 msgid "" @@ -7213,11 +7585,11 @@ msgstr "" " * Para o caso de uso semelhante, considere demonstrar um recurso [`let else`](https://github.com/rust-lang/rust/" "pull/93628) recentemente estabilizado.\n" "* Um uso comum é lidar com valores `Some` ao trabalhar com `Option`.\n" -"* Ao contrário de `match`, `if let` não suporta cláusulas de guarda para casamento de padrões." +"* Ao contrário de `match`, `if let` não suporta cláusulas de guarda para correspondência de padrões." #: src/control-flow/while-expressions.md:1 msgid "# `while` expressions" -msgstr "# expressões `enquanto`" +msgstr "# Expressões enquanto (`while`)" #: src/control-flow/while-expressions.md:3 msgid "The `while` keyword works very similar to other languages:" @@ -7255,15 +7627,15 @@ msgstr "" #: src/control-flow/while-let-expressions.md:1 msgid "# `while let` expressions" -msgstr "# expressões `while let`" +msgstr "# Expressões enquanto (`while let`)" #: src/control-flow/while-let-expressions.md:3 msgid "" "Like with `if`, there is a `while let` variant which repeatedly tests a value\n" "against a pattern:" msgstr "" -"Como com `if`, há uma variante `while let` que testa repetidamente um valor\n" -"contra um padrão:" +"Como com `if`, há uma variante `while let` que testa repetidamente se um valor\n" +"corresponde a um padrão:" #: src/control-flow/while-let-expressions.md:6 msgid "" @@ -7298,8 +7670,8 @@ msgid "" "return `None`. The `while let` lets us keep iterating through all items." msgstr "" "Aqui o iterador retornado por `v.iter()` retornará uma `Option` em cada\n" -"chamada para `next ()`. Ele retorna `Some(x)` até que seja concluído, após o qual será\n" -"retorna 'Nenhum'. O `while let` nos permite continuar iterando por todos os itens." +"chamada para `next()`. Ele retorna `Some(x)` até que seja concluído e, em seguida, retorna \n" +"`None`. O `while let` nos permite continuar iterando por todos os itens, enquando houver." #: src/control-flow/while-let-expressions.md:27 msgid "" @@ -7309,23 +7681,23 @@ msgid "" " \n" "" msgstr "" -"* Saliente que o loop `while let` continuará enquanto o valor corresponder ao padrão.\n" -"* Você pode reescrever o loop `while let` como um loop infinito com uma instrução if que quebra quando não há valor para " +"* Saliente que o laço `while let` continuará enquanto o valor corresponder ao padrão.\n" +"* Você pode reescrever o laço `while let` como um laço infinito com uma instrução if que quebra quando não há valor para " "desempacotar para `iter.next()`. O `while let` fornece açúcar sintático para o cenário acima.\n" " \n" "" #: src/control-flow/for-expressions.md:1 msgid "# `for` expressions" -msgstr "# expressões `for`" +msgstr "# Expressões Para (`for`)" #: src/control-flow/for-expressions.md:3 msgid "" "The `for` expression is closely related to the `while let` expression. It will\n" "automatically call `into_iter()` on the expression and then iterate over it:" msgstr "" -"A expressão `for` está intimamente relacionada com a expressão `while let`. Será\n" -"chame automaticamente `into_iter()` na expressão e, em seguida, itere sobre ela:" +"A expressão `for` está intimamente relacionada com a expressão `while let`. É\n" +"chamado automaticamente `into_iter()` na expressão e, em seguida, iterado sobre ela:" #: src/control-flow/for-expressions.md:6 msgid "" @@ -7365,12 +7737,16 @@ msgstr "Você pode usar `break` e `continue` aqui como de costume." #: src/control-flow/for-expressions.md:22 msgid "" +"
\n" +" \n" "* Index iteration is not a special syntax in Rust for just that case.\n" "* `(0..10)` is a range that implements an `Iterator` trait. \n" "* `step_by` is a method that returns another `Iterator` that skips every other element. \n" "* Modify the elements in the vector and explain the compiler errors. Change vector `v` to be mutable and the for loop to " "`for x in v.iter_mut()`." msgstr "" +"
\n" +" \n" "* A iteração de índice não é uma sintaxe especial no Rust apenas para esse caso.\n" "* `(0..10)` é um intervalo que implementa uma característica `Iterator`.\n" "* `step_by` é um método que retorna outro `Iterator` que pula todos os outros elementos.\n" @@ -7379,15 +7755,15 @@ msgstr "" #: src/control-flow/loop-expressions.md:1 msgid "# `loop` expressions" -msgstr "# expressões `loop`" +msgstr "# Expressões de laço (`loop`)" #: src/control-flow/loop-expressions.md:3 msgid "" "Finally, there is a `loop` keyword which creates an endless loop. Here you must\n" "either `break` or `return` to stop the loop:" msgstr "" -"Finalmente, há uma palavra-chave `loop` que cria um loop infinito. Aqui você deve\n" -"`break` ou `return` para parar o loop:" +"Finalmente, há uma palavra-chave `loop` que cria um laço infinito. Aqui você deve\n" +"usar `break` ou `return` para parar o laço:" #: src/control-flow/loop-expressions.md:6 msgid "" @@ -7411,20 +7787,25 @@ msgstr "" #: src/control-flow/loop-expressions.md:23 msgid "" +"
\n" +" \n" "* Break the `loop` with a value (e.g. `break 8`) and print it out." msgstr "" +"
\n" +" \n" +"* Break o `loop` com um valor (ex. `break 8`) e mostre-o." #: src/control-flow/match-expressions.md:1 msgid "# `match` expressions" -msgstr "# expressões `match`" +msgstr "# Expressões de correspondência (`match`)" #: src/control-flow/match-expressions.md:3 msgid "" "The `match` keyword is used to match a value against one or more patterns. In\n" "that sense, it works like a series of `if let` expressions:" msgstr "" -"A palavra-chave `match` é usada para corresponder um valor a um ou mais padrões. No\n" -"nesse sentido, funciona como uma série de expressões `if let`:" +"A palavra-chave `match` é usada para corresponder um valor a um ou mais padrões. Nesse\n" +"sentido, funciona como uma série de expressões `if let`:" #: src/control-flow/match-expressions.md:6 msgid "" @@ -7448,8 +7829,8 @@ msgstr "" " Some(\"ls\") => println!(\"Serão alguns arquivos\"),\n" " Some(\"mv\") => println!(\"Vamos mover alguns arquivos\"),\n" " Some(\"rm\") => println!(\"Uh, perigoso!\"),\n" -" None => println!(\"Hmm, nenhum name de programa?\"),\n" -" _ => println!(\"name de programa desconhecido!\"),\n" +" None => println!(\"Hmm, nenhum nome de programa?\"),\n" +" _ => println!(\"Nome de programa desconhecido!\"),\n" " }\n" "}\n" "```" @@ -7459,11 +7840,13 @@ msgid "" "Like `if let`, each match arm must have the same type. The type is the last\n" "expression of the block, if any. In the example above, the type is `()`." msgstr "" -"Como `if let`, cada braço de correspondência deve ter o mesmo tipo. O tipo é o último\n" +"Como `if let`, cada braço de correspondência deve ter o mesmo tipo. O tipo é a última\n" "expressão do bloco, se houver. No exemplo acima, o tipo é `()`." #: src/control-flow/match-expressions.md:25 msgid "" +"
\n" +" \n" "* Save the match expression to a variable and print it out.\n" "* Remove `.as_deref()` and explain the error.\n" " * `std::env::Agrs().next` returns an `Option<&String>`, but we cannot match against `String`.\n" @@ -7472,10 +7855,19 @@ msgid "" " * We can now use pattern matching to match against the `&str` inside `Option`.\n" "
" msgstr "" +"
\n" +" \n" +"* Salve o resultado de uma expressão de correspondência `match` em uma variável e imprima-a.\n" +"* Remova `.as_deref()` e explique o erro gerado.\n" +" * `std::env::Agrs().next()` returns an `Option<&String>`, porém `match` não funciona com o tipo `String`.\n" +" * `as_deref()` transforma um tipo `Option` em `Option`. Nesse caso, transforma um `Option<&String>` em " +"`Option<&str>`.\n" +" * Agora podemos usar a correspondência de padrões em um `&str` dentro de um `Option`.\n" +"
" #: src/control-flow/break-continue.md:1 msgid "# `break` and `continue`" -msgstr "# `interromper` e `continuar`" +msgstr "# Interromper (`break`) e Continuar (`continue`)" #: src/control-flow/break-continue.md:3 msgid "" @@ -7483,9 +7875,9 @@ msgid "" "the next iteration use `continue`. Both `continue` and `break` can optionally\n" "take a label argument which is used to break out of nested loops:" msgstr "" -"Se você quiser sair de um loop mais cedo, use `break`, se quiser iniciar imediatamente\n" -"a próxima iteração usa `continue`. Ambos `continue` e `break` podem opcionalmente\n" -"pegue um argumento de rótulo que é usado para sair de loops aninhados:" +"Se você quiser sair de um laços mais cedo, use `break`, se quiser iniciar imediatamente\n" +"a próxima iteração use `continue`. Ambos `continue` e `break` podem opcionalmente\n" +"receber um rótulo como argumento que é usado para sair de laços aninhados:" #: src/control-flow/break-continue.md:7 msgid "" @@ -7511,14 +7903,14 @@ msgstr "" "fn main() {\n" " let v = vec![10, 20, 30];\n" " let mut iter = v.into_iter();\n" -" 'outer: while let Some(x) = iter.next() {\n" +" 'laco_externo: while let Some(x) = iter.next() {\n" " println!(\"x: {x}\");\n" " let mut i = 0;\n" " while i < x {\n" " println!(\"x: {x}, i: {i}\");\n" " i += 1;\n" " if i == 3 {\n" -" break 'outer;\n" +" break 'laco_externo;\n" " }\n" " }\n" " }\n" @@ -7527,7 +7919,7 @@ msgstr "" #: src/control-flow/break-continue.md:25 msgid "In this case we break the outer loop after 3 iterations of the inner loop." -msgstr "Neste caso, quebramos o loop externo após 3 iterações do loop interno." +msgstr "Neste caso, quebramos o laço externo após 3 iterações do laço interno." #: src/std.md:1 msgid "# Standard Library" @@ -7540,12 +7932,12 @@ msgid "" "smoothly because they both use the same `String` type." msgstr "" "Rust vem com uma biblioteca padrão que ajuda a estabelecer um conjunto de tipos comuns\n" -"usado pela biblioteca e programas Rust. Dessa forma, duas bibliotecas podem trabalhar juntas\n" +"usados pela biblioteca e programas Rust. Dessa forma, duas bibliotecas podem trabalhar juntas\n" "sem problemas porque ambos usam o mesmo tipo `String`." #: src/std.md:7 msgid "The common vocabulary types include:" -msgstr "Os tipos de vocabulário comuns incluem:" +msgstr "As palavras reservadas de tipo comuns incluem:" #: src/std.md:9 msgid "" @@ -7553,11 +7945,11 @@ msgid "" " and [error handling](error-handling.md)." msgstr "" "* Tipos [`Option` e `Result`](std/option-result.md): usados para valores opcionais\n" -" e [manipulação de erros](manipulação de erros.md)." +" e [manipulação de erros](error-handling.md)." #: src/std.md:12 msgid "* [`String`](std/string.md): the default string type used for owned data." -msgstr "* [`String`](std/string.md): o tipo de string padrão usado para dados de ownership." +msgstr "* [`String`](std/string.md): o tipo de cadeia de caracteres padrão extensível usado para dados." #: src/std.md:14 msgid "* [`Vec`](std/vec.md): a standard extensible vector." @@ -7568,8 +7960,7 @@ msgid "" "* [`HashMap`](std/hashmap.md): a hash map type with a configurable hashing\n" " algorithm." msgstr "" -"* [`HashMap`](std/hashmap.md): um tipo de mapa hash com um hashing configurável\n" -" algoritmo." +"* [`HashMap`](std/hashmap.md): um tipo de mapa hash com o algoritmo de hashing configurável." #: src/std.md:19 msgid "* [`Box`](std/box.md): an owned pointer for heap-allocated data." @@ -7581,17 +7972,21 @@ msgstr "* [`Rc`](std/rc.md): um ponteiro de contagem de referência compartilhad #: src/std.md:23 msgid "" +"
\n" +" \n" " * In fact, Rust contains several layers of the Standard Library: `core`, `alloc` and `std`. \n" " * `core` includes the most basic types and functions that don't depend on `libc`, allocator or\n" " even the presence of an operating system. \n" " * `alloc` includes types which require a global heap allocator, such as `Vec`, `Box` and `Arc`.\n" " * Embedded Rust applications often only use `core`, and sometimes `alloc`." msgstr "" +"
\n" +" \n" " * Na verdade, Rust contém várias camadas da Biblioteca Padrão: `core`, `alloc` e `std`.\n" " * `core` inclui os tipos e funções mais básicos que não dependem de `libc`, alocador ou\n" " até mesmo a presença de um sistema operacional.\n" " * `alloc` inclui tipos que requerem um alocador de heap global, como `Vec`, `Box` e `Arc`.\n" -" * Os aplicativos Rust integrados geralmente usam apenas `core` e, às vezes, `alloc`." +" * Os aplicativos Rust embarcados geralmente usam apenas `core` e, às vezes, `alloc`." #: src/std/option-result.md:1 msgid "# `Option` and `Result`" @@ -7602,7 +7997,6 @@ msgid "The types represent optional data:" msgstr "Os tipos representam dados opcionais:" #: src/std/option-result.md:5 -#, fuzzy msgid "" "```rust,editable\n" "fn main() {\n" @@ -7612,20 +8006,19 @@ msgid "" msgstr "" "```rust, editable\n" "fn main() {\n" -" let números = vec![10, 20, 30];\n" -" let primeiro: Option<&i8> = números.primeiro();\n" -" println!(\"primeiro: {primeiro:?}\");" +" let numeros = vec![10, 20, 30];\n" +" let primeiro: Option<&i8> = numeros.first();\n" +" println!(\"Primeiro: {primeiro:?}\");" #: src/std/option-result.md:11 -#, fuzzy msgid "" " let idx: Result = numbers.binary_search(&10);\n" " println!(\"idx: {idx:?}\");\n" "}\n" "```" msgstr "" -" let idx: Result = numbers.binary_search(&10);\n" -" println!(\"idx: {idx:?}\");\n" +" let idx: Result = numeros.binary_search(&10);\n" +" println!(\"Indice: {idx:?}\");\n" "}\n" "```" @@ -7639,7 +8032,7 @@ msgid "" " * Otherwise, `Result::Err` contains the index where such an element should be inserted." msgstr "" "* `Option` e `Result` são amplamente usados não apenas na biblioteca padrão.\n" -"* `Option<&T>` tem sobrecargo de espaço zero em comparação com `&T`.\n" +"* `Option<&T>` tem sobrecarga de espaço zero em comparação com `&T`.\n" "* `Result` é o tipo padrão para implementar o tratamento de erros, como veremos no Dia 3.\n" "* `binary_search` retorna `Result`.\n" " * Se encontrado, `Result::Ok` contém o índice onde o elemento foi encontrado.\n" @@ -7651,7 +8044,7 @@ msgstr "# String" #: src/std/string.md:3 msgid "[`String`][1] is the standard heap-allocated growable UTF-8 string buffer:" -msgstr "[`String`][1] é o buffer de string UTF-8 expansível alocado por heap padrão:" +msgstr "[`String`][1] é o buffer padrão de cadeia de caracteres UTF-8 expansível e alocado no heap:" #: src/std/string.md:5 msgid "" @@ -7665,7 +8058,7 @@ msgstr "" "fn main() {\n" " let mut s1 = String::new();\n" " s1.push_str(\"Olá\");\n" -" println!(\"s1: len = {}, capacage = {}\", s1.len(), s1.capacity());" +" println!(\"s1: tamanho = {}, capacidade = {}\", s1.len(), s1.capacity());" #: src/std/string.md:11 msgid "" @@ -7677,7 +8070,7 @@ msgstr "" " let mut s2 = String::with_capacity(s1.len() + 1);\n" " s2.push_str(&s1);\n" " s2.push('!');\n" -" println!(\"s2: len = {}, capacage = {}\", s2.len(), s2.capacity());" +" println!(\"s2: tamanho = {}, capacidade = {}\", s2.len(), s2.capacity());" #: src/std/string.md:16 msgid "" @@ -7688,7 +8081,7 @@ msgid "" "```" msgstr "" " let s3 = String::from(\"🇨🇭\");\n" -" println!(\"s3: len = {}, número de caracteres = {}\", s3.len(),\n" +" println!(\"s3: tamanho = {}, número de caracteres = {}\", s3.len(),\n" " s3.chars().count());\n" "}\n" "```" @@ -7699,7 +8092,7 @@ msgid "" "`str` methods on a `String`." msgstr "" "`String` implementa [`Deref`][2], o que significa que você pode chamar todos\n" -"Métodos `str` em uma `String`." +"os métodos contidos em `str` em uma `String`." #: src/std/string.md:25 msgid "" @@ -7725,7 +8118,7 @@ msgstr "# `Vec`" #: src/std/vec.md:3 msgid "[`Vec`][1] is the standard resizable heap-allocated buffer:" -msgstr "[`Vec`][1] é o buffer redimensionável padrão alocado em heap:" +msgstr "[`Vec`][1] é o buffer padrão redimensionável alocado no heap:" #: src/std/vec.md:5 msgid "" @@ -7739,10 +8132,9 @@ msgstr "" "fn main() {\n" " let mut v1 = Vec::new();\n" " v1.push(42);\n" -" println!(\"v1: len = {}, capacage = {}\", v1.len(), v1.capacity());" +" println!(\"v1: tamanho = {}, capacidade = {}\", v1.len(), v1.capacity());" #: src/std/vec.md:11 -#, fuzzy msgid "" " let mut v2 = Vec::with_capacity(v1.len() + 1);\n" " v2.extend(v1.iter());\n" @@ -7752,7 +8144,7 @@ msgstr "" " let mut v2 = Vec::with_capacity(v1.len() + 1);\n" " v2.extend(v1.iter());\n" " v2.push(9999);\n" -" println!(\"v2: len = {}, capacage = {}\", v2.len(), v2.capacity());\n" +" println!(\"v2: tamanho = {}, capacidade = {}\", v2.len(), v2.capacity());\n" "}\n" "```" @@ -7761,6 +8153,8 @@ msgid "" " // Canonical macro to initialize a vector with elements.\n" " let mut v3 = vec![0, 0, 1, 2, 3, 4];" msgstr "" +" // Macro canônica para inicializar um vetor com elementos.\n" +" let mut v3 = vec![0, 0, 1, 2, 3, 4];" #: src/std/vec.md:19 msgid "" @@ -7768,6 +8162,9 @@ msgid "" " v3.retain(|x| x % 2 == 0);\n" " println!(\"{v3:?}\");" msgstr "" +" // Retém somente os elementos pares.\n" +" v3.retain(|x| x % 2 == 0);\n" +" println!(\"{v3:?}\");" #: src/std/vec.md:23 msgid "" @@ -7777,14 +8174,19 @@ msgid "" "}\n" "```" msgstr "" +" // Remove valores duplicados consecutivos.\n" +" v3.dedup();\n" +" println!(\"{v3:?}\");\n" +"}\n" +"```" #: src/std/vec.md:29 msgid "" "`Vec` implements [`Deref`][2], which means that you can call slice\n" "methods on a `Vec`." msgstr "" -"`Vec` implementa [`Deref`][2], o que significa que você pode chamar slice\n" -"métodos em um `Vec`." +"`Vec` implementa [`Deref`][2], o que significa que você pode chamar métodos de slice\n" +"em um `Vec`." #: src/std/vec.md:32 msgid "" @@ -7810,26 +8212,26 @@ msgid "" msgstr "" "
\n" " \n" -"* `Vec` é um tipo de coleção, junto com `String` e `HashMap`. Os dados que ele contém são armazenados\n" -" na pilha. Isso significa que a quantage de dados não precisa ser conhecida em tempo de compilação. pode crescer\n" +"* `Vec` é um tipo de coleção, como `String` e `HashMap`. Os dados que ele contém são armazenados\n" +" no heap. Isso significa que a quantidade de dados não precisa ser conhecida em tempo de compilação. Pode crescer\n" " ou encolher em tempo de execução.\n" -"* Observe como `Vec` também é um tipo genérico, mas você não precisa especificar `T` explicitamente. Como sempre\n" -" com inferência de tipo Rust, o `T` foi estabelecido durante a primeira chamada `push`.\n" -"* `vec![...]` é uma macro canônica para usar em vez de `Vec::new()` e suporta adicionar iniciais\n" -" elementos ao vetor.\n" -"* Para indexar o vetor, você usa `[` `]`, mas eles entrarão em pânico se estiverem fora dos limites. Alternativamente, " -"usando\n" -" `get` retornará uma `Option`. A função `pop` removerá o último elemento.\n" +"* Observe como `Vec` também é um tipo genérico, mas você não precisa especificar `T` explicitamente. Como sempre,\n" +" com a inferência de tipo Rust, o `T` foi estabelecido durante a primeira chamada `push`.\n" +"* `vec![...]` é uma macro canônica para usar em vez de `Vec::new()` e suporta adicionar elementos\n" +" iniciais ao vetor.\n" +"* Para indexar o vetor, você usa `[` `]`, mas uma excessão do tipo _pânico_ (`panic`) será gerada se o índice estiver\n" +"fora dos limites. Alternativamente, usando\n" +" `get` você obterá uma `Option`. A função `pop` removerá o último elemento.\n" "* Mostrar iterando sobre um vetor e alterando o valor:\n" " `for e in &mut v { *e += 50; }`" #: src/std/hashmap.md:1 msgid "# `HashMap`" -msgstr "#`HashMap`" +msgstr "# `HashMap`" #: src/std/hashmap.md:3 msgid "Standard hash map with protection against HashDoS attacks:" -msgstr "Mapa de hash padrão com proteção contra ataques HashDoS:" +msgstr "Mapa de _hash_ padrão com proteção contra ataques HashDoS:" #: src/std/hashmap.md:5 msgid "" @@ -7848,10 +8250,10 @@ msgid "" " page_counts.insert(\"Pride and Prejudice\".to_string(), 303);" msgstr "" "fn main() {\n" -" let mut page_counts = HashMap::new();\n" -" page_counts.insert(\"Aventuras de Huckleberry Finn\".to_string(), 207);\n" -" page_counts.insert(\"Contos de Fadas dos Grimms\".to_string(), 751);\n" -" page_counts.insert(\"Orgulho e Preconceito\".to_string(), 303);" +" let mut meus_livros = HashMap::new();\n" +" meus_livros.insert(\"Aventuras de Huckleberry Finn\".to_string(), 207);\n" +" meus_livros.insert(\"Contos de Fadas dos Grimms\".to_string(), 751);\n" +" meus_livros.insert(\"Orgulho e Preconceito\".to_string(), 303);" #: src/std/hashmap.md:14 msgid "" @@ -7860,13 +8262,12 @@ msgid "" " page_counts.len());\n" " }" msgstr "" -" if !page_counts.contains_key(\"Os Miseráveis\") {\n" -" println!(\"Conhecemos {} livros, mas não Os Miseráveis.\",\n" -" page_counts.len());\n" +" if !meus_livros.contains_key(\"Os Miseráveis\") {\n" +" println!(\"Tenho {} livros, mas não Os Miseráveis.\",\n" +" meus_livros.len());\n" " }" #: src/std/hashmap.md:19 -#, fuzzy msgid "" " for book in [\"Pride and Prejudice\", \"Alice's Adventure in Wonderland\"] {\n" " match page_counts.get(book) {\n" @@ -7875,14 +8276,12 @@ msgid "" " }\n" " }" msgstr "" -" for book in [\"Orgulho e Preconceito\", \"Alice no País das Maravilhas\"] {\n" -" match page_counts.get(book) {\n" -" Some(count) => println!(\"{book}: {count} páginas\"),\n" -" None => println!(\"{book} é desconhecido.\")\n" +" for livro in [\"Orgulho e Preconceito\", \"Alice no País das Maravilhas\"] {\n" +" match meus_livros.get(livro) {\n" +" Some(paginas) => println!(\"{livro}: {paginas} páginas\"),\n" +" None => println!(\"{livro} é desconhecido.\")\n" " }\n" -" }\n" -"}\n" -"```" +" }" #: src/std/hashmap.md:26 msgid "" @@ -7892,6 +8291,11 @@ msgid "" " *page_count += 1;\n" " }" msgstr "" +" // Use o método .entry() para inserir um valor, caso este não seja encontrado.\n" +" for livro in [\"Pride and Prejudice\", \"Alice's Adventure in Wonderland\"] {\n" +" let meu_livro: &mut i32 = meus_livros.entry(livro.to_string()).or_insert(0);\n" +" *meu_livro += 1;\n" +" }" #: src/std/hashmap.md:32 msgid "" @@ -7899,18 +8303,21 @@ msgid "" "}\n" "```" msgstr "" +" println!(\"{meus_livros:#?}\");\n" +"}\n" +"```" #: src/std/hashmap.md:38 msgid "* Unlike `vec!`, there is unfortunately no standard `hashmap!` macro." -msgstr "" +msgstr "* Diferente de `vec!`, infelizmente não há uma macro padrão `hashmap!`." #: src/std/box.md:1 msgid "# `Box`" -msgstr "# `Caixa`" +msgstr "# `Box`" #: src/std/box.md:3 msgid "[`Box`][1] is an owned pointer to data on the heap:" -msgstr "[`Box`][1] é um ponteiro de ownership para dados no heap:" +msgstr "[`Box`][1] é um ponteiro de propriedade para dados no heap:" #: src/std/box.md:5 msgid "" @@ -7929,7 +8336,6 @@ msgstr "" "```" #: src/std/box.md:13 -#, fuzzy msgid "" "```bob\n" " Stack Heap\n" @@ -7945,16 +8351,16 @@ msgid "" "```" msgstr "" "```bob\n" -" Pilha\n" -".- - - - - - -. .- - - - - - -.\n" -": : : :\n" -": cinco : : :\n" -": +-----+ : : +-----+ :\n" -": | o---|---+-----+-->| 5 | :\n" -": +-----+ : : +-----+ :\n" -": : : :\n" -": : : :\n" -"`- - - - - - -' `- - - - - -'\n" +" Stack Heap\n" +".- - - - - - -. .- - - - - - -.\n" +": : : :\n" +": cinco : : :\n" +": +-----+ : : +-----+ :\n" +": | o---|---+-----+-->| 5 | :\n" +": +-----+ : : +-----+ :\n" +": : : :\n" +": : : :\n" +"`- - - - - - -' `- - - - - - -'\n" "```" #: src/std/box.md:26 @@ -7983,14 +8389,21 @@ msgid "" "store the data on the heap in a `Box` so only the pointer is moved.\n" "
" msgstr "" +"* `Box` é parecido com `std::unique_ptr` em C++. \n" +"* No exemplo acima, você pode remover o `*` na instrução `println!` graças ao `Deref`. \n" +"* Uma `Box` é útil quando você:\n" +" * Tem um tipo cujo tamanho não está disponível em tempo de compilação, mas o compilador Rust precisa saber o tamanho exato.\n" +" * Precisa transferir a propriedade de um dado grande. Ao invés de copiar grandes volumes de dados na pilha (`stack`),\n" +"os dados são armazenados usando uma `Box` na _heap_ e apenas o ponteiro é movido." +"
" #: src/std/box-recursive.md:1 msgid "# Box with Recursive Data Structures" -msgstr "# Caixa com Structs de Dados Recursivas" +msgstr "# `Box` com estruturas de dados recursivas" #: src/std/box-recursive.md:3 msgid "Recursive data types or data types with dynamic sizes need to use a `Box`:" -msgstr "Tipos de dados recursivos ou tipos de dados com tamanhos dinâmicos precisam usar um `Box`:" +msgstr "Tipos de dados recursivos ou tipos de dados com tamanhos dinâmicos precisam usar uma `Box`:" #: src/std/box-recursive.md:5 src/std/box-niche.md:3 msgid "" @@ -8016,9 +8429,13 @@ msgid "" "}\n" "```" msgstr "" +"fn main() {\n" +" let list: List = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil))));\n" +" println!(\"{list:?}\");\n" +"}\n" +"```" #: src/std/box-recursive.md:18 -#, fuzzy msgid "" "```bob\n" " Stack Heap\n" @@ -8036,33 +8453,38 @@ msgid "" "```" msgstr "" "```bob\n" -" Pilha\n" -".- - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - -.\n" -": : : :\n" -": Lista : : :\n" -": +--------+-------+ : : +--------+--------+ +--------+ ------+ :\n" -": | Etiqueta | Contras | : : .->| Etiqueta | Contras | .->| Etiqueta | nada | :\n" -": | 0 | 1 | : : | | 0 | 2 | | | ////// | //// | :\n" -": | 1 | o-----+----+-----+-' | 1 | o------+-' | ////// | //// | :\n" -": +--------+-------+ : : +--------+--------+ +--------+ ------+ :\n" -": : : :\n" -": : : :\n" -"`- - - - - - - - - - - - -' '- - - - - - - - - - - - - - - - - - - - - - - -'\n" +" Stack Heap\n" +".- - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": lista : : :\n" +": +--------+-------+ : : +--------+--------+ +--------+------+ :\n" +": | Tag | Cons | : : .->| Tag | Cons | .->| Tag | Nil | :\n" +": | 0 | 1 | : : | | 0 | 2 | | | ////// | //// | :\n" +": | 1 | o-----+----+-----+-' | 1 | o------+-' | ////// | //// | :\n" +": +--------+-------+ : : +--------+--------+ +--------+------+ :\n" +": : : :\n" +": : : :\n" +"`- - - - - - - - - - - - -' '- - - - - - - - - - - - - - - - - - - - - - - -'\n" "```" #: src/std/box-recursive.md:33 msgid "" +"
\n" +" \n" "* If the `Box` was not used here and we attempted to embed a `List` directly into the `List`,\n" "the compiler would not compute a fixed size of the struct in memory, it would look infinite.\n" " \n" "* `Box` solves this problem as it has the same size as a regular pointer and just points at the next\n" "element of the `List` in the heap. " + msgstr "" -"Se a `Caixa` não foi usada aqui e tentamos incorporar uma `Lista` diretamente na `Lista`,\n" +"
\n" +" \n" +"Se a `Box` não for usada aqui e tentarmos incorporar uma `List` diretamente na `List`,\n" "o compilador não calcularia um tamanho fixo da estrutura na memória, pareceria infinito.\n" " \n" "`Box` resolve esse problema, pois tem o mesmo tamanho de um ponteiro normal e apenas aponta para o próximo\n" -"elemento da `Lista` na pilha.\n" +"elemento da `List` na _heap_.\n" " \n" "
" @@ -8073,6 +8495,8 @@ msgid "" " \n" "
" msgstr "" +"* Remova a `Box` da definição da `List` e veja o erro apresentado pelo compilador. `Recursive with indirection` é o aviso que você vai receber." +"
" #: src/std/box-niche.md:1 msgid "# Niche Optimization" @@ -8083,51 +8507,50 @@ msgid "" "A `Box` cannot be empty, so the pointer is always valid and non-`null`. This\n" "allows the compiler to optimize the memory layout:" msgstr "" -"Uma `Box` não pode estar vazia, então o ponteiro é sempre válido e não `nulo`. Esta\n" +"Uma `Box` não pode estar vazia, então o ponteiro é sempre válido e não `nulo`. Isto\n" "permite que o compilador otimize o layout da memória:" #: src/std/box-niche.md:19 -#, fuzzy msgid "" "```bob\n" " Stack Heap\n" -".- - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - - -.\n" -": : : :\n" -": list : : :\n" -": +--------+-------+ : : +--------+--------+ +--------+------+ :\n" -": | 0 | 1 | : : .->| 0 | 2 | .->| ////// | //// | :\n" -": | \"1/Tag\"| o-----+----+-----+-' | \"1/Tag\"| o-----+-' | \"1/Tag\"| null | :\n" -": +--------+-------+ : : +--------+--------+ +--------+------+ :\n" -": : : :\n" -": : : :\n" -"`- - - - - - - - - - - - -' '- - - - - - - - - - - - - - - - - - - - - - - -'\n" +".- - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": list : : :\n" +": +----------+-------+ : : +----------+--------+ +----------+------+ :\n" +": | 0 | 1 | : : .->| 0 | 2 | .->| ////// | //// | :\n" +": | \"1/Tag\"| o-----+--+-----+-' | \"1/Tag\"| o-----+-' | \"1/Tag\"| null | :\n" +": +----------+-------+ : : +----------+--------+ +----------+------+ :\n" +": : : :\n" +": : : :\n" +"`- - - - - - - - - - - - -' '- - - - - - - - - - - - - - - - - - - - - - - - - -'\n" "```" msgstr "" "```bob\n" -" Pilha\n" -".- - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - -.\n" -": : : :\n" -": Lista : : :\n" -": +--------+-------+ : : +--------+--------+ +--------+ ------+ :\n" -": | 0 | 1 | : : .->| 0 | 2 | .->| ////// | //// | :\n" -": | \"1/Etiqueta\"| o-----+----+-----+-' | \"1/Etiqueta\"| o-----+-' | \"1/Etiqueta\"| nulo | :\n" -": +--------+-------+ : : +--------+--------+ +--------+ ------+ :\n" -": : : :\n" -": : : :\n" -"`- - - - - - - - - - - - -' '- - - - - - - - - - - - - - - - - - - - - - - -'\n" +" Stack Heap\n" +".- - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": lista : : :\n" +": +----------+-------+ : : +----------+--------+ +----------+------+ :\n" +": | 0 | 1 | : : .->| 0 | 2 | .->| ////// | //// | :\n" +": | \"1/Tag\"| o-----+--+-----+-' | \"1/Tag\"| o-----+-' | \"1/Tag\"| null | :\n" +": +----------+-------+ : : +----------+--------+ +----------+------+ :\n" +": : : :\n" +": : : :\n" +"`- - - - - - - - - - - - -' '- - - - - - - - - - - - - - - - - - - - - - - - - -'\n" "```" #: src/std/rc.md:1 msgid "# `Rc`" -msgstr "#`Rc`" +msgstr "# `Rc`" #: src/std/rc.md:3 msgid "" "[`Rc`][1] is a reference-counted shared pointer. Use this when you need to refer\n" "to the same data from multiple places:" msgstr "" -"[`Rc`][1] é um ponteiro compartilhado com contagem de referência. Use isso quando precisar consultar\n" -"aos mesmos dados de vários lugares:" +"[`Rc`][1] é um ponteiro compartilhado com contagem de referência. Use-o quando precisar consultar\n" +"os mesmos dados a partir de vários locais:" #: src/std/rc.md:6 msgid "" @@ -8156,8 +8579,9 @@ msgid "" " that will get dropped." msgstr "" "Se você precisar alterar os dados dentro de um `Rc`, precisará agrupar os dados em\n" -"um tipo como [`Cell` ou `RefCell`][2]. Veja [`Arc`][3] se você estiver em um multi-threaded\n" -"contexto." +"um tipo como [`Cell` ou `RefCell`][2]. Veja [`Arc`][3] se você estiver em um contexto multi-threads.\n" +"Você pode regredir um ponteiro compartilhado dentro de um ponteiro [`Weak`][4] para criar ciclos\n" +"que serão descartados." #: src/std/rc.md:24 msgid "" @@ -8168,7 +8592,8 @@ msgid "" msgstr "" "[1]: https://doc.rust-lang.org/std/rc/struct.Rc.html\n" "[2]: https://doc.rust-lang.org/std/cell/index.html\n" -"[3]: ../concurrency/shared_state/arc.md" +"[3]: ../concurrency/shared_state/arc.md\n" +"[4]: https://doc.rust-lang.org/std/rc/struct.Weak.html" #: src/std/rc.md:31 msgid "" @@ -8181,7 +8606,9 @@ msgid "" msgstr "" "* Como `std::shared_ptr` do C++.\n" "* `clone` é barato: cria um ponteiro para a mesma alocação e aumenta a contagem de referência.\n" -"* `make_mut` realmente clona o valor interno se necessário (\"clone-on-write\") e retorna uma referência mutável." +"* `make_mut` realmente clona o valor interno se necessário (\"clone-on-write\") e retorna uma referência mutável.\n" +"* Você pode invocar `downgrade()` em um `Rc` para obter um objeto contador de referências `Weak` para criar\n" +"ciclos que podem ser apropriadamente descartados (provavelmente combinados com `RefCell`)." #: src/std/rc.md:38 msgid "" @@ -8202,6 +8629,12 @@ msgid "" " children: Vec>>,\n" "}" msgstr "" +"#[derive(Debug)]\n" +"struct No {\n" +" valor: i64,\n" +" pai: Option>>,\n" +" filhos: Vec>>,\n" +"}" #: src/std/rc.md:49 msgid "" @@ -8218,15 +8651,26 @@ msgid "" " }));\n" " root.borrow_mut().children.push(child);" msgstr "" +"fn main() {\n" +" let mut raiz = Rc::new(RefCell::new(No {\n" +" valor: 42,\n" +" pai: None,\n" +" filhos: vec![],\n" +" }));\n" +" let filho = Rc::new(RefCell::new(No {\n" +" valor: 43,\n" +" filhos: vec![],\n" +" pai: Some(Rc::downgrade(&raiz))\n" +" }));\n" +" raiz.borrow_mut().filhos.push(filho);" #: src/std/rc.md:62 -#, fuzzy msgid "" " println!(\"graph: {root:#?}\");\n" "}\n" "```" msgstr "" -" println!(\"após: {a}\");\n" +" println!(\"grafo: {raiz:#?}\");\n" "}\n" "```" @@ -8236,11 +8680,11 @@ msgstr "# Módulos" #: src/modules.md:3 msgid "We have seen how `impl` blocks let us namespace functions to a type." -msgstr "Vimos como os blocos `impl` nos permitem funções de namespace para um tipo." +msgstr "Vimos como os blocos `impl` nos permitem funções de usando espaços de nomes (_namespace_) para um tipo." #: src/modules.md:5 msgid "Similarly, `mod` lets us namespace types and functions:" -msgstr "Da mesma forma, `mod` nos permite tipos e funções de namespace:" +msgstr "Da mesma forma, `mod` nos permite tipos e funções usando espaço de nomes:" #: src/modules.md:7 msgid "" @@ -8253,13 +8697,12 @@ msgid "" msgstr "" "```rust, editable\n" "mod foo {\n" -" pub fn do_something() {\n" -" println!(\"No módulo foo\");\n" +" pub fn qualquer_coisa() {\n" +" println!(\"Qualquer coisa no módulo foo\");\n" " }\n" "}" #: src/modules.md:14 -#, fuzzy msgid "" "mod bar {\n" " pub fn do_something() {\n" @@ -8267,9 +8710,9 @@ msgid "" " }\n" "}" msgstr "" -"barra de mods {\n" -" pub fn do_something() {\n" -" println!(\"No modulo da barra\");\n" +"mod bar {\n" +" pub fn qualquer_coisa() {\n" +" println!(\"Qualquer coisa no modulo bar\");\n" " }\n" "}" @@ -8282,8 +8725,8 @@ msgid "" "```" msgstr "" "fn main() {\n" -" foo::do_something();\n" -" bar::do_something();\n" +" foo::qualquer_coisa();\n" +" bar::qualquer_coisa();\n" "}\n" "```" @@ -8293,14 +8736,17 @@ msgid "" "* Crates are a tree of modules, where a binary crate creates an executable and a library crate compiles to a library.\n" "* Modules define organization, scope, and is the focus of this section." msgstr "" +"* Pacotes (packages) forneces funcionalidades e incluem o arquivo `Cargo.toml` que descreve como gerar o pacote com um ou mais _crates_.\n" +"* _Crates_ são arvores de módulos onde um _crate_ birário cria um executável e um _crate_ de biblioteca compila uma biblioteca.\n" +"* Módulos definem a organização, o escopo e são o foco desta sessão." #: src/modules/visibility.md:1 msgid "# Visibility" -msgstr "# Visibilage" +msgstr "# Visibilidade" #: src/modules/visibility.md:3 msgid "Modules are a privacy boundary:" -msgstr "Os módulos são um limite de privacage:" +msgstr "Os módulos são um limitador de privacidade:" #: src/modules/visibility.md:5 msgid "" @@ -8309,7 +8755,7 @@ msgid "" "* In other words, if an item is visible in module `foo`, it's visible in all the\n" " descendants of `foo`." msgstr "" -"* Os itens do módulo são privados por padrão (oculta detalhes de implementação).\n" +"* Os itens do módulo são privados por padrão (ocultam detalhes de implementação).\n" "* Os itens pai e irmão estão sempre visíveis." #: src/modules/visibility.md:10 @@ -8378,11 +8824,12 @@ msgstr "" #: src/modules/visibility.md:39 msgid "* Use the `pub` keyword to make mods public." -msgstr "" +msgstr "* Use a palavra reservada `pub` para tornar um módulo público." #: src/modules/visibility.md:41 msgid "Additionally, there are advanced `pub(...)` specifiers to restrict the scope of public visibility." -msgstr "" +msgstr "Adicionamente, existem especificadores `pub(...)` avançados para restringir o\n" +"escopo da visibilidade pública." #: src/modules/visibility.md:43 msgid "" @@ -8392,10 +8839,15 @@ msgid "" "* Less commonly, you can give visibility to a specific path.\n" "* In any case, visibility must be granted to an ancestor module (and all of its descendants)." msgstr "" +"* Veja a [Referência Rust](https://doc.rust-lang.org/reference/visibility-and-privacy.html#pubin-path-pubcrate-pubsuper-and-" +"pubself).\n" +"* `pub(crate)` é a configuração padrão de visibilidade.\n" +"* Menos comum, você pode dar visibilidade para um caminho específico.\n" +"* Em todo caso, a visibilidade deve ser concedida ao módulo ancestral (e a todos os seus descendentes)." #: src/modules/paths.md:1 msgid "# Paths" -msgstr "# caminhos" +msgstr "# Caminhos (paths)" #: src/modules/paths.md:3 msgid "Paths are resolved as follows:" @@ -8418,8 +8870,8 @@ msgid "" " * `bar::foo` refers to `foo` in the `bar` crate." msgstr "" "2. Como um caminho absoluto:\n" -" * `crate::foo` refere-se a `foo` na raiz da caixa atual,\n" -" * `bar::foo` refere-se a `foo` na caixa `bar`." +" * `crate::foo` refere-se a `foo` na raiz do _crate_ atual,\n" +" * `bar::foo` refere-se a `foo` no _crate_ `bar`." #: src/modules/filesystem.md:1 msgid "# Filesystem Hierarchy" @@ -8436,7 +8888,7 @@ msgid "" "```" msgstr "" "```rust,editable,compile_fail\n" -"jardim mod;\n" +"mod garden;\n" "```" #: src/modules/filesystem.md:9 @@ -8472,8 +8924,8 @@ msgid "" "* `src/lib.rs` (for a library crate)\n" "* `src/main.rs` (for a binary crate)" msgstr "" -"* `src/lib.rs` (para uma caixa de biblioteca)\n" -"* `src/main.rs` (para uma caixa binária)" +"* `src/lib.rs` (para um _crate_ de biblioteca)\n" +"* `src/main.rs` (para um _crate_ binário)" #: src/exercises/day-2/afternoon.md:1 msgid "# Day 2: Afternoon Exercises" @@ -8499,27 +8951,27 @@ msgstr "" #: src/exercises/day-2/luhn.md:7 msgid "* Ignore all spaces. Reject number with less than two digits." -msgstr "* Ignore todos os espaços. Rejeitar número com menos de dois dígitos." +msgstr "* Ignora todos os espaços. Rejeita números com menos de dois dígitos." #: src/exercises/day-2/luhn.md:9 msgid "" "* Moving from right to left, double every second digit: for the number `1234`,\n" " we double `3` and `1`." msgstr "" -"* Movendo-se da direita para a esquerda, dobre cada segundo dígito: para o número `1234`,\n" -" nós dobramos `3` e `1`." +"* Movendo-se da direita para a esquerda, dobra cada segundo dígito: para o número `1234`,\n" +" dobra os números `3` e `1`." #: src/exercises/day-2/luhn.md:12 msgid "" "* After doubling a digit, sum the digits. So doubling `7` becomes `14` which\n" " becomes `5`." msgstr "" -"* Depois de dobrar um dígito, some os dígitos. Assim, duplicar `7` torna-se `14` que\n" -" torna-se '5'." +"* Depois de dobrar um dígito, soma os dígitos. Assim, duplicar `7` resulta em `14` que\n" +" resulta em `5`." #: src/exercises/day-2/luhn.md:15 msgid "* Sum all the undoubled and doubled digits." -msgstr "* Some todos os dígitos duplicados e duplicados." +msgstr "* Soma todos os dígitos não duplicados e duplicados." #: src/exercises/day-2/luhn.md:17 msgid "* The credit card number is valid if the sum ends with `0`." @@ -8530,7 +8982,7 @@ msgid "" "Copy the following code to and implement the\n" "function:" msgstr "" -"Copie o seguinte código para e implemente o\n" +"Copie o seguinte código para e implemente a\n" "função:" #: src/exercises/day-2/luhn.md:27 @@ -8539,7 +8991,7 @@ msgid "" " unimplemented!()\n" "}" msgstr "" -"pub fn luhn(cc_number: &str) -> bool {\n" +"pub fn luhn(numero_cc: &str) -> bool {\n" " unimplemented!()\n" "}" @@ -8551,7 +9003,7 @@ msgid "" "}" msgstr "" "#[test]\n" -"fn test_non_digit_cc_number() {\n" +"fn test_numero_cc_nao_numerico() {\n" " assert!(!luhn(\"foo\"));\n" "}" @@ -8566,7 +9018,7 @@ msgid "" "}" msgstr "" "#[test]\n" -"fn test_empty_cc_number() {\n" +"fn test_numero_cc_vazio() {\n" " assert!(!luhn(\"\"));\n" " assert!(!luhn(\" \"));\n" " assert!(!luhn(\" \"));\n" @@ -8581,7 +9033,7 @@ msgid "" "}" msgstr "" "#[test]\n" -"fn test_single_digit_cc_number() {\n" +"fn test_numero_cc_um_numero() {\n" " assert!(!luhn(\"0\"));\n" "}" @@ -8593,7 +9045,7 @@ msgid "" "}" msgstr "" "#[test]\n" -"fn test_two_digit_cc_number() {\n" +"fn test_numero_cc_dois_numeros() {\n" " assert!(luhn(\" 0 0 \"));\n" "}" @@ -8607,7 +9059,7 @@ msgid "" "}" msgstr "" "#[test]\n" -"fn test_valid_cc_number() {\n" +"fn test_numero_cc_valido() {\n" " assert!(luhn(\"4263 9826 4026 9299\"));\n" " assert!(luhn(\"4539 3195 0343 6467\"));\n" " assert!(luhn(\"7992 7398 713\"));\n" @@ -8623,7 +9075,7 @@ msgid "" "}" msgstr "" "#[test]\n" -"fn test_invalid_cc_number() {\n" +"fn test_numero_cc_invalido() {\n" " assert!(!luhn(\"4223 9826 4026 9299\"));\n" " assert!(!luhn(\"4539 3195 0343 6476\"));\n" " assert!(!luhn(\"8273 1232 7352 0569\"));\n" @@ -8640,10 +9092,10 @@ msgid "" "_request paths_. The path prefixes can contain a wildcard character which\n" "matches a full segment. See the unit tests below." msgstr "" -"Neste exercício, você está implementando um componente de roteamento de um servidor web. o\n" -"servidor está configurado com um número de _path prefixes_ que são comparados\n" -"_pedir caminhos_. Os prefixos de caminho podem conter um caractere curinga que\n" -"corresponde a um segmento completo. Veja os testes de unage abaixo." +"Neste exercício, você está implementando um componente de roteamento de um servidor web. O\n" +"servidor está configurado com um número de _prefixos de caminhos_ que são comparados\n" +"com os _caminhos pedidos_. Os prefixos de caminho podem conter um caractere curinga que\n" +"corresponde a um segmento completo. Veja os testes unitários abaixo." #: src/exercises/day-2/strings-iterators.md:8 msgid "" @@ -8651,7 +9103,7 @@ msgid "" "pass. Try avoiding allocating a `Vec` for your intermediate results:" msgstr "" "Copie o seguinte código para e faça os testes\n" -"passar. Tente evitar alocar um `Vec` para seus resultados intermediários:" +"passarem. Tente evitar alocar um `Vec` para seus resultados intermediários:" #: src/exercises/day-2/strings-iterators.md:16 msgid "" @@ -8659,7 +9111,7 @@ msgid "" " unimplemented!()\n" "}" msgstr "" -"pub fn prefix_matches(prefix: &str, request_path: &str) -> bool {\n" +"pub fn correspondencia_prefixo(prefixo: &str, caminho_requisitado: &str) -> bool {\n" " unimplemented!()\n" "}" @@ -8672,10 +9124,10 @@ msgid "" " assert!(prefix_matches(\"/v1/publishers\", \"/v1/publishers/abc/books\"));" msgstr "" "#[test]\n" -"fn test_matches_without_wildcard() {\n" -" assert!(prefix_matches(\"/v1/publishers\", \"/v1/publishers\"));\n" -" assert!(prefix_matches(\"/v1/publishers\", \"/v1/publishers/abc-123\"));\n" -" assert!(prefix_matches(\"/v1/publishers\", \"/v1/publishers/abc/books\"));" +"fn test_correspondencia_sem_curinga() {\n" +" assert!(correspondencia_prefixo(\"/v1/autores\", \"/v1/autores\"));\n" +" assert!(correspondencia_prefixo(\"/v1/autores\", \"/v1/autores/abc-123\"));\n" +" assert!(correspondencia_prefixo(\"/v1/autores\", \"/v1/autores/abc/livros\"));" #: src/exercises/day-2/strings-iterators.md:26 src/exercises/day-2/solutions-afternoon.md:146 msgid "" @@ -8684,9 +9136,9 @@ msgid "" " assert!(!prefix_matches(\"/v1/publishers\", \"/v1/parent/publishers\"));\n" "}" msgstr "" -" assert!(!prefix_matches(\"/v1/publishers\", \"/v1\"));\n" -" assert!(!prefix_matches(\"/v1/publishers\", \"/v1/publishersBooks\"));\n" -" assert!(!prefix_matches(\"/v1/publishers\", \"/v1/parent/publishers\"));\n" +" assert!(!correspondencia_prefixo(\"/v1/autores\", \"/v1\"));\n" +" assert!(!correspondencia_prefixo(\"/v1/autores\", \"/v1/autoresLivros\"));\n" +" assert!(!correspondencia_prefixo(\"/v1/autores\", \"/v1/parent/autores\"));\n" "}" #: src/exercises/day-2/strings-iterators.md:31 src/exercises/day-2/solutions-afternoon.md:151 @@ -8707,18 +9159,18 @@ msgid "" " ));" msgstr "" "#[test]\n" -"fn test_matches_with_wildcard() {\n" -" assert!(prefix_matches(\n" -" \"/v1/publishers/*/books\",\n" -" \"/v1/publishers/foo/books\"\n" +"fn test_correspondencia_com_curinga() {\n" +" assert!(correspondencia_prefixo(\n" +" \"/v1/autores/*/livros\",\n" +" \"/v1/autores/foo/livros\"\n" " ));\n" -" assert!(prefix_matches(\n" -" \"/v1/publishers/*/books\",\n" -" \"/v1/publishers/bar/books\"\n" +" assert!(correspondencia_prefixo(\n" +" \"/v1/autores/*/livros\",\n" +" \"/v1/autores/bar/livros\"\n" " ));\n" -" assert!(prefix_matches(\n" -" \"/v1/publishers/*/books\",\n" -" \"/v1/publishers/foo/books/book1\"\n" +" assert!(correspondencia_prefixo(\n" +" \"/v1/autores/*/livros\",\n" +" \"/v1/autores/foo/livros/livro1\"\n" " ));" #: src/exercises/day-2/strings-iterators.md:46 @@ -8731,10 +9183,10 @@ msgid "" "}\n" "```" msgstr "" -" assert!(!prefix_matches(\"/v1/publishers/*/books\", \"/v1/publishers\"));\n" -" assert!(!prefix_matches(\n" -" \"/v1/publishers/*/books\",\n" -" \"/v1/publishers/foo/booksByAuthor\"\n" +" assert!(!correspondencia_prefixo(\"/v1/autores/*/livros\", \"/v1/autores\"));\n" +" assert!(!correspondencia_prefixo(\n" +" \"/v1/autores/*/livros\",\n" +" \"/v1/autores/foo/livrosPorAutor\"\n" " ));\n" "}\n" "```" @@ -8745,47 +9197,45 @@ msgstr "# Bem-vindo ao Dia 3" #: src/welcome-day-3.md:3 msgid "Today, we will cover some more advanced topics of Rust:" -msgstr "Hoje, abordaremos alguns tópicos mais avançados do Rust:" +msgstr "Hoje, abordaremos alguns tópicos mais avançados em Rust:" #: src/welcome-day-3.md:5 msgid "" "* Traits: deriving traits, default methods, and important standard library\n" " traits." msgstr "" -"* Características: características derivadas, métodos padrão e importante biblioteca padrão\n" -" características." +"* Traits (Características): Traits derivadas, métodos padrão e Traits importantes da biblioteca padrão." #: src/welcome-day-3.md:8 msgid "" "* Generics: generic data types, generic methods, monomorphization, and trait\n" " objects." msgstr "" -"* Genéricos: tipos de dados genéricos, métodos genéricos, monomorfização e trait\n" +"* Generics (Genéricos): tipos de dados genéricos, métodos genéricos, monomorfização e trait\n" " objetos." #: src/welcome-day-3.md:11 msgid "* Error handling: panics, `Result`, and the try operator `?`." -msgstr "* Tratamento de erros: panics, `Result` e o operador try `?`." +msgstr "* Tratamento de erros: pânico (_panics_), `Result` e o operador _try_ `?`." #: src/welcome-day-3.md:13 msgid "* Testing: unit tests, documentation tests, and integration tests." -msgstr "* Testes: tests de unage, testes de documentação e testes de integração." +msgstr "* Testes: testes unitários, testes de documentação e testes de integração." #: src/welcome-day-3.md:15 msgid "" "* Unsafe Rust: raw pointers, static variables, unsafe functions, and extern\n" " functions." msgstr "" -"* Rust inseguro: ponteiros brutos, variáveis estáticas, funções inseguras e funções externas\n" -" funções." +"* Rust inseguro (unsafe): ponteiros brutos, variáveis estáticas, funções inseguras e funções externas." #: src/traits.md:1 msgid "# Traits" -msgstr "# Características" +msgstr "# Traits (Características)" #: src/traits.md:3 msgid "Rust lets you abstract over types with traits. They're similar to interfaces:" -msgstr "Rust permite abstrair tipos com características. Eles são semelhantes às interfaces:" +msgstr "Rust permite abstrair características dos tipos usando `trait`. Eles são semelhantes às interfaces:" #: src/traits.md:5 msgid "" @@ -8795,25 +9245,23 @@ msgid "" "}" msgstr "" "```rust,editable\n" -"trait Greet {\n" -" fn say_hello(&self);\n" +"trait Saudar {\n" +" fn diz_ola(&self);\n" "}" #: src/traits.md:10 -#, fuzzy msgid "" "struct Dog {\n" " name: String,\n" "}" msgstr "" "struct Cachorro {\n" -" name: String,\n" +" nome: String,\n" "}" #: src/traits.md:14 -#, fuzzy msgid "struct Cat; // No name, cats won't respond to it anyway." -msgstr "Cat estrutura; // Sem name, os gatos não vão responder de qualquer maneira." +msgstr "struct Gato; // Sem nome, os gatos não vão responder de qualquer maneira." #: src/traits.md:16 msgid "" @@ -8823,9 +9271,9 @@ msgid "" " }\n" "}" msgstr "" -"impl Greet for Dog {\n" -" fn say_hello(&self) {\n" -" println!(\"Wuf, meu name é {}!\", self.name);\n" +"impl Saudar for Cachorro {\n" +" fn diz_ola(&self) {\n" +" println!(\"Wuf, meu nome é {}!\", self.nome);\n" " }\n" "}" @@ -8837,8 +9285,8 @@ msgid "" " }\n" "}" msgstr "" -"impl Greet for Cat {\n" -" fn say_hello(&self) {\n" +"impl Saudar for Gato {\n" +" fn diz_ola(&self) {\n" " println!(\"Miau!\");\n" " }\n" "}" @@ -8857,12 +9305,12 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let pets: Vec> = vec![\n" -" Box::new(Dog { name: String::from(\"Fido\") }),\n" -" Box::new(Cat),\n" +" let pets: Vec> = vec![\n" +" Box::new(Cachorro{ nome: String::from(\"Fido\") }),\n" +" Box::new(Gato),\n" " ];\n" " for pet in pets {\n" -" pet.say_hello();\n" +" pet.diz_ola();\n" " }\n" "}\n" "```" @@ -8878,20 +9326,32 @@ msgid "" "a pointer to the actual object and a pointer to the virtual method table for the `Greet` implementation of that particular " "object." msgstr "" -"* Traits podem especificar métodos pré-implementados (padrão) e métodos que os usuários devem implementar por conta " +"* _Traits_ podem especificar métodos pré-implementados (padrão) e métodos que os usuários devem implementar por conta " "própria. Os métodos com implementações padrão podem contar com os métodos necessários.\n" "* Os tipos que implementam uma determinada característica podem ser de tamanhos diferentes. Isso torna impossível ter " "coisas como `Vec` no exemplo acima.\n" "* `dyn Greet` é uma maneira de dizer ao compilador sobre um tipo de tamanho dinâmico que implementa `Greet`.\n" -"* No exemplo, `pets` mantém Fat Pointers para objetos que implementam `Greet`. O Fat Pointer consiste em dois componentes, " -"um ponteiro para o objeto real e um ponteiro para a tabela de métodos virtuais para a implementação `Greet` desse objeto em " +"* No exemplo, `pets` mantém _Fat Pointers_ para objetos que implementam `Greet`. O _Fat Pointer_ consiste em dois componentes, " +"um ponteiro para o objeto real e um ponteiro para a tabela de métodos virtuais para a implementação de `Greet` desse objeto em " "particular." #: src/traits.md:46 msgid "" "Compare these outputs in the above example:\n" +"```rust,ignore\n" +" println!(\"{} {}\", std::mem::size_of::(), std::mem::size_of::());\n" +" println!(\"{} {}\", std::mem::size_of::<&Dog>(), std::mem::size_of::<&Cat>());\n" +" println!(\"{}\", std::mem::size_of::<&dyn Greet>());\n" +" println!(\"{}\", std::mem::size_of::>());\n" +"```" msgstr "" "Compare essas saídas no exemplo acima:\n" +"```rust, ignore\n" +" println!(\"{} {}\", std::mem::size_of::(), std::mem::size_of::());\n" +" println!(\"{} {}\", std::mem::size_of::<&Dog>(), std::mem::size_of::<&Cat>());\n" +" println!(\"{}\", std::mem::size_of::<&dyn Greet>());\n" +" println!(\"{}\", std::mem::size_of::>());\n" +"```" #: src/traits/deriving-traits.md:1 msgid "# Deriving Traits" @@ -8899,7 +9359,7 @@ msgstr "# traits derivados" #: src/traits/deriving-traits.md:3 msgid "You can let the compiler derive a number of traits:" -msgstr "Você pode deixar o compilador derivar uma série de características:" +msgstr "Você pode deixar o compilador derivar uma série de traits:" #: src/traits/deriving-traits.md:5 msgid "" @@ -8911,6 +9371,13 @@ msgid "" " hit_points: u8,\n" "}" msgstr "" +"```rust,editable\n" +"#[derive(Debug, Clone, PartialEq, Eq, Default)]\n" +"struct Jogador {\n" +" nome: String,\n" +" forca: u8,\n" +" pontos_vida: u8,\n" +"}" #: src/traits/deriving-traits.md:13 msgid "" @@ -8923,9 +9390,9 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let p1 = Player::default();\n" +" let p1 = Jogador::default();\n" " let p2 = p1.clone();\n" -" println!(\"É {:?}\\negual a {:?}?\\nA resposta é {}!\", &p1, &p2,\n" +" println!(\"É {:?}\\nigual a {:?}?\\nA resposta é {}!\", &p1, &p2,\n" " if p1 == p2 { \"sim\" } else { \"não\" });\n" "}\n" "```" @@ -8936,7 +9403,7 @@ msgstr "# Métodos Padrão" #: src/traits/default-methods.md:3 msgid "Traits can implement behavior in terms of other trait methods:" -msgstr "As características podem implementar o comportamento em termos de outros métodos de característica:" +msgstr "Traits podem implementar o comportamento em termos de outros métodos de `trait`:" #: src/traits/default-methods.md:5 msgid "" @@ -8949,10 +9416,10 @@ msgid "" "}" msgstr "" "```rust,editable\n" -"trait Equals {\n" -" fn equal(&self, other: &Self) -> bool;\n" -" fn not_equal(&self, other: &Self) -> bool {\n" -" !self.equal(other)\n" +"trait Iguais {\n" +" fn igual(&self, outro: &Self) -> bool;\n" +" fn diferente(&self, outro: &Self) -> bool {\n" +" !self.igual(outro)\n" " }\n" "}" @@ -8962,7 +9429,7 @@ msgid "" "struct Centimeter(i16);" msgstr "" "#[derive(Debug)]\n" -"struct Centimeter(i16);" +"struct Centimetro(i16);" #: src/traits/default-methods.md:16 msgid "" @@ -8972,9 +9439,9 @@ msgid "" " }\n" "}" msgstr "" -"impl Equals for Centimeter {\n" -" fn equal(&self, other: &Centimeter) -> bool {\n" -" self.0 == other.0\n" +"impl Iguais for Centimetro {\n" +" fn igual(&self, outro: &Centimetro) -> bool {\n" +" self.0 == outro.0\n" " }\n" "}" @@ -8988,14 +9455,21 @@ msgid "" "}\n" "```" msgstr "" +"fn main() {\n" +" let a = Centimetro(10);\n" +" let b = Centimetro(20);\n" +" println!(\"{a:?} é igual a {b:?}: {}\", a.igual(&b));\n" +" println!(\"{a:?} é diferente de {b:?}: {}\", a.diferente(&b));\n" +"}\n" +"```" #: src/traits/important-traits.md:1 msgid "# Important Traits" -msgstr "# traits importantes" +msgstr "# Traits importantes" #: src/traits/important-traits.md:3 msgid "We will now look at some of the most common traits of the Rust standard library:" -msgstr "Veremos agora algumas das características mais comuns da biblioteca padrão do Rust:" +msgstr "Veremos agora os _Traits_ mais comuns da biblioteca padrão do Rust:" #: src/traits/important-traits.md:5 msgid "" @@ -9006,12 +9480,12 @@ msgid "" "* [`Drop`][9] used for defining destructors.\n" "* [`Default`][10] used to construct a default instance of a type." msgstr "" -"* [`Iterator`][1] and [`IntoIterator`][2] used in `for` loops,\n" -"* [`From`][3] and [`Into`][4] used to convert values,\n" -"* [`Read`][5] and [`Write`][6] used for IO,\n" -"* [`Add`][7], [`Mul`][8], ... used for operator overloading, and\n" -"* [`Drop`][9] used for defining destructors.\n" -"* [`Default`][10] used to construct a default instance of a type." +"* [`Iterator`][1] e [`IntoIterator`][2] usados em laços `for`,\n" +"* [`From`][3] e [`Into`][4] usados na converção de valores,\n" +"* [`Read`][5] e [`Write`][6] usados em operações de IO,\n" +"* [`Add`][7], [`Mul`][8], ... usado na sobrecarga de operadores,\n" +"* [`Drop`][9] usado para definir destrutores e\n" +"* [`Default`][10] usado para construir uma instância padrão para um tipo." #: src/traits/important-traits.md:12 msgid "" @@ -9033,7 +9507,7 @@ msgstr "# Iteradores" #: src/traits/iterator.md:3 msgid "You can implement the [`Iterator`][1] trait on your own types:" -msgstr "Você pode implementar o trait `Iterator` em seus próprios tipos:" +msgstr "Você pode implementar o _trait_ `Iterator` em seus próprios tipos:" #: src/traits/iterator.md:5 msgid "" @@ -9083,15 +9557,18 @@ msgid "" " \n" "
" msgstr "" -"* `IntoIterator` é o recurso que faz com que os loops funcionem. É implementado por tipos de coleção, como\n" +"* `IntoIterator` é o recurso que faz com que os laços funcionem. É implementado por tipos de coleção, como\n" " `Vec` e referências a eles, como `&Vec` e `&[T]`. Os intervalos também o implementam.\n" -"* O trait `Iterator` implementa muitas operações de programação funcional comuns sobre coleções\n" -" (por exemplo, `mapa`, `filtro`, `redução`, etc). Este é o trait onde você pode encontrar toda a documentação\n" -" sobre eles. Em Rust, essas funções devem produzir o código tão eficiente quanto o imperativo equivalente\n" -" implementações.\n" +"* O _trait_ `Iterator` implementa muitas operações de programação funcional comuns sobre coleções\n" +" (por exemplo, `mapa`, `filtro`, `redução`, etc). Este é o _trait_ onde você pode encontrar toda a documentação\n" +" sobre eles. Em Rust, essas funções devem produzir o código tão eficiente quanto a implementação imperativa equivalente.\n" " \n" "
" +#: src/traits/iterator.md:41 +msgid "[1]: https://doc.rust-lang.org/std/iter/trait.Iterator.html" +msgstr "[1]: https://doc.rust-lang.org/std/marker/trait.Send.html" + #: src/traits/from-iterator.md:1 msgid "# FromIterator" msgstr "# FromIterator" @@ -9121,6 +9598,11 @@ msgid "" " B: FromIterator,\n" " Self: Sized`" msgstr "" +"`Iterator` implementa\n" +"`fn collect(self) -> B\n" +"where\n" +" B: FromIterator,\n" +" Self: Sized`" #: src/traits/from-iterator.md:23 msgid "" @@ -9130,9 +9612,17 @@ msgstr "" "Também existem implementações que permitem fazer coisas legais como converter um\n" "`Iterator>` em um `Result, E>`." +#: src/traits/from-iterator.md:28 +msgid "" +"[1]: https://doc.rust-lang.org/std/iter/trait.FromIterator.html\n" +"[2]: https://doc.rust-lang.org/std/iter/trait.Iterator.html" +msgstr "" +"[1]: https://doc.rust-lang.org/std/iter/trait.FromIterator.html\n" +"[2]: https://doc.rust-lang.org/std/iter/trait.Iterator.html" + #: src/traits/from-into.md:1 msgid "# `From` and `Into`" -msgstr "# `De` e `Into`" +msgstr "# `From` e `Into`" #: src/traits/from-into.md:3 msgid "Types implement [`From`][1] and [`Into`][2] to facilitate type conversions:" @@ -9150,11 +9640,19 @@ msgid "" "}\n" "```" msgstr "" +"```rust,editable\n" +"fn main() {\n" +" let s = String::from(\"Olá\");\n" +" let endereco_ipv4 = std::net::Ipv4Addr::from([127, 0, 0, 1]);\n" +" let um = i16::from(true);\n" +" let maior = i32::from(123i16);\n" +" println!(\"{s}, {endereco_ipv4}, {um}, {maior}\");\n" +"}\n" +"```" #: src/traits/from-into.md:15 -#, fuzzy msgid "[`Into`][2] is automatically implemented when [`From`][1] is implemented:" -msgstr "`Into` é implementado automaticamente quando `From` é implementado:" +msgstr "[`Into`][2] é implementado automaticamente quando [`From`][1] é implementado:" #: src/traits/from-into.md:17 msgid "" @@ -9168,9 +9666,20 @@ msgid "" "}\n" "```" msgstr "" +"```rust,editable\n" +"fn main() {\n" +" let s: String = \"Olá\".into();\n" +" let endereco_ipv4: std::net::Ipv4Addr = [127, 0, 0, 1].into();\n" +" let um: i16 = true.into();\n" +" let maior: i32 = 123i16.into();\n" +" println!(\"{s}, {endereco_ipv4}, {um}, {maior}\");\n" +"}\n" +"```" #: src/traits/from-into.md:27 msgid "" +"
\n" +" \n" "* That's why it is common to only implement `From`, as your type will get `Into` implementation too.\n" "* When declaring a function argument input type like \"anything that can be converted into a `String`\", the rule is " "opposite, you should use `Into`.\n" @@ -9178,20 +9687,30 @@ msgid "" " \n" "
" msgstr "" -"* É por isso que é comum implementar apenas `From`, já que seu tipo também receberá implementação `Into`.\n" +"
\n" +" \n" +"* É por isso que é comum implementar apenas `From`, já que seu tipo também receberá a implementação de `Into`.\n" "* Ao declarar um tipo de entrada de argumento de função como \"qualquer coisa que possa ser convertida em `String`\", a " "regra é oposta, você deve usar `Into`.\n" " Sua função aceitará tipos que implementam `From` e aqueles que _apenas_ implementam `Into`.\n" " \n" "
" +#: src/traits/from-into.md:35 +msgid "" +"[1]: https://doc.rust-lang.org/std/convert/trait.From.html\n" +"[2]: https://doc.rust-lang.org/std/convert/trait.Into.html" +msgstr "" +"[1]: https://doc.rust-lang.org/std/convert/trait.From.html\n" +"[2]: https://doc.rust-lang.org/std/convert/trait.Into.html" + #: src/traits/read-write.md:1 msgid "# `Read` and `Write`" msgstr "# `Read` e `Write`" #: src/traits/read-write.md:3 msgid "Using [`Read`][1] and [`BufRead`][2], you can abstract over `u8` sources:" -msgstr "Usando `Read` e `BufRead`, você pode abstrair as fontes `u8`:" +msgstr "Usando `Read` e `BufRead`, você pode abstrair a leitura de conteúdos do tipo `u8`:" #: src/traits/read-write.md:5 msgid "" @@ -9206,6 +9725,10 @@ msgid "" " buf_reader.lines().count()\n" "}" msgstr "" +"fn contar_linhas(reader: R) -> usize {\n" +" let buf_reader = BufReader::new(reader);\n" +" buf_reader.lines().count()\n" +"}" #: src/traits/read-write.md:13 msgid "" @@ -9215,7 +9738,7 @@ msgid "" msgstr "" "fn main() -> Result<()> {\n" " let slice: &[u8] = b\"foo\\nbar\\nbaz\\n\";\n" -" println!(\"linhas na slice: {}\", count_lines(slice));" +" println!(\"linhas na slice: {}\", contar_linhas(slice));" #: src/traits/read-write.md:17 msgid "" @@ -9226,15 +9749,14 @@ msgid "" "```" msgstr "" " let file = std::fs::File::open(std::env::current_exe()?)?;\n" -" println!(\"linhas no arquivo: {}\", count_lines(file));\n" +" println!(\"linhas no arquivo: {}\", contar_linhas(file));\n" " Ok(())\n" "}\n" "```" #: src/traits/read-write.md:23 -#, fuzzy msgid "Similarly, [`Write`][3] lets you abstract over `u8` sinks:" -msgstr "Da mesma forma, `Write` permite abstrair sobre coletores `u8`:" +msgstr "Da mesma forma, `Write` permite abstrair a escrita de dados do tipo `u8`:" #: src/traits/read-write.md:25 msgid "" @@ -9253,7 +9775,6 @@ msgid "" msgstr "" #: src/traits/read-write.md:33 -#, fuzzy msgid "" "fn main() -> Result<()> {\n" " let mut buffer = Vec::new();\n" @@ -9266,8 +9787,8 @@ msgid "" msgstr "" "fn main() -> Result<()> {\n" " let mut buffer = Vec::new();\n" -" log(&mut buffer, \"Olá\"?);\n" -" log(&mut buffer, \"Mundo\"?);\n" +" log(&mut buffer, \"Olá\")?;\n" +" log(&mut buffer, \"Mundo\")?;\n" " println!(\"Logado: {:?}\", buffer);\n" " Ok(())\n" "}\n" @@ -9285,11 +9806,11 @@ msgstr "" #: src/traits/operators.md:1 msgid "# `Add`, `Mul`, ..." -msgstr "# `Adicionar`, `Mul`, ..." +msgstr "# `Add`, `Mul`, ..." #: src/traits/operators.md:3 msgid "Operator overloading is implemented via traits in [`std::ops`][1]:" -msgstr "A sobrecargo do operador é implementada por meio de características em `std::ops`:" +msgstr "A sobrecarga de operadores é implementada por meio do `trait` contido em [`std::ops`][1]:" #: src/traits/operators.md:5 msgid "" @@ -9297,12 +9818,17 @@ msgid "" "#[derive(Debug, Copy, Clone)]\n" "struct Point { x: i32, y: i32 }" msgstr "" +"```rust,editable\n" +"#[derive(Debug, Copy, Clone)]\n" +"struct Ponto { x: i32, y: i32 }" #: src/traits/operators.md:9 src/exercises/day-2/solutions-morning.md:46 msgid "" "impl std::ops::Add for Point {\n" " type Output = Self;" msgstr "" +"impl std::ops::Add for Ponto {\n" +" type Output = Self;" #: src/traits/operators.md:12 msgid "" @@ -9311,6 +9837,10 @@ msgid "" " }\n" "}" msgstr "" +" fn add(self, other: Self) -> Self {\n" +" Self {x: self.x + other.x, y: self.y + other.y}\n" +" }\n" +"}" #: src/traits/operators.md:17 msgid "" @@ -9322,15 +9852,15 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let p1 = Point { x: 10, y: 20 };\n" -" let p2 = Point { x: 100, y: 200 };\n" +" let p1 = Ponto { x: 10, y: 20 };\n" +" let p2 = Ponto { x: 100, y: 200 };\n" " println!(\"{:?} + {:?} = {:?}\", p1, p2, p1 + p2);\n" "}\n" "```" #: src/traits/operators.md:26 src/traits/drop.md:34 msgid "Discussion points:" -msgstr "Points de discussão:" +msgstr "Pontos de discussão:" #: src/traits/operators.md:28 msgid "" @@ -9344,27 +9874,27 @@ msgid "" " associated types (like `Output`) are controlled by the implementor of a\n" " trait." msgstr "" -"* Você pode implementar `Add` para `&Point`. Em quais situações isso é útil?\n" +"* Você pode implementar `Add` para `&Ponto`. Em quais situações isso é útil?\n" " * Resposta: `Add:add` consome `self`. Se digitar `T` para o qual você está\n" -" sobrecarregar o operador não é `Copy`, você deve considerar sobrecarregar\n" +" sobrecarregando o operador não implementa `Copy`, você deve considerar sobrecarregar\n" " o operador para `&T` também. Isso evita a clonagem desnecessária no\n" -" local de chamada.\n" +" local da chamada.\n" "* Por que `Output` é um tipo associado? Poderia ser feito um parâmetro de tipo?\n" " * Resposta curta: os parâmetros de tipo são controlados pelo chamador, mas\n" -" tipos associados (como `Output`) são controlados pelo implementador de um\n" -" característica." +" tipos associados (como `Output`) são controlados pelo implementador do\n" +" `trait`." #: src/traits/operators.md:40 msgid "[1]: https://doc.rust-lang.org/std/ops/index.html" -msgstr "" +msgstr "[1]: https://doc.rust-lang.org/std/ops/index.html" #: src/traits/drop.md:1 msgid "# The `Drop` Trait" -msgstr "# A característica 'Drop'" +msgstr "# O Trait `Drop`" #: src/traits/drop.md:3 msgid "Values which implement [`Drop`][1] can specify code to run when they go out of scope:" -msgstr "Valores que implementam `Drop` podem especificar o código a ser executado quando saem do escopo:" +msgstr "Valores que implementam [`Drop`][1] podem especificar o código a ser executado quando saem do escopo:" #: src/traits/drop.md:5 msgid "" @@ -9373,6 +9903,10 @@ msgid "" " name: &'static str,\n" "}" msgstr "" +"```rust,editable\n" +"struct Excluivel {\n" +" nome: &'static str,\n" +"}" #: src/traits/drop.md:10 msgid "" @@ -9382,9 +9916,13 @@ msgid "" " }\n" "}" msgstr "" +"impl Drop for Excluivel {\n" +" fn drop(&mut self) {\n" +" println!(\"Executando 'Drop' {}\", self.nome);\n" +" }\n" +"}" #: src/traits/drop.md:16 -#, fuzzy msgid "" "fn main() {\n" " let a = Droppable { name: \"a\" };\n" @@ -9403,17 +9941,17 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let a = Droppable { name: \"a\" };\n" +" let a = Excluivel { nome: \"a\" };\n" " {\n" -" let b = Droppable { name: \"b\" };\n" +" let b = Excluivel { nome: \"b\" };\n" " {\n" -" let c = Droppable { name: \"c\" };\n" -" let d = Droppable { name: \"d\" };\n" +" let c = Excluivel { nome: \"c\" };\n" +" let d = Excluivel { nome: \"d\" };\n" " println!(\"Saindo do bloco B\");\n" " }\n" " println!(\"Saindo do bloco A\");\n" " }\n" -" soltar(a);\n" +" drop(a);\n" " println!(\"Saindo do main\");\n" "}\n" "```" @@ -9426,10 +9964,9 @@ msgid "" " overflow!\n" "* Try replacing `drop(a)` with `a.drop()`." msgstr "" -"* Por que `Drop::drop` não leva `self`?\n" -" * Resposta curta: Se tivesse, `std::mem::drop` seria chamado no final de\n" -" o bloco, resultando em outra chamada para `Drop::drop`, e uma pilha\n" -" transbordar!\n" +"* Por que `Drop::drop` não recebe `self`?\n" +" * Resposta curta: Se recebesse, `std::mem::drop` seria chamado no final do\n" +" bloco, resultando em outra chamada para `Drop::drop` ocasionando um estouro de pilha.\n" "* Tente substituir `drop(a)` por `a.drop()`." #: src/traits/drop.md:44 @@ -9438,11 +9975,11 @@ msgstr "[1]: https://doc.rust-lang.org/std/ops/trait.Drop.html" #: src/traits/default.md:1 msgid "# The `Default` Trait" -msgstr "# A característica 'Drop'" +msgstr "# O Trait `Default`" #: src/traits/default.md:3 msgid "[`Default`][1] trait provides a default implementation of a trait." -msgstr "" +msgstr "O `trait` [`Default`][1] fornece uma implementação padrão para um `trait`." #: src/traits/default.md:5 msgid "" @@ -9456,10 +9993,10 @@ msgid "" msgstr "" "```rust,editable\n" "#[derive(Debug, Default)]\n" -"struct Derived {\n" +"struct Derivado {\n" " x: u32,\n" " y: String,\n" -" z: Implemented,\n" +" z: Implementado,\n" "}" #: src/traits/default.md:13 @@ -9467,6 +10004,8 @@ msgid "" "#[derive(Debug)]\n" "struct Implemented(String);" msgstr "" +"#[derive(Debug)]\n" +"struct Implementado(String);" #: src/traits/default.md:16 msgid "" @@ -9476,6 +10015,11 @@ msgid "" " }\n" "}" msgstr "" +"impl Default for Implementado {\n" +" fn default() -> Self {\n" +" Self(\"Fulano de tal\".into())\n" +" }\n" +"}" #: src/traits/default.md:22 msgid "" @@ -9483,6 +10027,9 @@ msgid "" " let default_struct: Derived = Default::default();\n" " println!(\"{default_struct:#?}\");" msgstr "" +"fn main() {\n" +" let estrutura_default: Derivado = Default::default();\n" +" println!(\"{estrutura_default:#?}\");" #: src/traits/default.md:26 msgid "" @@ -9492,6 +10039,11 @@ msgid "" " };\n" " println!(\"{almost_default_struct:#?}\");" msgstr "" +" let estrutura_quase_default = Derivado {\n" +" y: \"Y é atribuído!\".into(),\n" +" ..Default::default()\n" +" };\n" +" println!(\"{estrutura_quase_default:#?}\");" #: src/traits/default.md:32 msgid "" @@ -9499,6 +10051,9 @@ msgid "" " println!(\"{:#?}\", nothing.unwrap_or_default());\n" "}" msgstr "" +" let nada: Option = None;\n" +" println!(\"{:#?}\", nada.unwrap_or_default());\n" +"}" #: src/traits/default.md:40 msgid "" @@ -9509,6 +10064,14 @@ msgid "" " * The partial struct copy works nicely with default.\n" " * Rust standard library is aware that types can implement `Default` and provides convenience methods that use it." msgstr "" +" * Ele pode ser implementado diretamente ou derivado usando `#[derive(Default)]`.\n" +" * A implementação usando `derive` produz uma instância onde todos os campos são preenchidos\n" +" com seus valores padrão.\n" +" * Consequentemente, todos os tipos usados na estrutuda devem implementar `Default` também.\n" +" * Frequentemente, os tipos padrão do Rust implementam `Default` com valores razoáveis (ex: `0`, `\"\"`, etc).\n" +" * A cópia parcial de estrututas funciona bem em conjunto com _default_.\n" +" * A bilioteca padrão do Rust sabe que tipos podem implementar o `trait` `Default` e, convenientemente,\n" +" provê métodos para isso." #: src/traits/default.md:49 msgid "[1]: https://doc.rust-lang.org/std/default/trait.Default.html" @@ -9516,15 +10079,15 @@ msgstr "[1]: https://doc.rust-lang.org/std/marker/trait.Send.html" #: src/generics.md:1 msgid "# Generics" -msgstr "# Genéricos" +msgstr "# Generics (Genéricos)" #: src/generics.md:3 msgid "" "Rust support generics, which lets you abstract an algorithm (such as sorting)\n" "over the types used in the algorithm." msgstr "" -"Rust oferece suporte a genéricos, que permitem abstrair um algoritmo (como classificação)\n" -"sobre os tipos usados no algoritmo." +"Rust oferece suporte a tipos genéricos, que permitem a um algoritmo (como classificação, por exemplo),\n" +"abstrair os tipos de dados usados no algoritmo." #: src/generics/data-types.md:1 msgid "# Generic Data Types" @@ -9532,7 +10095,7 @@ msgstr "# Tipos de dados genéricos" #: src/generics/data-types.md:3 msgid "You can use generics to abstract over the concrete field type:" -msgstr "Você pode usar genéricos para abstrair sobre o tipo de campo concreto:" +msgstr "Você pode usar tipos genéricos para abstrair o tipo concreto do campo:" #: src/generics/data-types.md:5 msgid "" @@ -9545,7 +10108,7 @@ msgid "" msgstr "" "```rust,editable\n" "#[derive(Debug)]\n" -"struct Point {\n" +"struct Ponto {\n" " x: T,\n" " y: T,\n" "}" @@ -9560,9 +10123,9 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let integer = Point { x: 5, y: 10 };\n" -" let float = Point { x: 1.0, y: 4.0 };\n" -" println!(\"{integer:?} e {float:?}\");\n" +" let inteiro = Ponto { x: 5, y: 10 };\n" +" let real = Ponto { x: 1.0, y: 4.0 };\n" +" println!(\"{inteiro:?} e {real:?}\");\n" "}\n" "```" @@ -9582,7 +10145,7 @@ msgid "" msgstr "" "```rust, editable\n" "#[derive(Debug)]\n" -"struct Point(T, T);" +"struct Ponto(T, T);" #: src/generics/methods.md:9 msgid "" @@ -9591,7 +10154,7 @@ msgid "" " &self.0 // + 10\n" " }" msgstr "" -"impl Point {\n" +"impl Ponto {\n" " fn x(&self) -> &T {\n" " &self.0 // + 10\n" " }" @@ -9613,7 +10176,7 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let p = Point(5, 10);\n" +" let p = Ponto(5, 10);\n" " println!(\"p.x = {}\", p.x());\n" "}\n" "```" @@ -9627,13 +10190,13 @@ msgid "" " * `Point` is still generic and you can use `Point`, but methods in this block will only be available for " "`Point`." msgstr "" -"* *P:* Por que `T` é especificado duas vezes em `impl Point {}`? Isso não é redundante?\n" +"* *Pergunta:* Por que `T` é especificado duas vezes em `impl Ponto {}`? Isso não é redundante?\n" " * Isso ocorre porque é uma seção de implementação genérica para tipo genérico. Eles são genéricos de forma " "independente.\n" " * Significa que esses métodos são definidos para qualquer `T`.\n" -" * É possível escrever `Impl Point { .. }`.\n" -" * `Point` ainda é genérico e você pode usar `Point`, mas os métodos neste bloco só estarão disponíveis para " -"`Point`." +" * É possível escrever `Impl Ponto { .. }`.\n" +" * `Ponto` ainda é genérico e você pode usar `Ponto`, mas os métodos neste bloco só estarão disponíveis para " +"`Ponto`." #: src/generics/trait-bounds.md:1 msgid "# Trait Bounds" @@ -9644,15 +10207,14 @@ msgid "" "When working with generics, you often want to require the types to implement\n" "some trait, so that you can call this trait's methods." msgstr "" -"Ao trabalhar com genéricos, muitas vezes você deseja limitar os tipos. Você consegue fazer isso\n" -"com `T:Trait` ou `impl Trait`:" +"Ao trabalhar com genéricos, muitas vezes você exigir que os tipos implementem algum `trait`\n" +" para poder utilizar os métodos do `trait`." #: src/generics/trait-bounds.md:6 msgid "You can do this with `T: Trait` or `impl Trait`:" -msgstr "" +msgstr "Você consegue fazer isso com `T:Trait` ou `impl Trait`:" #: src/generics/trait-bounds.md:8 -#, fuzzy msgid "" "```rust,editable\n" "fn duplicate(a: T) -> (T, T) {\n" @@ -9660,26 +10222,29 @@ msgid "" "}" msgstr "" "```rust, editable\n" -"fn duplicado(a: T) -> (T, T) {\n" +"fn duplicar(a: T) -> (T, T) {\n" " (a.clone(), a.clone())\n" "}" -#~ #: src/generics/trait-bounds.md:13 -#~ msgid "" -#~ "// Syntactic sugar for:\n" -#~ "// fn add_42_millions>(x: T) -> i32 {\n" -#~ "fn add_42_millions(x: impl Into) -> i32 {\n" -#~ " x.into() + 42_000_000\n" -#~ "}" -#~ msgstr "" +#: src/generics/trait-bounds.md:13 +msgid "" +"// Syntactic sugar for:\n" +"// fn add_42_millions>(x: T) -> i32 {\n" +"fn add_42_millions(x: impl Into) -> i32 {\n" +" x.into() + 42_000_000\n" +"}" +msgstr "" +"// Açucar sintático para:\n" +"// fn somar_42_milhoes>(x: T) -> i32 {\n" +"fn somar_42_milhoes(x: impl Into) -> i32 {\n" +" x.into() + 42_000_000\n" +"}" #: src/generics/trait-bounds.md:19 -#, fuzzy msgid "// struct NotClonable;" -msgstr "// estrutura NotClonable;" +msgstr "// struct NotClonable;" #: src/generics/trait-bounds.md:21 -#, fuzzy msgid "" "fn main() {\n" " let foo = String::from(\"foo\");\n" @@ -9689,22 +10254,25 @@ msgstr "" "fn main() {\n" " let foo = String::from(\"foo\");\n" " let par = duplicar(foo);\n" -" println!(\"{par:?}\");\n" +" println!(\"{par:?}\");" + +#: src/generics/trait-bounds.md:26 +msgid "" +" let many = add_42_millions(42_i8);\n" +" println!(\"{many}\");\n" +" let many_more = add_42_millions(10_000_000);\n" +" println!(\"{many_more}\");\n" +"}\n" +"```" +msgstr "" +" let muito = somar_42_milhoes(42_i8);\n" +" println!(\"{muito}\");\n" +" let muito_mais = somar_42_milhoes(10_000_000);\n" +" println!(\"{muito_mais}\");\n" "}\n" "```" -#~ #: src/generics/trait-bounds.md:26 -#~ msgid "" -#~ " let many = add_42_millions(42_i8);\n" -#~ " println!(\"{many}\");\n" -#~ " let many_more = add_42_millions(10_000_000);\n" -#~ " println!(\"{many_more}\");\n" -#~ "}\n" -#~ "```" -#~ msgstr "" - #: src/generics/trait-bounds.md:35 -#, fuzzy msgid "" "Show a `where` clause, students will encounter it when reading code.\n" " \n" @@ -9720,8 +10288,8 @@ msgstr "" "Mostre uma cláusula `where`, os alunos a encontrarão ao ler o código.\n" " \n" "```rust, ignore\n" -"fn duplicado(a: T) -> (T, T)\n" -"Onde\n" +"fn duplicar(a: T) -> (T, T)\n" +"where\n" " T: Clone,\n" "{\n" " (a.clone(), a.clone())\n" @@ -9743,17 +10311,16 @@ msgstr "" "
" #: src/generics/impl-trait.md:1 -#, fuzzy msgid "# `impl Trait`" -msgstr "# `Impl Trait`" +msgstr "# Trait `impl`" #: src/generics/impl-trait.md:3 msgid "" "Similar to trait bounds, an `impl Trait` syntax can be used in function\n" "arguments and return values:" msgstr "" -"Semelhante aos limites do trait, uma sintaxe `impl Trait` pode ser usada na função\n" -"argumentos e valores de retorno:" +"Semelhante aos limites do _trait_, a sintaxe do _trait_ `impl` pode ser usada em argumentos de funções\n" +"e em valores de retorno:" #: src/generics/impl-trait.md:6 src/generics/trait-objects.md:5 src/generics/trait-objects.md:28 msgid "" @@ -9764,14 +10331,13 @@ msgstr "" "use std::fmt::Display;" #: src/generics/impl-trait.md:9 -#, fuzzy msgid "" "fn get_x(name: impl Display) -> impl Display {\n" " format!(\"Hello {name}\")\n" "}" msgstr "" -"fn get_x(name: display impl) -> display impl {\n" -" format!(\"Olá {name}\")\n" +"fn get_x(nome: impl Display) -> impl Display {\n" +" format!(\"Olá {nome}\")\n" "}" #: src/generics/impl-trait.md:13 @@ -9793,12 +10359,12 @@ msgid "" "* `impl Trait` cannot be used with the `::<>` turbo fish syntax.\n" "* `impl Trait` allows you to work with types which you cannot name." msgstr "" -"* `Impl Trait` não pode ser usado com a sintaxe `::<>` turbo fish.\n" -"* `Impl Trait` permite que você trabalhe com tipos que você não pode namear." +"* `impl Trait` não pode ser usado com a sintaxe turbo fish `::<>`.\n" +"* `impl Trait` permite que você trabalhe com tipos que você não pode nomear." #: src/generics/impl-trait.md:24 msgid "The meaning of `impl Trait` is a bit different in the different positions." -msgstr "O significado de 'impl Trait' é um pouco diferente nas diferentes posições." +msgstr "O significado do _trait_ `impl` é um pouco difere de acordo com sua posição." #: src/generics/impl-trait.md:26 msgid "" @@ -9807,9 +10373,9 @@ msgid "" " without naming the type. This can be useful when you don't want to expose the concrete type in a\n" " public API." msgstr "" -"* Para um parâmetro, `impl Trait` é como um parâmetro genérico anônimo com um limite de característica.\n" -"* Para um tipo de retorno, significa que o tipo de retorno é algum tipo concreto que implementa o trait,\n" -" sem namear o tipo. Isso pode ser útil quando você não deseja expor o tipo concreto em um\n" +"* Como parâmetro, o _trait_ `impl` é como um parâmetro genérico anônimo com um limitador de características (trait).\n" +"* Como tipo de retorno, significa que o tipo de retorno é algum tipo concreto que implementa o _trait_,\n" +" sem namear o tipo. Isso pode ser útil quando você não deseja expor o tipo concreto em uma\n" " API pública." #: src/generics/impl-trait.md:31 @@ -9824,9 +10390,9 @@ msgid "" "
" msgstr "" "Este exemplo é ótimo, porque usa `impl Display` duas vezes. Isso ajuda a explicar\n" -"nada aqui impõe que seja _o mesmo_ tipo `impl Display`. Se usássemos um único\n" +"que nada impõe que, nos dois usos, `impl Display` seja _do mesmo_ tipo. Se usássemos um único\n" "`T: Display`, imporia a restrição de que o tipo `T` de entrada e o tipo `T` de retorno são do mesmo tipo.\n" -"Não funcionaria para esta função específica, pois o tipo que esperamos como entrada provavelmente não é\n" +"Isso não funcionaria para esta função específica, pois o tipo que esperamos como entrada provavelmente não é\n" "o que `format!` retorna. Se quiséssemos fazer o mesmo através da sintaxe `: Display`, precisaríamos de dois\n" "parâmetros genéricos independentes.\n" " \n" @@ -9834,7 +10400,7 @@ msgstr "" #: src/generics/closures.md:1 msgid "# Closures" -msgstr "# fechamentos" +msgstr "# Closures" #: src/generics/closures.md:3 msgid "" @@ -9843,10 +10409,10 @@ msgid "" "[`FnMut`](https://doc.rust-lang.org/std/ops/trait.FnMut.html), and\n" "[`FnOnce`](https://doc.rust-lang.org/std/ops/trait.FnOnce.html) traits:" msgstr "" -"Closures ou expressões lambda têm tipos que não podem ser nameados. No entanto, eles\n" -"implementar especial [`Fn`](https://doc.rust-lang.org/std/ops/trait.Fn.html),\n" +"Closures ou expressões _lambda_ têm tipos que não podem ser nomeados. No entanto, eles\n" +"implementam os _traits_ especiais [`Fn`](https://doc.rust-lang.org/std/ops/trait.Fn.html),\n" "[`FnMut`](https://doc.rust-lang.org/std/ops/trait.FnMut.html) e\n" -"[`FnOnce`](https://doc.rust-lang.org/std/ops/trait.FnOnce.html) características:" +"[`FnOnce`](https://doc.rust-lang.org/std/ops/trait.FnOnce.html):" #: src/generics/closures.md:8 msgid "" @@ -9857,9 +10423,9 @@ msgid "" "}" msgstr "" "```rust,editable\n" -"fn apply_with_log(func: impl FnOnce(i32) -> i32, input: i32) -> i32 {\n" -" println!(\"Calling function on {input}\");\n" -" func(input)\n" +"fn aplicar_com_registro(funcao: impl FnOnce(i32) -> i32, entrada: i32) -> i32 {\n" +" println!(\"Chamando a função com {entrada}\");\n" +" funcao(entrada)\n" "}" #: src/generics/closures.md:14 @@ -9869,8 +10435,8 @@ msgid "" " let mul_5 = |x| x * 5;" msgstr "" "fn main() {\n" -" let add_3 = |x| x + 3;\n" -" let mul_5 = |x| x * 5;" +" let soma_3 = |x| x + 3;\n" +" let multiplica_5 = |x| x * 5;" #: src/generics/closures.md:18 msgid "" @@ -9879,14 +10445,14 @@ msgid "" "}\n" "```" msgstr "" -" println!(\"add_3: {}\", apply_with_log(add_3, 10));\n" -" println!(\"mul_5: {}\", apply_with_log(mul_5, 20));\n" +" println!(\"soma_3: {}\", aplicar_com_registro(soma_3, 10));\n" +" println!(\"multiplica_5: {}\", aplicar_com_registro(multiplica_5, 20));\n" "}\n" "```" #: src/generics/closures.md:25 msgid "If you have an `FnOnce`, you may only call it once. It might consume captured values." -msgstr "Se você tiver um `FnOnce`, poderá chamá-lo apenas uma vez. Pode consumir valores capturados." +msgstr "Se você tiver um `FnOnce`, poderá chamá-lo apenas uma vez. Pode consumir os valores capturados." #: src/generics/closures.md:27 msgid "An `FnMut` might mutate captured values, so you can call it multiple times but not concurrently." @@ -9897,7 +10463,7 @@ msgid "" "An `Fn` neither consumes nor mutates captured values, or perhaps captures nothing at all, so it can\n" "be called multiple times concurrently." msgstr "" -"Um `Fn` não consome nem muda os valores capturados, ou talvez não capture nada, então pode\n" +"Um `Fn` não consome nem muda os valores capturados ou talvez não capture nada, então, pode\n" "ser chamado várias vezes simultaneamente." #: src/generics/closures.md:32 @@ -9906,13 +10472,13 @@ msgid "" "`FnMut` wherever an `FnOnce` is called for, and you can use an `Fn` wherever an `FnMut` or `FnOnce`\n" "is called for." msgstr "" -"`FnMut` é um subtipo de `FnOnce`. `Fn` é um subtipo de `FnMut` e `FnOnce`. ou seja você pode usar um\n" -"`FnMut` sempre que um `FnOnce` é chamado, e você pode usar um `Fn` sempre que um `FnMut` ou `FnOnce`\n" +"`FnMut` é um subtipo de `FnOnce`. `Fn` é um subtipo de `FnMut` e `FnOnce`. Ou seja você pode usar um\n" +"`FnMut` sempre que um `FnOnce` é chamado e você pode usar um `Fn` sempre que um `FnMut` ou um `FnOnce`\n" "é chamado." #: src/generics/closures.md:36 msgid "`move` closures only implement `FnOnce`." -msgstr "Fechamentos `move` implementam apenas `FnOnce`." +msgstr "_Closures_ `move` implementam apenas `FnOnce`." #: src/generics/monomorphization.md:1 msgid "# Monomorphization" @@ -9920,10 +10486,9 @@ msgstr "# Monomorfização" #: src/generics/monomorphization.md:3 msgid "Generic code is turned into non-generic code based on the call sites:" -msgstr "O código genérico é transformado em código não genérico com base nos sites de chamadas:" +msgstr "O código _genérico_ é transformado em código _não genérico_ de acordo com os tipos usados:" #: src/generics/monomorphization.md:5 -#, fuzzy msgid "" "```rust,editable\n" "fn main() {\n" @@ -9934,8 +10499,8 @@ msgid "" msgstr "" "```rust, editable\n" "fn main() {\n" -" let integer = Some(5);\n" -" let flutuar = Some(5.0);\n" +" let inteiro = Some(5);\n" +" let real = Some(5.0);\n" "}\n" "```" @@ -9978,8 +10543,8 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let integer = Option_i32::Some(5);\n" -" let float = Option_f64::Some(5.0);\n" +" let inteiro = Option_i32::Some(5);\n" +" let real = Option_f64::Some(5.0);\n" "}\n" "```" @@ -9989,15 +10554,15 @@ msgid "" "hand-coded the data structures without the abstraction." msgstr "" "Esta é uma abstração de custo zero: você obtém exatamente o mesmo resultado como se tivesse\n" -"codificou manualmente as Structs de dados sem a abstração." +"codificado manualmente as estruturas de dados sem utilizar a abstração." #: src/generics/trait-objects.md:1 msgid "# Trait Objects" -msgstr "# Objetos de característica" +msgstr "# Objetos `trait`" #: src/generics/trait-objects.md:3 msgid "We've seen how a function can take arguments which implement a trait:" -msgstr "Vimos como uma função pode receber argumentos que implementam uma característica:" +msgstr "Vimos como uma função pode receber argumentos que implementam um `trait` :" #: src/generics/trait-objects.md:8 msgid "" @@ -10010,7 +10575,6 @@ msgstr "" "}" #: src/generics/trait-objects.md:12 -#, fuzzy msgid "" "fn main() {\n" " print(123);\n" @@ -10019,8 +10583,8 @@ msgid "" "```" msgstr "" "fn main() {\n" -" imprimir(123);\n" -" imprima(\"Olá\");\n" +" print(123);\n" +" print(\"Olá\");\n" "}\n" "```" @@ -10044,7 +10608,7 @@ msgstr "" #: src/generics/trait-objects.md:26 msgid "For this, we need _trait objects_:" -msgstr "Para isso, precisamos de _trait objects_:" +msgstr "Para isso, precisamos de objetos de _traits_:" #: src/generics/trait-objects.md:31 msgid "" @@ -10057,7 +10621,7 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let xs: Vec> = vec![Box::new(123), Box::new(\"Hello\")];\n" +" let xs: Vec> = vec![Box::new(123), Box::new(\"Olá\")];\n" " for x in xs {\n" " println!(\"x: {x}\");\n" " }\n" @@ -10069,7 +10633,6 @@ msgid "Memory layout after allocating `xs`:" msgstr "Layout da memória após alocar `xs`:" #: src/generics/trait-objects.md:41 -#, fuzzy msgid "" "```bob\n" " Stack Heap\n" @@ -10084,7 +10647,7 @@ msgid "" ": : : | | | +----+----+----+----+----+ :\n" "`- - - - - - - - - - - - - -' : | | | :\n" " : | | | +-------------------------+ :\n" -" : | | '---->| \"::fmt\" | :\n" +" : | | '---->|\"::fmt\"| :\n" " : | | +-------------------------+ :\n" " : | | :\n" " : | | +----+----+----+----+ :\n" @@ -10092,7 +10655,7 @@ msgid "" " : | +----+----+----+----+ :\n" " : | :\n" " : | +-------------------------+ :\n" -" : '---->| \"::fmt\" | :\n" +" : '---->|\"::fmt\"| :\n" " : +-------------------------+ :\n" " : :\n" " : :\n" @@ -10100,30 +10663,30 @@ msgid "" "```" msgstr "" "```bob\n" -" Pilha\n" -".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - -.\n" -": : : :\n" -": xs : : :\n" -": +-----------+-------+ : : +-----+-----+ :\n" -": | ptr | o---+---+-----+-->| oo | oo | :\n" -": | len | 2 | : : +-|-|-+-|-|-+ :\n" -": | capacage | 2 | : : | | | | +----+----+----+----+----+ :\n" -": +-----------+-------+ : : | | | '-->| H | e | eu | eu | o | :\n" -": : : | | | +----+----+----+----+----+:\n" -"`- - - - - - - - - - - - - -' : | | | :\n" -" : | | | +-------------------------+ :\n" -" : | | '---->| \"::fmt\" | :\n" -" : | | +-------------------------+ :\n" -" : | | :\n" -" : | | +----+----+----+----+:\n" -" : | '-->| 7b | 00 | 00 | 00 | :\n" -" : | +----+----+----+----+ :\n" -" : | :\n" -" : | +-------------------------+ :\n" -" : '---->| \"::fmt\" | :\n" -" : +-------------------------+ :\n" -" : :\n" -" : :\n" +" Stack Heap\n" +".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": xs : : :\n" +": +------------+-------+ : : +-----+-----+ :\n" +": | ponteir | o---+--+-----+-->| o o | o o | :\n" +": | tamanho | 2 | : : +-|-|-+-|-|-+ :\n" +": | capacidade | 2 | : : | | | | +----+----+----+ :\n" +": +------------+-------+ : : | | | '-->| O | l | á | :\n" +": : : | | | +----+----+----+ :\n" +"`- - - - - - - - - - - - - -' : | | | :\n" +" : | | | +-------------------------+ :\n" +" : | | '---->|\"::fmt\"| :\n" +" : | | +-------------------------+ :\n" +" : | | :\n" +" : | | +----+----+----+----+ :\n" +" : | '-->| 7b | 00 | 00 | 00 | :\n" +" : | +----+----+----+----+ :\n" +" : | :\n" +" : | +-------------------------+ :\n" +" : '---->|\"::fmt\"| :\n" +" : +-------------------------+ :\n" +" : :\n" +" : :\n" " '- - - - - - - - - - - - - - - - - - - - - - - -'\n" "```" @@ -10132,8 +10695,8 @@ msgid "" "Similarly, you need a trait object if you want to return different types\n" "implementing a trait:" msgstr "" -"Da mesma forma, você precisa de um objeto de característica se quiser retornar valores diferentes\n" -"implementando uma característica:" +"Da mesma forma, você precisa de um objeto de _traits_ se quiser retornar valores diferentes\n" +"implementando um `trait`:" #: src/generics/trait-objects.md:72 msgid "" @@ -10147,7 +10710,7 @@ msgid "" "}" msgstr "" "```rust,editable\n" -"fn numbers(n: i32) -> Box> {\n" +"fn numeros(n: i32) -> Box> {\n" " if n > 0 {\n" " Box::new(0..n)\n" " } else {\n" @@ -10163,8 +10726,8 @@ msgid "" "}" msgstr "" "fn main() {\n" -" println!(\"{:?}\", numbers(-5).collect::>());\n" -" println!(\"{:?}\", numbers(5).collect::>());\n" +" println!(\"{:?}\", numeros(-5).collect::>());\n" +" println!(\"{:?}\", numeros(5).collect::>());\n" "}" #: src/exercises/day-3/morning.md:1 @@ -10173,7 +10736,7 @@ msgstr "# Dia 3: Exercícios matinais" #: src/exercises/day-3/morning.md:3 msgid "We will design a classical GUI library traits and trait objects." -msgstr "Vamos projetar uma biblioteca clássica de traits de GUI e objetos de trait." +msgstr "Vamos projetar uma biblioteca clássica de _traits_ de GUI e objetos de `trait`." #: src/exercises/day-3/simple-gui.md:1 msgid "# A Simple GUI Library" @@ -10184,12 +10747,12 @@ msgid "" "Let us design a classical GUI library using our new knowledge of traits and\n" "trait objects." msgstr "" -"Vamos projetar uma biblioteca GUI clássica usando nosso novo conhecimento de características e\n" -"objetos de traits." +"Vamos projetar uma biblioteca GUI clássica usando nosso novo conhecimento de _traits_ e\n" +"objetos de `trait`." #: src/exercises/day-3/simple-gui.md:6 msgid "We will have a number of widgets in our library:" -msgstr "Teremos vários widgets em nossa biblioteca:" +msgstr "Teremos vários _widgets_ em nossa biblioteca:" #: src/exercises/day-3/simple-gui.md:8 msgid "" @@ -10198,25 +10761,24 @@ msgid "" " button is pressed.\n" "* `Label`: has a `label`." msgstr "" -"* `Janela`: tem um `título` e contém outros widgets.\n" -"* `Button`: tem um `label` e uma função de callback que é invocada quando o\n" +"* `Window`: tem um `título` e contém outros _widgets_.\n" +"* `Button`: tem um `rótulo` e uma função de _callback_ que é invocada quando o\n" " botão é pressionado.\n" -"* `Label`: tem um `label`." +"* `Label`: tem um `rótulo`." #: src/exercises/day-3/simple-gui.md:13 msgid "The widgets will implement a `Widget` trait, see below." -msgstr "Os widgets irão implementar uma característica `Widget`, veja abaixo." +msgstr "Os _widgets_ irão implementar o `trait` `Widget`, veja abaixo." #: src/exercises/day-3/simple-gui.md:15 msgid "" "Copy the code below to , fill in the missing\n" "`draw_into` methods so that you implement the `Widget` trait:" msgstr "" -"Copie o código abaixo para , preencha os campos que faltam\n" -"métodos `draw_into` para que você implemente o trait `Widget`:" +"Copie o código abaixo para , codifique os\n" +"métodos `draw_into` para que você implemente o `trait` `Widget`:" #: src/exercises/day-3/simple-gui.md:18 src/exercises/day-3/safe-ffi-wrapper.md:25 -#, fuzzy msgid "" "```rust,should_panic\n" "// TODO: remove this when you're done with your implementation.\n" @@ -10224,7 +10786,7 @@ msgid "" msgstr "" "```rust,should_panic\n" "// TODO: remova isso quando terminar sua implementação.\n" -"#![allow(unused_imports, used_variables, dead_code)]" +"#![allow(unused_imports, unused_variables, dead_code)]" #: src/exercises/day-3/simple-gui.md:22 msgid "" @@ -10245,7 +10807,6 @@ msgstr "" " fn draw_into(&self, buffer: &mut dyn std::fmt::Write);" #: src/exercises/day-3/simple-gui.md:29 src/exercises/day-3/solutions-morning.md:30 -#, fuzzy msgid "" " /// Draw the widget on standard output.\n" " fn draw(&self) {\n" @@ -10256,8 +10817,8 @@ msgid "" "}" msgstr "" " /// Desenha o widget na saída padrão.\n" -" fn desenhar(&self) {\n" -" let buffer mudo = String::new();\n" +" fn draw(&self) {\n" +" let mut buffer = String::new();\n" " self.draw_into(&mut buffer);\n" " println!(\"{}\", &buffer);\n" " }\n" @@ -10414,7 +10975,6 @@ msgstr "" " }" #: src/exercises/day-3/simple-gui.md:112 -#, fuzzy msgid "" "fn main() {\n" " let mut window = Window::new(\"Rust GUI Demo 1.23\");\n" @@ -10430,7 +10990,7 @@ msgstr "" "fn main() {\n" " let mut window = Window::new(\"Rust GUI Demo 1.23\");\n" " window.add_widget(Box::new(Label::new(\"Esta é uma pequena demonstração de GUI de texto.\")));\n" -" window.add_widget(Caixa::new(Botão::new(\n" +" window.add_widget(Box::new(Button::new(\n" " \"Clique em mim!\",\n" " Box::new(|| println!(\"Você clicou no botão!\")),\n" " )));\n" @@ -10440,7 +11000,7 @@ msgstr "" #: src/exercises/day-3/simple-gui.md:123 msgid "The output of the above program can be something simple like this:" -msgstr "A saída do programa acima pode ser algo simples como isto:" +msgstr "A saída do programa acima pode ser algo simples como:" #: src/exercises/day-3/simple-gui.md:125 msgid "" @@ -10463,7 +11023,7 @@ msgid "" "| Click me! |\n" "```" msgstr "" -"| Clique em mim! |\n" +"| Clique-me! |\n" "```" #: src/exercises/day-3/simple-gui.md:135 @@ -10473,9 +11033,9 @@ msgid "" "formatting operators. In particular, notice how you can pad with different\n" "characters (here a `'/'`) and how you can control alignment:" msgstr "" -"Se você quiser desenhar texto alinhado, você pode usar o\n" -"[fill/alignment](https://doc.rust-lang.org/std/fmt/index.html#fillalignment)\n" -"operadores de formatação. Em particular, observe como você pode preencher com diferentes\n" +"Se você quiser desenhar texto alinhado, você pode usar os\n" +"operadores de formatação [fill/alignment](https://doc.rust-lang.org/std/fmt/index.html#fillalignment).\n" +"Em particular, observe como você pode preencher com diferentes\n" "caracteres (aqui um `'/'`) e como você pode controlar o alinhamento:" #: src/exercises/day-3/simple-gui.md:140 @@ -10491,10 +11051,10 @@ msgid "" msgstr "" "```rust, editable\n" "fn main() {\n" -" let width = 10;\n" -" println!(\"alinhado à esquerda: |{:/width$}|\", \"foo\");\n" +" let largura = 10;\n" +" println!(\"alinhado à esquerda: |{:/largura$}|\", \"foo\");\n" "}\n" "```" @@ -10516,14 +11076,14 @@ msgid "" "```" msgstr "" "```texto\n" -"+--------------------------------+\n" -"| Rust GUI Demonstração 1.23 |\n" -"+==================================+\n" +"+--------------------------------------------------+\n" +"| Rust GUI Demonstração 1.23 |\n" +"+==================================================+\n" "| Esta é uma pequena demonstração de GUI de texto. |\n" -"| +-----------+ |\n" -"| | Clique em mim! | |\n" -"| +-----------+ |\n" -"+--------------------------------+\n" +"| +----------------+ |\n" +"| | Clique-me! | |\n" +"| +----------------+ |\n" +"+--------------------------------------------------+\n" "```" #: src/error-handling.md:1 @@ -10532,23 +11092,23 @@ msgstr "# Manipulação de erros" #: src/error-handling.md:3 msgid "Error handling in Rust is done using explicit control flow:" -msgstr "O tratamento de erros no Rust é feito usando o fluxo de controle explícito:" +msgstr "O tratamento de erros em Rust é feito usando o fluxo de controle explícito:" #: src/error-handling.md:5 msgid "" "* Functions that can have errors list this in their return type,\n" "* There are no exceptions." msgstr "" -"* As funções que podem ter erros listam isso em seu tipo de retorno,\n" +"* As funções que podem ter erros mostram isso em seu tipo de retorno.\n" "* Não há exceções." #: src/error-handling/panics.md:1 msgid "# Panics" -msgstr "# Pânico" +msgstr "# Panics (Pânico)" #: src/error-handling/panics.md:3 msgid "Rust will trigger a panic if a fatal error happens at runtime:" -msgstr "O Rust acionará um pânico se um erro fatal ocorrer em tempo de execução:" +msgstr "O Rust disparará um _panic_ (pânico) se um erro fatal ocorrer em tempo de execução:" #: src/error-handling/panics.md:5 msgid "" @@ -10572,13 +11132,13 @@ msgid "" " * Panics are symptoms of bugs in the program.\n" "* Use non-panicking APIs (such as `Vec::get`) if crashing is not acceptable." msgstr "" -"* Panics são para erros irrecuperáveis e inesperados.\n" +"* _Pânicos_ são para erros irrecuperáveis e inesperados.\n" " * Pânicos são sintomas de bugs no programa.\n" -"* Use APIs sem pânico (como `Vec::get`) se travar não for aceitável." +"* Use APIs que não disparam erros do tipo _pânico_ (como `Vec::get`) se travar o programa não for aceitável." #: src/error-handling/panic-unwind.md:1 msgid "# Catching the Stack Unwinding" -msgstr "# Pegando a pilha desenrolando" +msgstr "# Capturando o desenrolar da pilha" #: src/error-handling/panic-unwind.md:3 msgid "By default, a panic will cause the stack to unwind. The unwinding can be caught:" @@ -10605,7 +11165,6 @@ msgstr "" "assert!(result.is_ok());" #: src/error-handling/panic-unwind.md:13 -#, fuzzy msgid "" "let result = panic::catch_unwind(|| {\n" " panic!(\"oh no!\");\n" @@ -10614,7 +11173,7 @@ msgid "" "```" msgstr "" "let result = panic::catch_unwind(|| {\n" -" pânico!(\"oh não!\");\n" +" panic!(\"oh não!\");\n" "});\n" "assert!(result.is_err());\n" "```" @@ -10625,21 +11184,21 @@ msgid "" " request crashes.\n" "* This does not work if `panic = 'abort'` is set in your `Cargo.toml`." msgstr "" -"* Isso pode ser útil em servidores que devem continuar rodando mesmo se um único\n" -" pedido falha.\n" +"* Isso pode ser útil em servidores que devem continuar rodando mesmo se uma\n" +" requisição tenha falhado.\n" "* Isso não funciona se `panic = 'abort'` estiver definido em seu `Cargo.toml`." #: src/error-handling/result.md:1 msgid "# Structured Error Handling with `Result`" -msgstr "# Tratamento de erro estruturado com `Result`" +msgstr "# Tratamento estruturado de erros com `Result`" #: src/error-handling/result.md:3 msgid "" "We have already seen the `Result` enum. This is used pervasively when errors are\n" "expected as part of normal operation:" msgstr "" -"Já vimos a Enum `Result`. Isso é usado amplamente quando os erros são\n" -"esperado como parte da operação normal:" +"Já vimos o _Enum_ `Result`. Ele é usado amplamente quando os erros são\n" +"esperados como parte da operação normal:" #: src/error-handling/result.md:6 msgid "" @@ -10669,12 +11228,12 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let file = File::open(\"diary.txt\");\n" -" match file {\n" -" Ok(mut file) => {\n" -" let mut contents = String::new();\n" -" file.read_to_string(&mut contents);\n" -" println!(\"Querido diário: {contents}\");\n" +" let arquivo = File::open(\"diario.txt\");\n" +" match arquivo {\n" +" Ok(mut arquivo) => {\n" +" let mut conteudo = String::new();\n" +" arquivo.read_to_string(&mut conteudo);\n" +" println!(\"Querido diário: {conteudo}\");\n" " },\n" " Err(err) => {\n" " println!(\"Não foi possível abrir o diário: {err}\");\n" @@ -10695,9 +11254,9 @@ msgid "" msgstr "" " * Como em `Option`, o valor bem-sucedido fica dentro de `Result`, forçando o desenvolvedor a\n" " extraí-lo explicitamente. Isso encoraja a verificação de erros. No caso em que um erro nunca deve acontecer,\n" -" `unwrap()` ou `expect()` podem ser chamados, e isso também é um sinal da intenção do desenvolvedor.\n" -" * A documentação do `Resultado` é uma leitura recomendada. Não durante o curso, mas vale a pena mencionar.\n" -" Ele contém muitos métodos e funções de conveniência que ajudam na programação de estilo funcional.\n" +" `unwrap()` ou `expect()` podem ser chamados, e isso sinaliza a intenção do desenvolvedor.\n" +" * A documentação de `Result` é uma leitura recomendada. Não durante o curso, mas vale a pena mencioná-la.\n" +" Ele contém muitos métodos e funções de conveniência que ajudam na programação ao estilo funcional.\n" " \n" "" @@ -10710,8 +11269,8 @@ msgid "" "The try-operator `?` is used to return errors to the caller. It lets you turn\n" "the common" msgstr "" -"O operador try `?` é usado para retornar erros ao chamador. Ele permite que você vire\n" -"o comum" +"O operador _try_ `?` é usado para retornar erros ao chamador da função.\n" +"Se ocorrer um erro, este é retornado imediatamente ao chamador como retorno da função." #: src/error-handling/try-operator.md:6 msgid "" @@ -10723,15 +11282,15 @@ msgid "" "```" msgstr "" "```rust, ignore\n" -"match some_expression {\n" -" Ok(value) => value,\n" +"match alguma_expressao {\n" +" Ok(valor) => valor,\n" " Err(err) => return Err(err),\n" "}\n" "```" #: src/error-handling/try-operator.md:13 msgid "into the much simpler" -msgstr "no muito mais simples" +msgstr "Pode ser simplificado por:" #: src/error-handling/try-operator.md:15 msgid "" @@ -10740,7 +11299,7 @@ msgid "" "```" msgstr "" "```rust, ignore\n" -"some_expression?\n" +"alguma_expressao?\n" "```" #: src/error-handling/try-operator.md:19 @@ -10762,8 +11321,8 @@ msgid "" "fn read_username(path: &str) -> Result {\n" " let username_file_result = fs::File::open(path);" msgstr "" -"fn read_username(path: &str) -> Result {\n" -" let username_file_result = fs::File::open(path);" +"fn ler_nome_usuario(caminho: &str) -> Result {\n" +" let arquivo_nome_usuario_result = fs::File::open(caminho);" #: src/error-handling/try-operator.md:28 msgid "" @@ -10772,14 +11331,14 @@ msgid "" " Err(e) => return Err(e),\n" " };" msgstr "" -" let mut username_file = match username_file_result {\n" -" Ok(file) => file,\n" +" let mut arquivo_nome_usuario = match arquivo_nome_usuario_result {\n" +" Ok(arquivo) => arquivo,\n" " Err(e) => return Err(e),\n" " };" #: src/error-handling/try-operator.md:33 msgid " let mut username = String::new();" -msgstr "" +msgstr " let mut nome_usuario = String::new();" #: src/error-handling/try-operator.md:35 msgid "" @@ -10789,6 +11348,11 @@ msgid "" " }\n" "}" msgstr "" +" match arquivo_nome_usuario.read_to_string(&mut nome_usuario) {\n" +" Ok(_) => Ok(nome_usuario),\n" +" Err(e) => Err(e),\n" +" }\n" +"}" #: src/error-handling/try-operator.md:41 msgid "" @@ -10799,14 +11363,20 @@ msgid "" "}\n" "```" msgstr "" +"fn main() {\n" +" //fs::write(\"config.dat\", \"alice\").unwrap();\n" +" let nome_usuario = ler_nome_usuario(\"config.dat\");\n" +" println!(\"Nome de usuário ou erro: {nome_usuario:?}\");\n" +"}\n" +"```" #: src/error-handling/try-operator.md:52 src/error-handling/converting-error-types-example.md:52 msgid "" "* The `username` variable can be either `Ok(string)` or `Err(error)`.\n" "* Use the `fs::write` call to test out the different scenarios: no file, empty file, file with username." msgstr "" -"* A variável `username` pode ser `Ok(string)` ou `Err(error)`.\n" -"* Use a chamada `fs::write` para testar os diferentes cenários: nenhum arquivo, arquivo vazio, arquivo com name de usuário." +"* A variável `nome_usuario` pode ser `Ok(string)` ou `Err(error)`.\n" +"* Use a chamada `fs::write` para testar os diferentes cenários: nenhum arquivo, arquivo vazio e arquivo com name de usuário." #: src/error-handling/converting-error-types.md:1 src/error-handling/converting-error-types-example.md:1 msgid "# Converting Error Types" @@ -10814,7 +11384,7 @@ msgstr "# Convertendo Tipos de Erro" #: src/error-handling/converting-error-types.md:3 msgid "The effective expansion of `?` is a little more complicated than previously indicated:" -msgstr "A expansão efetiva de `?` é um pouco mais complicada do que indicado anteriormente:" +msgstr "A efetiva expansão do operador `?` é um pouco mais complicada do que indicado anteriormente:" #: src/error-handling/converting-error-types.md:5 msgid "" @@ -10823,7 +11393,7 @@ msgid "" "```" msgstr "" "```rust,ignore\n" -"expression?\n" +"expressao?\n" "```" #: src/error-handling/converting-error-types.md:9 @@ -10840,8 +11410,8 @@ msgid "" "```" msgstr "" "```rust,ignore\n" -"match expression {\n" -" Ok(value) => value,\n" +"match expressao {\n" +" Ok(valor) => valor,\n" " Err(err) => return Err(From::from(err)),\n" "}\n" "```" @@ -10877,17 +11447,16 @@ msgid "" "}" msgstr "" "#[derive(Debug)]\n" -"enum ReadUsernameError {\n" +"enum LerNomeUsuarioError {\n" " IoError(io::Error),\n" -" EmptyUsername(String),\n" +" NomeUsuarioVazio(String),\n" "}" #: src/error-handling/converting-error-types-example.md:15 msgid "impl Error for ReadUsernameError {}" -msgstr "impl Error for ReadUsernameError {}" +msgstr "impl Error for LerNomeUsuarioError {}" #: src/error-handling/converting-error-types-example.md:17 -#, fuzzy msgid "" "impl Display for ReadUsernameError {\n" " fn fmt(&self, f: &mut Formatter) -> fmt::Result {\n" @@ -10898,11 +11467,11 @@ msgid "" " }\n" "}" msgstr "" -"exibição impl para ReadUsernameError {\n" +"impl Display for LerNomeUsuarioError {\n" " fn fmt(&self, f: &mut Formatter) -> fmt::Result {\n" " match self {\n" -" Self::IoError(e) => write!(f, \"IO error: {}\", e),\n" -" Self::EmptyUsername(filename) => write!(f, \"Não foi encontrado name de usuário em {}\", filename),\n" +" Self::IoError(e) => write!(f, \"Erro de E/S: {}\", e),\n" +" Self::NomeUsuarioVazio(arquivo) => write!(f, \"Não foi encontrado nome de usuário em {}\", arquivo),\n" " }\n" " }\n" "}" @@ -10915,9 +11484,9 @@ msgid "" " }\n" "}" msgstr "" -"impl From for ReadUsernameError {\n" -" fn from(err: io::Error) -> ReadUsernameError {\n" -" ReadUsernameError::IoError(err)\n" +"impl From for LerNomeUsuarioError {\n" +" fn from(err: io::Error) -> LerNomeUsuarioError {\n" +" LerNomeUsuarioError::IoError(err)\n" " }\n" "}" @@ -10932,9 +11501,16 @@ msgid "" " Ok(username)\n" "}" msgstr "" +"fn ler_nome_usuario(caminho: &str) -> Result {\n" +" let mut nome_usuario = String::with_capacity(100);\n" +" File::open(caminho)?.read_to_string(&mut nome_usuario)?;\n" +" if nome_usuario.is_empty() {\n" +" return Err(LerNomeUsuarioError::NomeUsuarioVazio(String::from(caminho)));\n" +" }\n" +" Ok(nome_usuario)\n" +"}" #: src/error-handling/converting-error-types-example.md:41 -#, fuzzy msgid "" "fn main() {\n" " //fs::write(\"config.dat\", \"\").unwrap();\n" @@ -10945,8 +11521,8 @@ msgid "" msgstr "" "fn main() {\n" " //fs::write(\"config.dat\", \"\").unwrap();\n" -" let username = read_username(\"config.dat\");\n" -" println!(\"name de usuário ou erro: {name de usuário:?}\");\n" +" let nome_usuario = ler_nome_usuario(\"config.dat\");\n" +" println!(\"Nome de usuário ou erro: {nome_usuario:?}\");\n" "}\n" "```" @@ -10958,21 +11534,21 @@ msgid "" "`io::Error` doesn't implement them." msgstr "" "É uma boa prática para todos os tipos de erro implementar `std::error::Error`, que requer `Debug` e\n" -"`Mostrar`. Geralmente é útil para eles implementar `Clone` e `Eq` também quando possível, para fazer\n" -"vida mais fácil para testes e consumidores de sua biblioteca. Neste caso, não podemos fazê-lo facilmente, porque\n" +"`Display`. Geralmente é útil para eles implementar `Clone` e `Eq` também quando possível, para tornar\n" +"mais fácil a vida ao testar e consumidor sua biblioteca. Neste caso, não podemos fazê-lo facilmente, porque\n" "`io::Error` não os implementa." #: src/error-handling/deriving-error-enums.md:1 msgid "# Deriving Error Enums" -msgstr "# Derivando enumerações de erro" +msgstr "# Derivando _Enums_ de erro" #: src/error-handling/deriving-error-enums.md:3 msgid "" "The [thiserror](https://docs.rs/thiserror/) crate is a popular way to create an\n" "error enum like we did on the previous page:" msgstr "" -"A caixa [thiserror](https://docs.rs/thiserror/) é uma maneira popular de criar um\n" -"error enum como fizemos na página anterior:" +"O _crate_ [thiserror](https://docs.rs/thiserror/) é uma maneira popular de criar um\n" +"tipo enumerado (enum) de erro, como fizemos na página anterior:" #: src/error-handling/deriving-error-enums.md:6 msgid "" @@ -10987,7 +11563,6 @@ msgstr "" "use thiserror::Error;" #: src/error-handling/deriving-error-enums.md:11 -#, fuzzy msgid "" "#[derive(Debug, Error)]\n" "enum ReadUsernameError {\n" @@ -10998,11 +11573,11 @@ msgid "" "}" msgstr "" "#[derive(Debug, Error)]\n" -"enum ReadUsernameError {\n" +"enum LerNomeUsuarioError {\n" " #[error(\"Não foi possível ler: {0}\")]\n" " IoError(#[from] io::Error),\n" -" #[error(\"Não foi encontrado name de usuário em {0}\")]\n" -" name de usuário vazio(String),\n" +" #[error(\"Não foi encontrado o nome do usuário em {0}\")]\n" +" NomeUsuarioVazio(String),\n" "}" #: src/error-handling/deriving-error-enums.md:19 @@ -11016,13 +11591,13 @@ msgid "" " Ok(username)\n" "}" msgstr "" -"fn read_username(path: &str) -> Result {\n" -" let mut username = String::with_capacity(100);\n" -" fs::File::open(path)?.read_to_string(&mut username)?;\n" -" if username.is_empty() {\n" -" return Err(ReadUsernameError::EmptyUsername(String::from(path)));\n" +"fn ler_nome_usuario(caminho: &str) -> Result {\n" +" let mut nome_usuario = String::with_capacity(100);\n" +" fs::File::open(caminho)?.read_to_string(&mut nome_usuario)?;\n" +" if nome_usuario.is_empty() {\n" +" return Err(LerNomeUsuarioError::NomeUsuarioVazio(String::from(caminho)));\n" " }\n" -" Ok(username)\n" +" Ok(nome_usuario)\n" "}" #: src/error-handling/deriving-error-enums.md:28 src/error-handling/dynamic-errors.md:25 @@ -11038,8 +11613,8 @@ msgid "" msgstr "" "fn main() {\n" " //fs::write(\"config.dat\", \"\").unwrap();\n" -" match read_username(\"config.dat\") {\n" -" Ok(name de usuário) => println!(\"name de usuário: {name de usuário}\"),\n" +" match ler_nome_usuario(\"config.dat\") {\n" +" Ok(nome_usuario) => println!(\"Nome de usuário: {nome_usuario}\"),\n" " Err(err) => println!(\"Erro: {err}\"),\n" " }\n" "}\n" @@ -11051,9 +11626,9 @@ msgid "" "(if the `#[error(...)]` attributes are provided) and `From` (if the `#[from]` attribute is added).\n" "It also works for structs." msgstr "" -"A macro derivação do `thiserror` implementa automaticamente `std::error::Error`, e opcionalmente `Display`\n" +"A macro `thiserror` implementa automaticamente `std::error::Error`, e opcionalmente, `Display`\n" "(se os atributos `#[error(...)]` forem fornecidos) e `From` (se o atributo `#[from]` for adicionado).\n" -"Também funciona para structs." +"Também funciona para estruturas." #: src/error-handling/deriving-error-enums.md:43 msgid "It doesn't affect your public API, which makes it good for libraries." @@ -11068,8 +11643,8 @@ msgid "" "Sometimes we want to allow any type of error to be returned without writing our own enum covering\n" "all the different possibilities. `std::error::Error` makes this easy." msgstr "" -"Às vezes, queremos permitir que qualquer tipo de erro seja retornado sem escrever nossa própria cobertura de Enum\n" -"todas as diferentes possibilages. `std::error::Error` torna isso fácil." +"Às vezes, queremos permitir que qualquer tipo de erro seja retornado sem escrever nosso próprio `Enum`\n" +"abrangendo todas as diferentes possibilidades. `std::error::Error` torna isso fácil." #: src/error-handling/dynamic-errors.md:6 msgid "" @@ -11092,11 +11667,10 @@ msgid "" "struct EmptyUsernameError(String);" msgstr "" "#[derive(Clone, Debug, Eq, Error, PartialEq)]\n" -"#[error(\"Found no username in {0}\")]\n" -"struct EmptyUsernameError(String);" +"#[error(\"Nome de usuário não encontrado em {0}\")]\n" +"struct NomeUsuarioVazioError(String);" #: src/error-handling/dynamic-errors.md:16 -#, fuzzy msgid "" "fn read_username(path: &str) -> Result> {\n" " let mut username = String::with_capacity(100);\n" @@ -11107,13 +11681,13 @@ msgid "" " Ok(username)\n" "}" msgstr "" -"fn read_username(path: &str) -> Result> {\n" -" let mut username = String::with_capacity(100);\n" -" File::open(path)?.read_to_string(&mut name de usuário)?;\n" -" if name de usuário.is_empty() {\n" -" return Err(EmptyUsernameError(String::from(path)).into());\n" +"fn ler_nome_usuario(caminho: &str) -> Result> {\n" +" let mut nome_usuario = String::with_capacity(100);\n" +" File::open(caminho)?.read_to_string(&mut nome_usuario)?;\n" +" if nome_usuario.is_empty() {\n" +" return Err(NomeUsuarioVazioError(String::from(caminho)).into());\n" " }\n" -" Ok (name de usuário)\n" +" Ok (nome_usuario)\n" "}" #: src/error-handling/dynamic-errors.md:36 @@ -11123,10 +11697,10 @@ msgid "" "library, but it can be a good option in a program where you just want to display the error message\n" "somewhere." msgstr "" -"Isso economiza código, mas abre mão da capacage de lidar com diferentes casos de erro de maneira diferente em\n" -"o programa. Como tal, geralmente não é uma boa ideia usar `Box` na API pública de um\n" -"biblioteca, mas pode ser uma boa Option em um programa onde você deseja apenas exibir a mensagem de erro\n" -"algum lugar." +"Isso economiza código, mas abre mão da capacidade de lidar com diferentes casos de erro de maneira diferenciada no\n" +"programa. Como tal, geralmente não é uma boa ideia usar `Box` na API pública de uma\n" +"biblioteca, mas pode ser uma boa opção em um programa onde você deseja apenas exibir a mensagem de erro\n" +"em algum lugar." #: src/error-handling/error-contexts.md:1 msgid "# Adding Context to Errors" @@ -11138,9 +11712,9 @@ msgid "" "contextual information to your errors and allows you to have fewer\n" "custom error types:" msgstr "" -"A caixa de [anyhow](https://docs.rs/anyhow/) amplamente usada pode ajudá-lo a adicionar\n" -"informações contextuais aos seus erros e permite que você tenha menos\n" -"tipos de erro personalizados:" +"O `crate` [anyhow](https://docs.rs/anyhow/) é amplamente usado pode ajudá-lo a adicionar\n" +"informações contextuais aos seus erros permitindo que você tenha menos\n" +"tipos de erros personalizados:" #: src/error-handling/error-contexts.md:7 msgid "" @@ -11150,7 +11724,7 @@ msgid "" "use anyhow::{Context, Result, bail};" msgstr "" "```rust,editable,compile_fail\n" -"use std::{fs, io};\n" +"use std::{fs};\n" "use std::io::Read;\n" "use anyhow::{Context, Result, bail};" @@ -11168,20 +11742,19 @@ msgid "" " Ok(username)\n" "}" msgstr "" -"fn read_username(path: &str) -> Result {\n" -" let mut username = String::with_capacity(100);\n" -" fs::File::open(path)\n" -" .context(format!(\"Falha ao abrir {path}\"))?\n" -" .read_to_string(&mut username)\n" -" .context(\"Falha ao ler\"?);\n" -" if username.is_empty() {\n" -" bail!(\"Não foi encontrado nenhum name de usuário em {path}\");\n" +"fn ler_nome_usuario(caminho: &str) -> Result {\n" +" let mut nome_usuario = String::with_capacity(100);\n" +" fs::File::open(caminho)\n" +" .context(format!(\"Falha ao abrir {caminho}\"))?\n" +" .read_to_string(&mut nome_usuario)\n" +" .context(\"Falha ao ler\")?;\n" +" if nome_usuario.is_empty() {\n" +" bail!(\"Não foi encontrado nenhum nome de usuário em {caminho}\");\n" " }\n" -" Ok (username)\n" +" Ok (nome_usuario)\n" "}" #: src/error-handling/error-contexts.md:24 -#, fuzzy msgid "" "fn main() {\n" " //fs::write(\"config.dat\", \"\").unwrap();\n" @@ -11194,8 +11767,8 @@ msgid "" msgstr "" "fn main() {\n" " //fs::write(\"config.dat\", \"\").unwrap();\n" -" match read_username(\"config.dat\") {\n" -" Ok(name de usuário) => println!(\"name de usuário: {name de usuário}\"),\n" +" match ler_nome_usuario(\"config.dat\") {\n" +" Ok(nome_usuario) => println!(\"Nome de usuário: {nome_usuario}\"),\n" " Err(err) => println!(\"Erro: {err:?}\"),\n" " }\n" "}\n" @@ -11212,10 +11785,10 @@ msgid "" msgstr "" "* `anyhow::Result` é um apelido de tipo para `Result`.\n" "* `anyhow::Error` é essencialmente um wrapper em torno de `Box`. Como tal, geralmente não é\n" -" uma boa escolha para a API pública de uma biblioteca, mas é amplamente utilizada em aplicações.\n" +" uma boa escolha para a API pública de uma biblioteca, mas é amplamente utilizado em aplicações.\n" "* O tipo de erro real dentro dele pode ser extraído para exame, se necessário.\n" -"* A funcionalage fornecida por `anyhow::Result` pode ser familiar para desenvolvedores Go, pois fornece\n" -" padrões de uso e ergonomia semelhantes a `(T, error)` do Go." +"* A funcionalidade fornecida por `anyhow::Result` pode ser familiar para desenvolvedores Go, pois fornece\n" +" padrões de uso e ergonomia semelhantes a `(T, error)` de Go." #: src/testing.md:1 msgid "# Testing" @@ -11223,11 +11796,11 @@ msgstr "# Teste" #: src/testing.md:3 msgid "Rust and Cargo come with a simple unit test framework:" -msgstr "Rust e Cargo vêm com uma estrutura de teste de unage simples:" +msgstr "Rust e Cargo vêm com uma estrutura de testes unitários simples:" #: src/testing.md:5 msgid "* Unit tests are supported throughout your code." -msgstr "* Os testes de unage são suportados em todo o seu código." +msgstr "* Os testes unitários são suportados em todo o seu código." #: src/testing.md:7 msgid "* Integration tests are supported via the `tests/` directory." @@ -11235,11 +11808,11 @@ msgstr "* Testes de integração são suportados através do diretório `tests/` #: src/testing/unit-tests.md:1 msgid "# Unit Tests" -msgstr "# Testes de unage" +msgstr "# Testes unitários" #: src/testing/unit-tests.md:3 msgid "Mark unit tests with `#[test]`:" -msgstr "Marque os testes de unage com `#[test]`:" +msgstr "Marque os testes unitários com `#[test]`:" #: src/testing/unit-tests.md:5 msgid "" @@ -11252,7 +11825,7 @@ msgid "" "}" msgstr "" "```rust,editable\n" -"fn first_word(text: &str) -> &str {\n" +"fn primeira_palavra(text: &str) -> &str {\n" " match text.find(' ') {\n" " Some(idx) => &text[..idx],\n" " None => &text,\n" @@ -11268,7 +11841,7 @@ msgid "" msgstr "" "#[test]\n" "fn teste_vazio() {\n" -" assert_eq!(first_word(\"\"), \"\");\n" +" assert_eq!(primeira_palavra(\"\"), \"\");\n" "}" #: src/testing/unit-tests.md:18 @@ -11279,8 +11852,8 @@ msgid "" "}" msgstr "" "#[test]\n" -"fn test_single_word() {\n" -" assert_eq!(first_word(\"Olá\"), \"Olá\");\n" +"fn test_uma_palavra() {\n" +" assert_eq!(primeira_palavra(\"Olá\"), \"Olá\");\n" "}" #: src/testing/unit-tests.md:23 @@ -11292,14 +11865,14 @@ msgid "" "```" msgstr "" "#[test]\n" -"fn test_multiple_words() {\n" -" assert_eq!(first_word(\"Olá Mundo\"), \"Olá\");\n" +"fn test_multiplas_palavras() {\n" +" assert_eq!(primeira_palavra(\"Olá Mundo\"), \"Olá\");\n" "}\n" "```" #: src/testing/unit-tests.md:29 msgid "Use `cargo test` to find and run the unit tests." -msgstr "Use `cargo test` para encontrar e executar os testes de unage." +msgstr "Use `cargo test` para encontrar e executar os testes unitários." #: src/testing/test-modules.md:1 msgid "# Test Modules" @@ -11310,7 +11883,7 @@ msgid "" "Unit tests are often put in a nested module (run tests on the\n" "[Playground](https://play.rust-lang.org/)):" msgstr "" -"Os testes de unage geralmente são colocados em um módulo aninhado (executar testes no\n" +"Os testes unitários geralmente são colocados em um módulo aninhado (executar testes no\n" "[Playground](https://play.rust-lang.org/)):" #: src/testing/test-modules.md:6 @@ -11356,7 +11929,7 @@ msgid "" "* This lets you unit test private helpers.\n" "* The `#[cfg(test)]` attribute is only active when you run `cargo test`." msgstr "" -"* Isso permite que você teste unages auxiliares privadas.\n" +"* Isso permite que você tenha testes unitários auxiliares e privados.\n" "* O atributo `#[cfg(test)]` só fica ativo quando você executa `cargo test`." #: src/testing/doc-tests.md:1 @@ -11403,7 +11976,7 @@ msgid "" "version=stable&mode=debug&edition=2021&gist=3ce2ad13ea1302f6572cb15cd96becf0)." msgstr "" "* Blocos de código em comentários `///` são vistos automaticamente como código Rust.\n" -"* O código será compilado e executado como parte do `teste de cargo`.\n" +"* O código será compilado e executado como parte do `cargo test`.\n" "* Teste o código acima no [Rust Playground](https://play.rust-lang.org/?" "version=stable&mode=debug&edition=2021&gist=3ce2ad13ea1302f6572cb15cd96becf0)." @@ -11443,11 +12016,11 @@ msgstr "" #: src/testing/integration-tests.md:16 msgid "These tests only have access to the public API of your crate." -msgstr "Esses testes só têm acesso à API pública da sua caixa." +msgstr "Esses testes só têm acesso à API pública do seu `crate`." #: src/unsafe.md:1 msgid "# Unsafe Rust" -msgstr "# rust insegura" +msgstr "# Rust inseguro (unsafe)" #: src/unsafe.md:3 msgid "The Rust language has two parts:" @@ -11467,7 +12040,7 @@ msgid "" "what Unsafe Rust is." msgstr "" "Veremos principalmente Rust seguro neste curso, mas é importante saber\n" -"o que é rust insegura." +"o que é Rust inseguro (_unsafe_)." #: src/unsafe.md:11 msgid "" @@ -11475,11 +12048,11 @@ msgid "" "documented. It is usually wrapped in a safe abstraction layer." msgstr "" "Código inseguro é geralmente pequeno e isolado, e sua correção deve ser cuidadosamente\n" -"documentado. Geralmente é envolto em uma camada de abstração segura." +"documentada. Geralmente é envolto em uma camada de abstração segura." #: src/unsafe.md:14 msgid "Unsafe Rust gives you access to five new capabilities:" -msgstr "O Unsafe Rust oferece acesso a cinco novos recursos:" +msgstr "O código inseguro do Rust oferece acesso a cinco novos recursos:" #: src/unsafe.md:16 msgid "" @@ -11489,11 +12062,11 @@ msgid "" "* Call `unsafe` functions, including `extern` functions.\n" "* Implement `unsafe` traits." msgstr "" -"* Dereference ponteiros brutos.\n" -"* Acesse ou modifique variáveis estáticas mutáveis.\n" -"* Acesse os campos `união`.\n" -"* Chamar funções `inseguras`, incluindo funções `externas`.\n" -"* Implementar traits `inseguros`." +"* Desreferenciar ponteiros brutos.\n" +"* Acessar ou modificar variáveis estáticas mutáveis.\n" +"* Acessar os campos de uma `union`.\n" +"* Chamar funções inseguras (`unsafe`), incluindo funções `externas`.\n" +"* Implementar traits inseguros (`unsafe`)." #: src/unsafe.md:22 msgid "" @@ -11501,7 +12074,7 @@ msgid "" "[Chapter 19.1 in the Rust Book](https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html)\n" "and the [Rustonomicon](https://doc.rust-lang.org/nomicon/)." msgstr "" -"A seguir, abordaremos brevemente os recursos inseguros. Para detalhes completos, consulte\n" +"A seguir, abordaremos brevemente os recursos inseguros. Para detalhes completos, consulte o\n" "[Capítulo 19.1 no Rust Book](https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html)\n" "e o [Rustonomicon](https://doc.rust-lang.org/nomicon/)." @@ -11511,9 +12084,9 @@ msgid "" "turned off the compiler safety features and have to write correct code by\n" "themselves. It means the compiler no longer enforces Rust's memory-safety rules." msgstr "" -"Rust inseguro não significa que o código está incorreto. Isso significa que os desenvolvedores têm\n" -"desligou os recursos de segurança do compilador e tem que escrever o código correto\n" -"eles mesmos. Isso significa que o compilador não impõe mais as regras de segurança de memória do Rust." +"Rust inseguro não significa que o código está incorreto. Significa que os desenvolvedores\n" +"desligaram os recursos de segurança do compilador e tem que escrever o código corretamente\n" +"eles mesmos. Significa também que o compilador não impõe mais as regras de segurança de memória do Rust." #: src/unsafe/raw-pointers.md:1 msgid "# Dereferencing Raw Pointers" @@ -11556,8 +12129,8 @@ msgid "" "```" msgstr "" " // Seguro porque r1 e r2 foram obtidos de referências e, portanto, são garantidos como não nulos e\n" -" // devidamente alinhados, os objetos subjacentes às referências das quais foram obtidos são\n" -" // vivem em todo o bloco inseguro e não são acessados nem por meio do\n" +" // devidamente alinhados, os objetos subjacentes às referências das quais foram obtidos\n" +" // vivem em todo o bloco inseguro e não são acessados nem por meio de\n" " // referências ou simultaneamente por meio de quaisquer outros ponteiros.\n" " unsafe {\n" " println!(\"r1 é: {}\", *r1);\n" @@ -11574,16 +12147,16 @@ msgid "" "operations it is doing." msgstr "" "É uma boa prática (e exigida pelo guia de estilo do Android Rust) escrever um comentário para cada\n" -"Bloco `inseguro` explicando como o código dentro dele satisfaz os requisitos de segurança do inseguro\n" -"operações que está fazendo." +"bloco `unsafe` explicando como o código dentro dele satisfaz os requisitos de segurança para a\n" +"operação insegura que está fazendo." #: src/unsafe/raw-pointers.md:30 msgid "" "In the case of pointer dereferences, this means that the pointers must be\n" "[_valid_](https://doc.rust-lang.org/std/ptr/index.html#safety), i.e.:" msgstr "" -"No caso de desreferência de ponteiro, isso significa que os ponteiros devem ser\n" -"[_valid_](https://doc.rust-lang.org/std/ptr/index.html#safety), ou seja:" +"No caso de desreferência de ponteiros, isso significa que os ponteiros devem ser\n" +"[_válidos_](https://doc.rust-lang.org/std/ptr/index.html#safety), ou seja:" #: src/unsafe/raw-pointers.md:33 msgid "" @@ -11598,7 +12171,7 @@ msgstr "" " * O ponteiro deve ser _desreferenciável_ (dentro dos limites de um único objeto alocado).\n" " * O objeto não deve ter sido desalocado.\n" " * Não deve haver acessos simultâneos ao mesmo local.\n" -" * Se o ponteiro foi obtido lançando uma referência, o objeto subjacente deve estar ativo e não\n" +" * Se o ponteiro foi obtido lançando uma referência, o objeto subjacente deve estar ativo e nenhuma\n" " referência pode ser usada para acessar a memória." #: src/unsafe/raw-pointers.md:40 @@ -11634,8 +12207,8 @@ msgid "" "However, since data races can occur, it is unsafe to read and write mutable\n" "static variables:" msgstr "" -"No entanto, como podem ocorrer corridas de dados, não é seguro ler e gravar dados mutáveis\n" -"variáveis estáticas:" +"No entanto, como podem ocorrer corridas de dados, não é seguro ler e gravar dados em\n" +"variáveis estáticas mutáveis:" #: src/unsafe/mutable-static-variables.md:16 msgid "" @@ -11678,16 +12251,16 @@ msgid "" "Using a mutable static is generally a bad idea, but there are some cases where it might make sense\n" "in low-level `no_std` code, such as implementing a heap allocator or working with some C APIs." msgstr "" -"Usar uma estática mutável geralmente é uma má ideia, mas há alguns casos em que pode fazer sentido\n" +"Usar uma variável estática mutável geralmente é uma má ideia, mas há alguns casos em que pode fazer sentido,\n" "em código `no_std` de baixo nível, como implementar um alocador de heap ou trabalhar com algumas APIs C." #: src/unsafe/unions.md:1 msgid "# Unions" -msgstr "# Sindicatos" +msgstr "# Unions (Uniões)" #: src/unsafe/unions.md:3 msgid "Unions are like enums, but you need to track the active field yourself:" -msgstr "As uniões são como enums, mas você mesmo precisa rastrear o campo ativo:" +msgstr "As uniões `union` são como enums, mas você mesmo precisa rastrear o campo ativo:" #: src/unsafe/unions.md:5 msgid "" @@ -11700,7 +12273,7 @@ msgid "" msgstr "" "```rust,editable\n" "#[repr(C)]\n" -"union MyUnion {\n" +"union MinhaUnion {\n" " i: u8,\n" " b: bool,\n" "}" @@ -11715,9 +12288,9 @@ msgid "" "```" msgstr "" "fn main() {\n" -" let u = MyUnion { i: 42 };\n" +" let u = MinhaUnion { i: 42 };\n" " println!(\"int: {}\", unsafe { u.i });\n" -" println!(\"bool: {}\", unsafe { u.b }); // Undefined behavior!\n" +" println!(\"bool: {}\", unsafe { u.b }); // Comportamento indefinido!\n" "}\n" "```" @@ -11726,7 +12299,7 @@ msgid "" "Unions are very rarely needed in Rust as you can usually use an enum. They are occasionally needed\n" "for interacting with C library APIs." msgstr "" -"As uniões raramente são necessárias no Rust, pois geralmente você pode usar um enum. Eles são ocasionalmente necessários\n" +"As uniões raramente são necessárias no Rust, pois geralmente você pode usar um `enum`. Elas são ocasionalmente necessários\n" "para interagir com as APIs da biblioteca C." #: src/unsafe/unions.md:24 @@ -11735,9 +12308,9 @@ msgid "" "[`std::mem::transmute`](https://doc.rust-lang.org/stable/std/mem/fn.transmute.html) or a safe\n" "wrapper such as the [`zerocopy`](https://crates.io/crates/zerocopy) crate." msgstr "" -"Se você deseja apenas reinterpretar os bytes como um tipo diferente, provavelmente deseja\n" -"[`std::mem::transmute`](https://doc.rust-lang.org/stable/std/mem/fn.transmute.html) ou um cofre\n" -"wrapper como a caixa [`zerocopy`](https://crates.io/crates/zerocopy)." +"Se você deseja apenas reinterpretar os bytes como um tipo diferente, provavelmente usaria\n" +"[`std::mem::transmute`](https://doc.rust-lang.org/stable/std/mem/fn.transmute.html) ou um\n" +"wrapper seguro como o `crate` [`zerocopy`](https://crates.io/crates/zerocopy)." #: src/unsafe/calling-unsafe-functions.md:1 msgid "# Calling Unsafe Functions" @@ -11748,7 +12321,7 @@ msgid "" "A function or method can be marked `unsafe` if it has extra preconditions you\n" "must uphold to avoid undefined behaviour:" msgstr "" -"Uma função ou método pode ser marcado como 'inseguro' se tiver pré-condições extras que você\n" +"Uma função ou método pode ser marcado como 'unsafe' se tiver pré-condições extras que você\n" "deve respeitar para evitar comportamentos indefinidos:" #: src/unsafe/calling-unsafe-functions.md:6 @@ -11773,8 +12346,8 @@ msgid "" "}\n" "```" msgstr "" -" // Seguro porque os índices estão na ordem correta, dentro dos limites de\n" -" // a slice da string e fica nos limites da sequência UTF-8.\n" +" // Seguro porque os índices estão na ordem correta, dentro dos limites da\n" +" // slice da string e fica nos limites da sequência UTF-8.\n" " unsafe {\n" " println!(\"{}\", emojis.get_unchecked(0..4));\n" " println!(\"{}\", emojis.get_unchecked(4..7));\n" @@ -11785,15 +12358,15 @@ msgstr "" #: src/unsafe/writing-unsafe-functions.md:1 msgid "# Writing Unsafe Functions" -msgstr "# Escrevendo Funções Inseguras" +msgstr "# Escrevendo funções inseguras" #: src/unsafe/writing-unsafe-functions.md:3 msgid "" "You can mark your own functions as `unsafe` if they require particular conditions to avoid undefined\n" "behaviour." msgstr "" -"Você pode marcar suas próprias funções como `inseguras` se elas exigirem condições específicas para evitar\n" -"comportamento." +"Você pode marcar suas próprias funções como _inseguras_ se elas exigirem condições específicas para evitar\n" +"comportamentos indefinidos." #: src/unsafe/writing-unsafe-functions.md:6 msgid "" @@ -11810,12 +12383,12 @@ msgid "" "}" msgstr "" "```rust,editable\n" -"/// Swaps the values pointed to by the given pointers.\n" +"/// Trocando os valores dos parâmetros pode referência usando ponteiros\n" "///\n" "/// # Safety\n" "///\n" -"/// The pointers must be valid and properly aligned.\n" -"unsafe fn swap(a: *mut u8, b: *mut u8) {\n" +"/// Os ponteiros precisam ser válidos e corretamente alinhados.\n" +"unsafe fn troca(a: *mut u8, b: *mut u8) {\n" " let temp = *a;\n" " *a = *b;\n" " *b = temp;\n" @@ -11838,9 +12411,9 @@ msgid "" " swap(&mut a, &mut b);\n" " }" msgstr "" -" // Safe because ...\n" +" // Seguro porque...\n" " unsafe {\n" -" swap(&mut a, &mut b);\n" +" troca(&mut a, &mut b);\n" " }" #: src/unsafe/writing-unsafe-functions.md:27 @@ -11855,27 +12428,27 @@ msgstr "" #: src/unsafe/writing-unsafe-functions.md:33 msgid "We wouldn't actually use pointers for this because it can be done safely with references." -msgstr "Na verdade, não usaríamos ponteiros para isso porque isso pode ser feito com segurança com referências." +msgstr "Na verdade, não usaríamos ponteiros para isso porque isso pode ser feito com segurança usando referências." #: src/unsafe/writing-unsafe-functions.md:35 msgid "" "Note that unsafe code is allowed within an unsafe function without an `unsafe` block. We can\n" "prohibit this with `#[deny(unsafe_op_in_unsafe_fn)]`. Try adding it and see what happens." msgstr "" -"Observe que o código inseguro é permitido dentro de uma função insegura sem um bloco `unsafe`. Pudermos\n" +"Observe que o código _inseguro_ é permitido dentro de uma função _insegura_ sem o uso de um bloco `unsafe`. Podemos\n" "proibir isso com `#[deny(unsafe_op_in_unsafe_fn)]`. Tente adicioná-lo e veja o que acontece." #: src/unsafe/extern-functions.md:1 msgid "# Calling External Code" -msgstr "# Chamando Código Externo" +msgstr "# Chamando código externo" #: src/unsafe/extern-functions.md:3 msgid "" "Functions from other languages might violate the guarantees of Rust. Calling\n" "them is thus unsafe:" msgstr "" -"Funções de outras linguagens podem violar as garantias do Rust. Chamando\n" -"eles é, portanto, inseguro:" +"Funções de outras linguagens podem violar as garantias do Rust. Chamar\n" +"elas é, portanto, inseguro:" #: src/unsafe/extern-functions.md:6 msgid "" @@ -11910,7 +12483,7 @@ msgid "" "arbitrary circumstances." msgstr "" "Isso geralmente é apenas um problema para funções externas que fazem coisas com ponteiros que podem\n" -"violam o modelo de memória do Rust, mas em geral qualquer função C pode ter comportamento indefinido sob qualquer\n" +"violar o modelo de memória do Rust, mas em geral qualquer função C pode ter comportamento indefinido sob quaisquer\n" "circunstâncias arbitrárias." #: src/unsafe/extern-functions.md:25 @@ -11923,14 +12496,14 @@ msgstr "" #: src/unsafe/unsafe-traits.md:1 msgid "# Implementing Unsafe Traits" -msgstr "# Implementando traits Inseguros" +msgstr "# Implementando traits inseguros" #: src/unsafe/unsafe-traits.md:3 msgid "" "Like with functions, you can mark a trait as `unsafe` if the implementation must guarantee\n" "particular conditions to avoid undefined behaviour." msgstr "" -"Assim como nas funções, você pode marcar uma característica como `insegura` se a implementação deve garantir\n" +"Assim como nas funções, você pode marcar um `trait` como `unsafe` se a implementação deve garantir\n" "condições particulares para evitar comportamento indefinido." #: src/unsafe/unsafe-traits.md:6 @@ -11938,7 +12511,7 @@ msgid "" "For example, the `zerocopy` crate has an unsafe trait that looks\n" "[something like this](https://docs.rs/zerocopy/latest/zerocopy/trait.AsBytes.html):" msgstr "" -"Por exemplo, a caixa `zerocopy` tem uma característica insegura que parece\n" +"Por exemplo, o `crate` `zerocopy` tem uma característica insegura que parece\n" "[algo assim](https://docs.rs/zerocopy/latest/zerocopy/trait.AsBytes.html):" #: src/unsafe/unsafe-traits.md:9 @@ -11952,7 +12525,6 @@ msgstr "" "use std::slice;" #: src/unsafe/unsafe-traits.md:13 -#, fuzzy msgid "" "/// ...\n" "/// # Safety\n" @@ -11966,9 +12538,9 @@ msgid "" "}" msgstr "" "/// ...\n" -"/// # Segurança\n" +"/// # Safety\n" "/// O tipo deve ter uma representação definida e nenhum preenchimento.\n" -"Pub trait unsafe AsBytes {\n" +"pub unsafe trait AsBytes {\n" " fn as_bytes(&self) -> &[u8] {\n" " unsafe {\n" " slice::from_raw_parts(self as *const Self as *const u8, size_of_val(self))\n" @@ -11977,14 +12549,13 @@ msgstr "" "}" #: src/unsafe/unsafe-traits.md:24 -#, fuzzy msgid "" "// Safe because u32 has a defined representation and no padding.\n" "unsafe impl AsBytes for u32 {}\n" "```" msgstr "" "// Seguro porque u32 tem uma representação definida e nenhum preenchimento.\n" -"impl unsafe AsBytes para u32 {}\n" +"unsafe impl AsBytes for u32 {}\n" "```" #: src/unsafe/unsafe-traits.md:30 @@ -11992,16 +12563,16 @@ msgid "" "There should be a `# Safety` section on the Rustdoc for the trait explaining the requirements for\n" "the trait to be safely implemented." msgstr "" -"Deve haver uma seção `# Safety` no Rustdoc para a característica explicando os requisitos para\n" -"a característica a ser implementada com segurança." +"Deve haver uma seção `# Safety` no Rustdoc para o `trait` explicando os requisitos para\n" +"o `trait` ser implementado com segurança." #: src/unsafe/unsafe-traits.md:33 msgid "The actual safety section for `AsBytes` is rather longer and more complicated." -msgstr "A seção de segurança real para `AsBytes` é bem mais longa e complicada." +msgstr "A seção de segurança atual para `AsBytes` é bem mais longa e complicada." #: src/unsafe/unsafe-traits.md:35 msgid "The built-in `Send` and `Sync` traits are unsafe." -msgstr "As características incorporadas `Send` e `Sync` não são seguras." +msgstr "Os _traits_ incorporadas `Send` e `Sync` não são seguros." #: src/exercises/day-3/afternoon.md:1 msgid "# Day 3: Afternoon Exercises" @@ -12013,15 +12584,15 @@ msgstr "Vamos construir um wrapper seguro para ler o conteúdo do diretório!" #: src/exercises/day-3/afternoon.md:7 msgid "After looking at the exercise, you can look at the [solution] provided." -msgstr "Depois de ver o exercício, você pode ver a [Solution] fornecida." +msgstr "Depois de ver o exercício, você pode ver a [solução] fornecida." #: src/exercises/day-3/afternoon.md:9 msgid "[solution]: solutions-afternoon.md" -msgstr "" +msgstr "[solução]: solutions-afternoon.md" #: src/exercises/day-3/safe-ffi-wrapper.md:1 msgid "# Safe FFI Wrapper" -msgstr "# Invólucro FFI seguro" +msgstr "# _Wrapper_ FFI seguro" #: src/exercises/day-3/safe-ffi-wrapper.md:3 msgid "" @@ -12029,13 +12600,13 @@ msgid "" "interface_ (FFI). We will use this to build a safe wrapper for the `libc`\n" "functions you would use from C to read the filenames of a directory." msgstr "" -"Rust tem ótimo suporte para chamar funções por meio de uma função _foreign\n" -"interface_ (FFI). Usaremos isso para construir um wrapper seguro para a `libc`\n" -"funções que você usaria de C para ler os names de arquivo de um diretório." +"Rust tem ótimo suporte para chamar funções por meio de uma interface para funções externas (_function foreign\n" +"interface_ FFI). Usaremos isso para construir um invólucro seguro para as funções da `libc`\n" +"de C que você usaria para ler os nomes dos arquivos de um diretório." #: src/exercises/day-3/safe-ffi-wrapper.md:7 msgid "You will want to consult the manual pages:" -msgstr "Você vai querer consultar as páginas de manual:" +msgstr "Você vai querer consultar as páginas do manual:" #: src/exercises/day-3/safe-ffi-wrapper.md:9 msgid "" @@ -12054,7 +12625,7 @@ msgid "" "C. The [Nomicon] also has a very useful chapter about FFI." msgstr "" "Você também deve procurar o módulo [`std::ffi`], especialmente para [`CStr`]\n" -"e tipos [`CString`] que são usados para armazenar strings terminadas em NUL vindas de\n" +"e tipos [`CString`] que são usados para armazenar strings terminadas com NULL vindas do\n" "C. O [Nomicon] também tem um capítulo muito útil sobre FFI." #: src/exercises/day-3/safe-ffi-wrapper.md:17 @@ -12074,8 +12645,8 @@ msgid "" "Copy the code below to and fill in the missing\n" "functions and methods:" msgstr "" -"Copie o código abaixo para e preencha os campos que faltam\n" -"funções e métodos:" +"Copie o código abaixo para e implemente as\n" +"funções e métodos que faltam:" #: src/exercises/day-3/safe-ffi-wrapper.md:29 msgid "" @@ -12097,7 +12668,7 @@ msgstr "" " // Tipo opaco. Consulte https://doc.rust-lang.org/nomicon/ffi.html.\n" " #[repr(C)]\n" " pub struct DIR {\n" -" _dados: [u8; 0],\n" +" _data: [u8; 0],\n" " _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,\n" " }" @@ -12113,7 +12684,7 @@ msgid "" " pub d_name: [c_char; 256],\n" " }" msgstr "" -" // Layout as per readdir(3) and definitions in /usr/include/x86_64-linux-gnu.\n" +" // Layout para readdir(3) e definições em /usr/include/x86_64-linux-gnu.\n" " #[repr(C)]\n" " pub struct dirent {\n" " pub d_ino: c_long,\n" @@ -12162,7 +12733,6 @@ msgstr "" "}" #: src/exercises/day-3/safe-ffi-wrapper.md:65 -#, fuzzy msgid "" "impl DirectoryIterator {\n" " fn new(path: &str) -> Result {\n" @@ -12174,14 +12744,13 @@ msgid "" msgstr "" "impl DirectoryIterator {\n" " fn new(path: &str) -> Result {\n" -" // Chame opendir e retorne um valor Ok se funcionou,\n" +" // Chama opendir e retorna um valor Ok se funcionou,\n" " // caso contrário, retorna Err com uma mensagem.\n" -" não implementado!()\n" +" unimplemented!()\n" " }\n" "}" #: src/exercises/day-3/safe-ffi-wrapper.md:73 -#, fuzzy msgid "" "impl Iterator for DirectoryIterator {\n" " type Item = OsString;\n" @@ -12191,11 +12760,11 @@ msgid "" " }\n" "}" msgstr "" -"impl Iterator para DirectoryIterator {\n" -" tipo Item = OsString;\n" +"impl Iterator for DirectoryIterator {\n" +" type Item = OsString;\n" " fn next(&mut self) -> Option {\n" -" // Continue chamando readdir até obtermos um ponteiro NULL de volta.\n" -" não implementado!()\n" +" // Continue chamando readdir até obter um ponteiro NULL de volta.\n" +" unimplemented!()\n" " }\n" "}" @@ -12218,6 +12787,12 @@ msgid "" "}\n" "```" msgstr "" +"fn main() -> Result<(), String> {\n" +" let iter = DirectoryIterator::new(\".\")?;\n" +" println!(\"arquivos: {:#?}\", iter.collect::>());\n" +" Ok(())\n" +"}\n" +"```" #: src/welcome-day-4.md:1 msgid "# Welcome to Day 4" @@ -12229,7 +12804,7 @@ msgstr "Hoje veremos dois tópicos principais:" #: src/welcome-day-4.md:5 msgid "* Concurrency: threads, channels, shared state, `Send` and `Sync`." -msgstr "* Simultaneage: threads, canais, estado compartilhado, `Send` e `Sync`." +msgstr "* Concorrência: _threads_, _channels_, estado compartilhado, `Send` e `Sync`." #: src/welcome-day-4.md:7 msgid "" @@ -12237,7 +12812,7 @@ msgid "" " interoperability with C, C++, and Java." msgstr "" "* Android: construindo binários e bibliotecas, usando AIDL, log e\n" -" interoperabilage com C, C++ e Java." +" interoperabilidade com C, C++ e Java." #: src/welcome-day-4.md:10 msgid "" @@ -12247,21 +12822,21 @@ msgid "" "> parses some raw bytes would be ideal." msgstr "" "> Tentaremos chamar Rust de um de seus próprios projetos hoje. Então tente\n" -"> encontre um pequeno canto da sua base de código onde podemos mover algumas linhas de código para\n" -"> rust. Quanto menos dependências e tipos \"exóticos\", melhor. Algo que\n" -"> analisa alguns bytes brutos seria o ideal." +"> encontrar um pequeno canto da sua base de código onde podemos mover algumas linhas de código para\n" +"> Rust. Quanto menos dependências e tipos \"exóticos\", melhor. Algo que\n" +"> analise alguns bytes brutos seria o ideal." #: src/concurrency.md:1 msgid "# Fearless Concurrency" -msgstr "# Simultaneage sem medo" +msgstr "# Concorrência sem medo" #: src/concurrency.md:3 msgid "" "Rust has full support for concurrency using OS threads with mutexes and\n" "channels." msgstr "" -"Rust tem suporte total para simultaneage usando threads do SO com mutexes e\n" -"canais." +"Rust tem suporte total para concorrência usando _threads_ do SO com _mutexes_ e\n" +"_channels_ (canais)." #: src/concurrency.md:6 msgid "" @@ -12269,17 +12844,17 @@ msgid "" "compile time bugs. This is often referred to as _fearless concurrency_ since you\n" "can rely on the compiler to ensure correctness at runtime." msgstr "" -"O sistema de tipo Rust desempenha um papel importante na criação de muitos bugs de simultaneage\n" -"erros de tempo de compilação. Isso geralmente é chamado de _simultaneage sem medo_, pois você\n" +"O sistema de tipos do Rust desempenha um papel importante na conversão de muitos erros de concorrência\n" +"em erros de tempo de compilação. Isso geralmente é chamado de _concorrência sem medo_, pois você\n" "pode confiar no compilador para garantir a exatidão no tempo de execução." #: src/concurrency/threads.md:1 msgid "# Threads" -msgstr "# Tópicos" +msgstr "# Threads" #: src/concurrency/threads.md:3 msgid "Rust threads work similarly to threads in other languages:" -msgstr "Os encadeamentos Rust funcionam de maneira semelhante aos encadeamentos em outras linguagens:" +msgstr "_Threads_ em Rust funcionam de maneira semelhante às _threads_ em outras linguagens:" #: src/concurrency/threads.md:5 msgid "" @@ -12301,6 +12876,13 @@ msgid "" " }\n" " });" msgstr "" +"fn main() {\n" +" thread::spawn(|| {\n" +" for i in 1..10 {\n" +" println!(\"Contador na thread: {i}!\");\n" +" thread::sleep(Duration::from_millis(5));\n" +" }\n" +" });" #: src/concurrency/threads.md:17 msgid "" @@ -12311,6 +12893,12 @@ msgid "" "}\n" "```" msgstr "" +" for i in 1..5 {\n" +" println!(\"Thread principal: {i}\");\n" +" thread::sleep(Duration::from_millis(5));\n" +" }\n" +"}\n" +"```" #: src/concurrency/threads.md:24 msgid "" @@ -12318,17 +12906,17 @@ msgid "" "* Thread panics are independent of each other.\n" " * Panics can carry a payload, which can be unpacked with `downcast_ref`." msgstr "" -"* Threads são todos threads daemon, o thread principal não espera por eles.\n" -"* Thread panics são independentes uns dos outros.\n" -" * Os pânicos podem carregar uma cargo útil, que pode ser descompactada com `downcast_ref`." +"* _Threads_ são todas \"_daemon threads_\", o _thread_ principal não espera por elas.\n" +"* \"_Panics_\" em _threads_ são independentes uns dos outros.\n" +" * \"_Panics_\" podem carregar um _payload_ (carga útil), que pode ser descompactado com `downcast_ref`." #: src/concurrency/threads.md:32 msgid "" "* Notice that the thread is stopped before it reaches 10 — the main thread is\n" " not waiting." msgstr "" -"* Observe que o thread é interrompido antes de atingir 10 — o thread principal é\n" -" não esperando." +"* Observe que o _thread_ é interrompido antes de atingir 10 — o _thread_ principal não\n" +" o espera." #: src/concurrency/threads.md:35 msgid "" @@ -12336,19 +12924,19 @@ msgid "" " the thread to finish." msgstr "" "* Use `let handle = thread::spawn(...)` e posteriormente `handle.join()` para aguardar\n" -" o fio para terminar." +" a `thread` terminar." #: src/concurrency/threads.md:38 msgid "* Trigger a panic in the thread, notice how this doesn't affect `main`." -msgstr "* Acionar um pânico no tópico, observe como isso não afeta `main`." +msgstr "* Acione um pânico (`panic`) na _thread_ e observe como isso não afeta a _thread_ `main`." #: src/concurrency/threads.md:40 msgid "" "* Use the `Result` return value from `handle.join()` to get access to the panic\n" " payload. This is a good time to talk about [`Any`]." msgstr "" -"* Use o valor de retorno `Result` de `handle.join()` para obter acesso ao pânico\n" -" payload. Este é um bom momento para falar sobre [`Any`]." +"* Use o valor de retorno `Result` de `handle.join()` para obter acesso ao\n" +" _payload_ do `panic` gerado. Este é um bom momento para falar sobre [`Any`]." #: src/concurrency/threads.md:43 msgid "[`Any`]: https://doc.rust-lang.org/std/any/index.html" @@ -12356,11 +12944,11 @@ msgstr "[`Qualquer`]: https://doc.rust-lang.org/std/any/index.html" #: src/concurrency/scoped-threads.md:1 msgid "# Scoped Threads" -msgstr "# Tópicos com Escopo" +msgstr "# Threads com Escopo" #: src/concurrency/scoped-threads.md:3 msgid "Normal threads cannot borrow from their environment:" -msgstr "Threads normais não podem pedir emprestado de seu ambiente:" +msgstr "_Threads_ normais não podem emprestar de seu ambiente:" #: src/concurrency/scoped-threads.md:5 msgid "" @@ -12386,10 +12974,15 @@ msgid "" "}\n" "```" msgstr "" +" thread::spawn(|| {\n" +" println!(\"Comprimento: {}\", s.len());\n" +" });\n" +"}\n" +"```" #: src/concurrency/scoped-threads.md:17 msgid "However, you can use a [scoped thread][1] for this:" -msgstr "No entanto, você pode usar um [tópico com escopo] [1] para isso:" +msgstr "No entanto, você pode usar uma [_thread_ com escopo][1] para isso:" #: src/concurrency/scoped-threads.md:19 msgid "" @@ -12411,7 +13004,7 @@ msgid "" msgstr "" " thread::scope(|scope| {\n" " scope.spawn(|| {\n" -" println!(\"Length: {}\", s.len());\n" +" println!(\"Comprimento: {}\", s.len());\n" " });\n" " });\n" "}\n" @@ -12423,30 +13016,34 @@ msgstr "[1]: https://doc.rust-lang.org/std/thread/fn.scope.html" #: src/concurrency/scoped-threads.md:35 msgid "" +"
\n" +" \n" "* The reason for that is that when the `thread::scope` function completes, all the threads are guaranteed to be joined, so " "they can return borrowed data.\n" "* Normal Rust borrowing rules apply: you can either borrow mutably by one thread, or immutably by any number of threads.\n" " \n" "
" msgstr "" -"* A razão para isso é que, quando a função `thread::scope` for concluída, todas as threads serão unidas, para que possam " +"
\n" +" \n" +"* A razão para isso é que, quando a função `thread::scope` for concluída, todas as _threads_ serão unidas, para que possam " "retornar dados emprestados.\n" -"* Aplicam-se as regras normais de empréstimo do Rust: você pode emprestar mutável por um encadeamento ou imutavelmente por " -"qualquer número de encadeamentos.\n" +"* Aplicam-se as regras normais de empréstimo do Rust: o empréstimo pode ser mutável, para uma `thread` ou imutável para\n" +"qualquer número de _threads_.\n" " \n" "
" #: src/concurrency/channels.md:1 msgid "# Channels" -msgstr "# Canais" +msgstr "# Channels (Canais)" #: src/concurrency/channels.md:3 msgid "" "Rust channels have two parts: a `Sender` and a `Receiver`. The two parts\n" "are connected via the channel, but you only see the end-points." msgstr "" -"Os canais Rust têm duas partes: um `Sender` e um `Receiver`. as duas partes\n" -"estão conectados através do canal, mas você só vê os Points finais." +"Os _channels_ (canais) em Rust têm duas partes: um `Sender` e um `Receiver`. As duas partes\n" +"estão conectadas através do _channel_, mas você só vê os _end-points_." #: src/concurrency/channels.md:6 msgid "" @@ -12477,6 +13074,8 @@ msgid "" " println!(\"Received: {:?}\", rx.recv());\n" " println!(\"Received: {:?}\", rx.recv());" msgstr "" +" println!(\"Recebido: {:?}\", rx.recv());\n" +" println!(\"Recebido: {:?}\", rx.recv());" #: src/concurrency/channels.md:19 msgid "" @@ -12486,6 +13085,11 @@ msgid "" "}\n" "```" msgstr "" +" let tx2 = tx.clone();\n" +" tx2.send(30).unwrap();\n" +" println!(\"Recebido: {:?}\", rx.recv());\n" +"}\n" +"```" #: src/concurrency/channels.md:27 msgid "" @@ -12495,13 +13099,13 @@ msgid "" " `Receiver` is dropped and the channel is closed." msgstr "" "* `mpsc` significa Multi-Produtor, Único-Consumidor. `Sender` e `SyncSender` implementam `Clone` (então\n" -" você pode criar vários produtores), mas `Receiver` não.\n" -"* `send()` e `recv()` retornam `Result`. Se retornarem `Err`, significa a contraparte `Sender` ou\n" -" `Receiver` é descartado e o canal é fechado." +" você pode criar vários produtores), mas `Receiver` (consumidores) não.\n" +"* `send()` e `recv()` retornam `Result`. Se retornarem `Err`, significa que a contraparte `Sender` ou\n" +" `Receiver` é descartada e o canal é fechado." #: src/concurrency/channels/unbounded.md:1 msgid "# Unbounded Channels" -msgstr "# canais ilimitados" +msgstr "# Canais ilimitados" #: src/concurrency/channels/unbounded.md:3 msgid "You get an unbounded and asynchronous channel with `mpsc::channel()`:" @@ -12531,6 +13135,15 @@ msgid "" " });\n" " thread::sleep(Duration::from_millis(100));" msgstr "" +" thread::spawn(move || {\n" +" let thread_id = thread::current().id();\n" +" for i in 1..10 {\n" +" tx.send(format!(\"Mensagem {i}\")).unwrap();\n" +" println!(\"{thread_id:?}: enviando a mensagem: {i}\");\n" +" }\n" +" println!(\"{thread_id:?}: feito\");\n" +" });\n" +" thread::sleep(Duration::from_millis(100));" #: src/concurrency/channels/unbounded.md:23 msgid "" @@ -12540,6 +13153,11 @@ msgid "" "}\n" "```" msgstr "" +" for msg in rx.iter() {\n" +" println!(\"Main: obteve {msg}\");\n" +" }\n" +"}\n" +"```" #: src/concurrency/channels/bounded.md:1 msgid "# Bounded Channels" @@ -12547,7 +13165,7 @@ msgstr "# Canais Delimitados" #: src/concurrency/channels/bounded.md:3 msgid "Bounded and synchronous channels make `send` block the current thread:" -msgstr "Canais limitados e síncronos fazem `send` bloquear o thread atual:" +msgstr "Canais limitados e síncronos fazem `send` bloquear o _thread_ atual:" #: src/concurrency/channels/bounded.md:10 msgid "" @@ -12558,7 +13176,6 @@ msgstr "" " let (tx, rx) = mpsc::sync_channel(3);" #: src/concurrency/channels/bounded.md:23 -#, fuzzy msgid "" " for msg in rx.iter() {\n" " println!(\"Main: got {msg}\");\n" @@ -12566,8 +13183,8 @@ msgid "" "}\n" "```" msgstr "" -" for msg em rx.iter() {\n" -" println!(\"Main: obteve {}\", msg);\n" +" for msg in rx.iter() {\n" +" println!(\"Main: obteve {msg}\");\n" " }\n" "}\n" "```" @@ -12590,7 +13207,7 @@ msgid "" " takes care to deallocate `T` when the last reference is dropped,\n" "* [`Mutex`][2]: ensures mutually exclusive access to the `T` value." msgstr "" -"* [`Arc`][1], referência atômica contada `T`: manipula o compartilhamento entre threads e\n" +"* [`Arc`][1], referência atômica contada `T`: manipula o compartilhamento entre _threads_ e\n" " toma o cuidado de desalocar `T` quando a última referência é descartada,\n" "* [`Mutex`][2]: garante acesso mutuamente exclusivo ao valor `T`." @@ -12671,11 +13288,10 @@ msgid "" "* Beware of reference cycles, `Arc` does not use a garbage collector to detect them.\n" " * `std::sync::Weak` can help." msgstr "" -"* `Arc` significa \"Atomic Reference Counted\", uma versão thread-safe de `Rc` que usa dados atômicos\n" -" operações.\n" -"* `Arc` implementa `Clone` quer `T` o faça ou não. Ele implementa `Send` e `Sync` iff `T`\n" +"* `Arc` significa \"Atomic Reference Counted\", uma versão _thread-safe_ de `Rc` que usa operações atômicas.\n" +"* `Arc` implementa `Clone` quer `T` o faça ou não. Ele implementa `Send` e `Sync` se `T`\n" " implementa os dois.\n" -"* `Arc::clone()` tem o custo de operações atômicas que são executadas, mas depois disso o uso do\n" +"* `Arc::clone()` tem o custo das operações atômicas que são executadas, mas depois disso o uso do\n" " `T` é gratuito.\n" "* Cuidado com os ciclos de referência, `Arc` não usa um coletor de lixo para detectá-los.\n" " * `std::sync::Weak` pode ajudar." @@ -12720,8 +13336,8 @@ msgid "" msgstr "" " {\n" " let v: &Mutex> = &v;\n" -" let mut guard = v.lock().unwrap();\n" -" guard.push(40);\n" +" let mut guarda= v.lock().unwrap();\n" +" guarda.push(40);\n" " }" #: src/concurrency/shared_state/mutex.md:19 @@ -12739,8 +13355,8 @@ msgid "" "Notice how we have a [`impl Sync for Mutex`][2] blanket\n" "implementation." msgstr "" -"Observe como temos um cobertor [`impl Sync for Mutex`][2]\n" -"implementação." +"Observe como temos uma implementação [`impl Sync for Mutex`][2]\n" +"encoberta." #: src/concurrency/shared_state/mutex.md:26 msgid "" @@ -12754,6 +13370,8 @@ msgstr "" #: src/concurrency/shared_state/mutex.md:30 msgid "" +"
\n" +" \n" "* `Mutex` in Rust looks like a collection with just one element - the protected data.\n" " * It is not possible to forget to acquire the mutex before accessing the protected data.\n" "* You can get an `&mut T` from an `&Mutex` by taking the lock. The `MutexGuard` ensures that the\n" @@ -12766,16 +13384,18 @@ msgid "" " fails with a [`PoisonError`]. You can call `into_inner()` on the error to recover the data\n" " regardless." msgstr "" +"
\n" +" \n" "* `Mutex` em Rust parece uma coleção com apenas um elemento - os dados protegidos.\n" " * Não é possível esquecer de adquirir o mutex antes de acessar os dados protegidos.\n" -"* Você pode obter um `&mut T` de um `&Mutex` pegando o bloqueio. O `MutexGuard` garante que o\n" -" `&mut T` não sobrevive ao bloqueio sendo mantido.\n" +"* Você pode obter um `&mut T` de um `&Mutex` obtendo um bloqueio (_lock_). O `MutexGuard` garante que o\n" +" `&mut T` não sobrevive além do bloqueio (_lock_).\n" "* `Mutex` implementa `Send` e `Sync` se `T` implementa `Send`.\n" -"* Uma contraparte de bloqueio de leitura e gravação - `RwLock`.\n" +"* O bloqueio para leitura e gravação - `RwLock`.\n" "* Por que `lock()` retorna um `Result`?\n" " * Se o thread que manteve o `Mutex` entrou em pânico, o `Mutex` torna-se \"envenenado\" para sinalizar que\n" -" os dados protegidos podem estar em um estado inconsistente. Chamando `lock ()` em um mutex envenenado\n" -" falha com um [`PoisonError`]. Você pode chamar `into_inner()` no erro para recuperar os dados\n" +" os dados protegidos podem estar em um estado inconsistente. Ao chamar `lock()` em um mutex envenenado\n" +" o retorno é uma falha com um [`PoisonError`]. Você pode chamar `into_inner()` no erro para recuperar os dados\n" " independentemente." #: src/concurrency/shared_state/mutex.md:44 @@ -12800,7 +13420,7 @@ msgid "" msgstr "" "```rust,editable,compile_fail\n" "use std::thread;\n" -"// usa std::sync::{Arc, Mutex};" +"// use std::sync::{Arc, Mutex};" #: src/concurrency/shared_state/example.md:9 msgid "" @@ -12833,16 +13453,22 @@ msgstr "" #: src/concurrency/shared_state/example.md:23 msgid "" "Possible solution:\n" +" \n" +"```rust,editable\n" +"use std::sync::{Arc, Mutex};\n" +"use std::thread;" msgstr "" "Solução possível:\n" +" \n" +"```rust, editable\n" +"use std::sync::{Arc, Mutex};\n" +"use std::thread;" #: src/concurrency/shared_state/example.md:29 msgid "" -"```rust,editable\n" "fn main() {\n" " let v = Arc::new(Mutex::new(vec![10, 20, 30]));" msgstr "" -"```rust,editable\n" "fn main() {\n" " let v = Arc::new(Mutex::new(vec![10, 20, 30]));" @@ -12876,8 +13502,25 @@ msgstr "" msgid " handle.join().unwrap();" msgstr " handle.join().unwrap();" -msgid "Notable parts:" -msgstr "Partes notáveis:" +#: src/concurrency/shared_state/example.md:45 +msgid "" +" {\n" +" let v = v.lock().unwrap();\n" +" println!(\"v: {v:?}\");\n" +" }\n" +"}\n" +"```\n" +" \n" +"Notable parts:" +msgstr "" +" {\n" +" let v = v.lock().unwrap();\n" +" println!(\"v: {v:?}\");\n" +" }\n" +"}\n" +"```\n" +" \n" +"Partes importantes:" #: src/concurrency/shared_state/example.md:54 msgid "" @@ -12890,14 +13533,14 @@ msgid "" msgstr "" "* `v` é agrupado em ambos `Arc` e `Mutex`, porque seus interesses são ortogonais.\n" " * Envolver um `Mutex` em um `Arc` é um padrão comum para compartilhar o estado mutável entre threads.\n" -"* `v: Arc<_>` precisa ser clonado como `v2` antes que possa ser movido para outro thread. A nota `move` foi adicionada à " +"* `v: Arc<_>` precisa ser clonado como `v2` antes que possa ser movido para outro thread. Note que `move` foi adicionado à " "assinatura lambda.\n" "* Os blocos são introduzidos para restringir o escopo do `LockGuard` tanto quanto possível.\n" "* Ainda precisamos adquirir o `Mutex` para imprimir nosso `Vec`." #: src/concurrency/send-sync.md:1 msgid "# `Send` and `Sync`" -msgstr "# `Enviar` e `Sincronizar`" +msgstr "# `Send` e `Sync`" #: src/concurrency/send-sync.md:3 msgid "How does Rust know to forbid shared access across thread? The answer is in two traits:" @@ -12910,10 +13553,8 @@ msgid "" "* [`Sync`][2]: a type `T` is `Sync` if it is safe to move a `&T` across a thread\n" " boundary." msgstr "" -"* [`Send`][1]: um tipo `T` é `Send` se for seguro mover um `T` através de um thread\n" -" fronteira.\n" -"* [`Sync`][2]: um tipo `T` é `Sync` se for seguro mover um `&T` através de um thread\n" -" fronteira." +"* [`Send`][1]: um tipo `T` é `Send` se for seguro mover um `T` entre _threads_\n" +"* [`Sync`][2]: um tipo `T` é `Sync` se for seguro mover um `&T` entre _threads_" #: src/concurrency/send-sync.md:10 msgid "" @@ -12921,9 +13562,9 @@ msgid "" "as long as they only contain `Send` and `Sync` types. You can also implement them manually when you\n" "know it is valid." msgstr "" -"`Send` e `Sync` são [características inseguras][3]. O compilador os derivará automaticamente para seus tipos\n" +"`Send` e `Sync` são [`unsafe traits`][3]. O compilador os derivará automaticamente para seus tipos\n" "desde que contenham apenas os tipos `Send` e `Sync`. Você também pode implementá-los manualmente quando\n" -"saiba que é válido." +"souber que são válidos." #: src/concurrency/send-sync.md:14 msgid "" @@ -12942,19 +13583,19 @@ msgid "" " \n" "
" msgstr "" -"* Pode-se pensar nessas características como marcadores de que o tipo possui certas ownerships de segurança de " -"encadeamento.\n" -"* Eles podem ser usados nas restrições genéricas como características normais.\n" +"* Pode-se pensar nesses _traits_ como marcadores de que o tipo possui certas propriedades de segurança de " +"_threads_.\n" +"* Eles podem ser usados nas restrições genéricas como _traits_ normais.\n" " \n" "
" #: src/concurrency/send-sync/send.md:1 msgid "# `Send`" -msgstr "# `Enviar`" +msgstr "# `Send`" #: src/concurrency/send-sync/send.md:3 msgid "> A type `T` is [`Send`][1] if it is safe to move a `T` value to another thread." -msgstr "> Um tipo `T` é [`Send`][1] se for seguro mover um valor `T` para outro thread." +msgstr "> Um tipo `T` é [`Send`][1] se for seguro mover um valor `T` para outro _thread_." #: src/concurrency/send-sync/send.md:5 msgid "" @@ -12962,9 +13603,9 @@ msgid "" "in that thread. So the question is when you can allocate a value in one thread\n" "and deallocate it in another." msgstr "" -"O efeito de mover a ownership para outro thread é que os _destructors_ serão executados\n" -"nesse fio. Então a questão é quando você pode alocar um valor em um thread\n" -"e desalocá-lo em outro." +"O efeito de mover a propriedade (ownership) para outro _thread_ é que os _destructors_ serão executados\n" +"nessa _thread_. Então a questão é: quando você pode alocar um valor em um _thread_\n" +"e desalocá-lo em outro?" #: src/concurrency/send-sync/send.md:9 msgid "[1]: https://doc.rust-lang.org/std/marker/trait.Send.html" @@ -12972,15 +13613,15 @@ msgstr "[1]: https://doc.rust-lang.org/std/marker/trait.Send.html" #: src/concurrency/send-sync/sync.md:1 msgid "# `Sync`" -msgstr "# `Sincronizar`" +msgstr "# `Sync`" #: src/concurrency/send-sync/sync.md:3 msgid "" "> A type `T` is [`Sync`][1] if it is safe to access a `T` value from multiple\n" "> threads at the same time." msgstr "" -"> Um tipo `T` é [`Sync`][1] se for seguro acessar um valor `T` de vários\n" -"> tópicos ao mesmo tempo." +"> Um tipo `T` é [`Sync`][1] se for seguro acessar um valor `T` de várias\n" +"> threads ao mesmo tempo." #: src/concurrency/send-sync/sync.md:6 msgid "More precisely, the definition is:" @@ -12999,8 +13640,8 @@ msgid "" "This statement is essentially a shorthand way of saying that if a type is thread-safe for shared use, it is also thread-" "safe to pass references of it across threads." msgstr "" -"Essa instrução é essencialmente uma maneira abreviada de dizer que, se um tipo é thread-safe para uso compartilhado, também " -"é thread-safe passar referências a ele entre threads." +"Essa instrução é essencialmente uma maneira abreviada de dizer que, se um tipo é _thread-safe_ para uso compartilhado, também " +"é _thread-safe_ passar referências a ele entre _threads_." #: src/concurrency/send-sync/sync.md:16 msgid "" @@ -13008,10 +13649,10 @@ msgid "" "other synchronization issues, so it is safe to move it to another thread. A reference to the type is also safe to move to " "another thread, because the data it references can be accessed from any thread safely." msgstr "" -"Isso ocorre porque, se um tipo for Sync, significa que ele pode ser compartilhado entre vários encadeamentos sem o risco de " -"corridas de dados ou outros problemas de sincronização, portanto, é seguro movê-lo para outro encadeamento. Uma referência " -"ao tipo também é segura para mover para outro thread, porque os dados a que ele faz referência podem ser acessados de " -"qualquer thread com segurança." +"Isso ocorre porque, se um tipo for `Sync`, significa que ele pode ser compartilhado entre vários _threads_ sem o risco de " +"corridas de dados ou outros problemas de sincronização, portanto, é seguro movê-lo para outro _thread_. Uma referência " +"ao tipo também é segura para mover para outro _thread_, porque os dados a que ela faz referência podem ser acessados de " +"qualquer _thread_ com segurança." #: src/concurrency/send-sync/examples.md:1 msgid "# Examples" @@ -13019,11 +13660,11 @@ msgstr "# Exemplos" #: src/concurrency/send-sync/examples.md:3 msgid "## `Send + Sync`" -msgstr "## `Enviar + Sincronizar`" +msgstr "## `Send + Sync`" #: src/concurrency/send-sync/examples.md:5 msgid "Most types you come across are `Send + Sync`:" -msgstr "A maioria dos tipos que você encontra são `Enviar + Sincronizar`:" +msgstr "A maioria dos tipos que você encontra são `Send + Sync`:" #: src/concurrency/send-sync/examples.md:7 msgid "" @@ -13037,8 +13678,8 @@ msgstr "" "* `i8`, `f32`, `bool`, `char`, `&str`, ...\n" "* `(T1, T2)`, `[T; N]`, `&[T]`, `struct { x: T }`, ...\n" "* `String`, `Option`, `Vec`, `Box`, ...\n" -"* `Arc`: Explicitamente thread-safe via contagem de referência atômica.\n" -"* `Mutex`: Explicitamente thread-safe via bloqueio interno.\n" +"* `Arc`: Explicitamente _thread-safe_ via contagem de referência atômica.\n" +"* `Mutex`: Explicitamente _thread-safe_ via bloqueio interno.\n" "* `AtomicBool`, `AtomicU8`, ...: Usa instruções atômicas especiais." #: src/concurrency/send-sync/examples.md:14 @@ -13047,19 +13688,19 @@ msgid "" "`Send + Sync`." msgstr "" "Os tipos genéricos são tipicamente `Send + Sync` quando os parâmetros de tipo são\n" -"`Enviar + Sincronizar`." +"`Send + Sync`." #: src/concurrency/send-sync/examples.md:17 msgid "## `Send + !Sync`" -msgstr "## `Enviar + !Sync`" +msgstr "## `Send + !Sync`" #: src/concurrency/send-sync/examples.md:19 msgid "" "These types can be moved to other threads, but they're not thread-safe.\n" "Typically because of interior mutability:" msgstr "" -"Esses tipos podem ser movidos para outros encadeamentos, mas não são seguros para encadeamentos.\n" -"Normalmente por causa da mutabilage interior:" +"Esses tipos podem ser movidos para outras _threads_, mas não são seguros para _threads_.\n" +"Normalmente por causa da mutabilidade interior:" #: src/concurrency/send-sync/examples.md:22 msgid "" @@ -13069,33 +13710,33 @@ msgid "" "* `RefCell`" msgstr "" "* `mpsc::Sender`\n" -"* `mpsc::Receptor`\n" -"* `Célula`\n" +"* `mpsc::Receiver`\n" +"* `Cell`\n" "* `RefCell`" #: src/concurrency/send-sync/examples.md:27 msgid "## `!Send + Sync`" -msgstr "## `!Enviar + Sincronizar`" +msgstr "## `!Send + Sync`" #: src/concurrency/send-sync/examples.md:29 msgid "These types are thread-safe, but they cannot be moved to another thread:" -msgstr "Esses tipos são thread-safe, mas não podem ser movidos para outro thread:" +msgstr "Esses tipos são _thread-safe_, mas não podem ser movidos para outro _thread_:" #: src/concurrency/send-sync/examples.md:31 msgid "" "* `MutexGuard`: Uses OS level primitives which must be deallocated on the\n" " thread which created them." msgstr "" -"* `MutexGuard`: Usa primitivas de nível de sistema operacional que devem ser desalocadas no\n" -" discussão que os criou." +"* `MutexGuard`: Usa primitivas a nível de sistema operacional que devem ser desalocadas no\n" +" _thread_ que as criou." #: src/concurrency/send-sync/examples.md:34 msgid "## `!Send + !Sync`" -msgstr "## `!Enviar + !Sincronizar`" +msgstr "## `!Send + !Sync`" #: src/concurrency/send-sync/examples.md:36 msgid "These types are not thread-safe and cannot be moved to other threads:" -msgstr "Esses tipos não são thread-safe e não podem ser movidos para outros threads:" +msgstr "Esses tipos não são _thread-safe_ e não podem ser movidos para outros _threads_:" #: src/concurrency/send-sync/examples.md:38 msgid "" @@ -13104,10 +13745,10 @@ msgid "" "* `*const T`, `*mut T`: Rust assumes raw pointers may have special\n" " concurrency considerations." msgstr "" -"* `Rc`: cada `Rc` tem uma referência a um `RcBox`, que contém um\n" +"* `Rc`: cada `Rc` tem uma referência a um `RcBox`, que contém uma\n" " contagem de referência não atômica.\n" "* `*const T`, `*mut T`: Rust assume que ponteiros brutos podem ter\n" -" considerações de simultaneage." +" considerações de especiais de concorrência." #: src/exercises/day-4/morning.md:1 src/exercises/day-4/afternoon.md:1 msgid "# Exercises" @@ -13115,27 +13756,27 @@ msgstr "# Exercícios" #: src/exercises/day-4/morning.md:3 msgid "Let us practice our new concurrency skills with" -msgstr "Vamos praticar nossas novas habilages de simultaneage com" +msgstr "Vamos praticar nossas novas habilidades de concorrência com:" #: src/exercises/day-4/morning.md:5 msgid "* Dining philosophers: a classic problem in concurrency." -msgstr "* Dining philosophers: um problema clássico em concorrência." +msgstr "* _Dining philosophers_: um problema clássico em concorrência." #: src/exercises/day-4/morning.md:7 msgid "" "* Multi-threaded link checker: a larger project where you'll use Cargo to\n" " download dependencies and then check links in parallel." msgstr "" -"* Verificador de link multiencadeado: um projeto maior em que você usará o Cargo para\n" -" baixe as dependências e verifique os links em paralelo." +"* Verificador de link _multi-threads_: um projeto maior no qual você usará o Cargo para\n" +" baixar as dependências e também verificar os links em paralelo." #: src/exercises/day-4/dining-philosophers.md:1 msgid "# Dining Philosophers" -msgstr "# Dining Philosophers" +msgstr "# Filósofos jantando" #: src/exercises/day-4/dining-philosophers.md:3 msgid "The dining philosophers problem is a classic problem in concurrency:" -msgstr "O problema dos philosophers jantando é um problema clássico em concorrência:" +msgstr "O problema dos filósofos jantando é um problema clássico em concorrência:" #: src/exercises/day-4/dining-philosophers.md:5 msgid "" @@ -13147,21 +13788,21 @@ msgid "" "> be available when their two nearest neighbors are thinking, not eating. After\n" "> an individual philosopher finishes eating, they will put down both forks." msgstr "" -"> Cinco philosophers jantam juntos na mesma mesa. Cada philosopher tem sua\n" +"> Cinco filósofos jantam juntos na mesma mesa. Cada folósofo tem seu\n" "> próprio lugar à mesa. Há um garfo entre cada prato. O prato servido é\n" -"> uma espécie de esparguete que se come com dois garfos. Cada philosopher pode\n" -"> só pensa e come alternadamente. Além disso, um philosopher só pode comer sua\n" -"> espaguete quando eles têm garfo esquerdo e direito. Assim, dois garfos só\n" -"> estar disponível quando seus dois vizinhos mais próximos estiverem pensando, não comendo. Depois de\n" -"> um philosopher individual termina de comer, eles abaixam os dois garfos." +"> uma espécie de espaguete que se come com dois garfos. Cada filósofo pode\n" +"> somente pensar ou comer, alternadamente. Além disso, um filósofo só pode comer seu\n" +"> espaguete quando ele têm garfo esquerdo e direito. Assim, dois garfos só\n" +"> estarão disponíveis quando seus dois vizinhos mais próximos estiverem pensando, não comendo. Depois de\n" +"> um filósofo individual termina de comer, ele abaixa os dois garfos." #: src/exercises/day-4/dining-philosophers.md:13 msgid "" -"You will need a local [Cargo installation](../../cargo/running-locally.md) for\n" +"You will need a local [Cargo installation][../../cargo/running-locally.md] for\n" "this exercise. Copy the code below to `src/main.rs` file, fill out the blanks,\n" "and test that `cargo run` does not deadlock:" msgstr "" -"Você precisará de uma [instalação do Cargo] local (../../cargo/running-locally.md) para\n" +"Você precisará de uma [instalação do Cargo][../../cargo/running-locally.md] local para\n" "esse exercício. Copie o código abaixo para o arquivo `src/main.rs`, preencha os espaços em branco,\n" "e teste se `cargo run` não trava:" @@ -13181,7 +13822,7 @@ msgstr "" #: src/exercises/day-4/dining-philosophers.md:23 src/exercises/day-4/solutions-morning.md:28 msgid "struct Fork;" -msgstr "struct Fork;" +msgstr "struct Garfo;" #: src/exercises/day-4/dining-philosophers.md:25 msgid "" @@ -13192,11 +13833,11 @@ msgid "" " // thoughts: ...\n" "}" msgstr "" -"struct Philosopher {\n" -" name: String,\n" -" // left_fork: ...\n" -" // right_fork: ...\n" -" // thoughts: ...\n" +"struct Filosofo {\n" +" nome: String,\n" +" // garfo_esquerda: ...\n" +" // garfo_direita: ...\n" +" // pensamentos: ...\n" "}" #: src/exercises/day-4/dining-philosophers.md:32 @@ -13208,11 +13849,11 @@ msgid "" " .unwrap();\n" " }" msgstr "" -"impl Philosopher {\n" -" fn pense(&self) {\n" -" auto.thoughts\n" -" .send(format!(\"Eureka! {} tem uma nova ideia!\", &self.name))\n" -" .desembrulhar();\n" +"impl Filosofo {\n" +" fn pensa(&self) {\n" +" self.pensamento\n" +" .send(format!(\"Eureka! {} tem uma nova ideia!\", &self.nome))\n" +" .unwrap();\n" " }" #: src/exercises/day-4/dining-philosophers.md:39 @@ -13226,19 +13867,18 @@ msgid "" msgstr "" " fn come(&self) {\n" " // Pegar garfos...\n" -" println!(\"{} está comendo...\", &self.name);\n" -" thread::sleep(Duração::from_millis(10));\n" +" println!(\"{} está comendo...\", &self.nome);\n" +" thread::sleep(Duration::from_millis(10));\n" " }\n" "}" #: src/exercises/day-4/dining-philosophers.md:46 src/exercises/day-4/solutions-morning.md:60 -#, fuzzy msgid "" "static PHILOSOPHERS: &[&str] =\n" " &[\"Socrates\", \"Plato\", \"Aristotle\", \"Thales\", \"Pythagoras\"];" msgstr "" -"PHILOSOPHERS statics: &[&str] =\n" -" &[\"Sócrates\", \"Platão\", \"Aristóteles\", \"Tales\", \"Pitágoras\"];" +"static FILOSOFOS: &[&str] =\n" +"&[\"Sócrates\", \"Platão\", \"Aristóteles\", \"Tales\", \"Pitágoras\"];" #: src/exercises/day-4/dining-philosophers.md:49 msgid "" @@ -13246,11 +13886,11 @@ msgid "" " // Create forks" msgstr "" "fn main() {\n" -" // Cria bifurcações" +" // Criar garfos" #: src/exercises/day-4/dining-philosophers.md:52 msgid " // Create philosophers" -msgstr " // Criar philosophers" +msgstr " // Criar filosofos" #: src/exercises/day-4/dining-philosophers.md:54 msgid " // Make them think and eat" @@ -13262,13 +13902,13 @@ msgid "" "}\n" "```" msgstr "" -" // Saída de seus thoughts\n" +" // Mostrar seus pensamentos\n" "}\n" "```" #: src/exercises/day-4/link-checker.md:1 msgid "# Multi-threaded Link Checker" -msgstr "# Verificador de links multiencadeados" +msgstr "# Verificador de links _multi-threads_" #: src/exercises/day-4/link-checker.md:3 msgid "" @@ -13277,10 +13917,10 @@ msgid "" "recursively check other pages on the same domain and keep doing this until all\n" "pages have been validated." msgstr "" -"Vamos usar nosso novo conhecimento para criar um verificador de links multiencadeados. Deveria\n" -"comece em uma página da web e verifique se os links na página são válidos. Deveria\n" -"verifique recursivamente outras páginas no mesmo domínio e continue fazendo isso até que todas\n" -"as páginas foram validadas." +"Vamos usar nosso novo conhecimento para criar um verificador de links _multi-threads_. \n" +"Comece em uma página da web e verifique se os links na página são válidos. \n" +"Verifique recursivamente outras páginas no mesmo domínio e continue fazendo isso até que todas\n" +"as páginas tenham sido validadas." #: src/exercises/day-4/link-checker.md:8 msgid "" @@ -13288,7 +13928,7 @@ msgid "" "Cargo project and `reqwest` it as a dependency with:" msgstr "" "Para isso, você precisará de um cliente HTTP como [`reqwest`][1]. Crie um novo\n" -"Cargo project e `reqwest` como uma dependência com:" +"Project com o Cargo e adicione `reqwest` como uma dependência:" #: src/exercises/day-4/link-checker.md:11 msgid "" @@ -13299,7 +13939,7 @@ msgid "" "```" msgstr "" "```shell\n" -"$ cargo new verificador de link\n" +"$ cargo new link-checker\n" "$ cd link-checker\n" "$ cargo add --features blocking,rustls-tls reqwest\n" "```" @@ -13310,7 +13950,7 @@ msgid "" "> `Cargo.toml` file by hand. Add the dependencies listed below." msgstr "" "> Se `cargo add` falhar com `error: no such subcommand`, edite o\n" -"> Arquivo `Cargo.toml` à mão. Adicione as dependências listadas abaixo." +"> arquivo `Cargo.toml` à mão. Adicione as dependências listadas abaixo." #: src/exercises/day-4/link-checker.md:20 msgid "You will also need a way to find links. We can use [`scraper`][2] for that:" @@ -13323,7 +13963,7 @@ msgid "" "```" msgstr "" "```shell\n" -"$ cargo adicionar raspador\n" +"$ cargo add scraper\n" "```" #: src/exercises/day-4/link-checker.md:26 @@ -13332,7 +13972,7 @@ msgid "" "that:" msgstr "" "Por fim, precisaremos de alguma forma de lidar com os erros. Usamos [`thiserror`][3] para\n" -"que:" +"isso:" #: src/exercises/day-4/link-checker.md:29 msgid "" @@ -13341,7 +13981,7 @@ msgid "" "```" msgstr "" "```shell\n" -"$ cargo adicionar este erro\n" +"$ cargo add thiserror\n" "```" #: src/exercises/day-4/link-checker.md:33 @@ -13360,8 +14000,8 @@ msgstr "" "```toml\n" "[dependências]\n" "reqwest = { version = \"0.11.12\", features = [\"blocking\", \"rustls-tls\"] }\n" -"raspador = \"0.13.0\"\n" -"este erro = \"1.0.37\"\n" +"scraper = \"0.13.0\"\n" +"thiserror = \"1.0.37\"\n" "```" #: src/exercises/day-4/link-checker.md:42 @@ -13387,8 +14027,8 @@ msgstr "" "```rust,compile_fail\n" "use reqwest::blocking::{get, Response};\n" "use reqwest::Url;\n" -"use raspador::{Html, Seletor};\n" -"use este erro::Erro;" +"use scraper::{Html, Selector};\n" +"use thiserror::Error;" #: src/exercises/day-4/link-checker.md:53 msgid "" @@ -13398,8 +14038,8 @@ msgid "" " ReqwestError(#[from] reqwest::Error),\n" "}" msgstr "" -"#[derive(erro, depuração)]\n" -"Erro de Enum {\n" +"#[derive(Error, Debug)]\n" +"enum Error{\n" " #[error(\"erro de solicitação: {0}\")]\n" " ReqwestError(#[from] reqwest::Error),\n" "}" @@ -13412,7 +14052,7 @@ msgid "" " let html = Html::parse_document(&document);\n" " let selector = Selector::parse(\"a\").unwrap();" msgstr "" -"fn extract_links(resposta: Resposta) -> Result, Erro> {\n" +"fn extract_links(response: Response) -> Result, Error> {\n" " let base_url = response.url().to_owned();\n" " let document = response.text()?;\n" " let html = Html::parse_document(&document);\n" @@ -13433,7 +14073,7 @@ msgid "" " }" msgstr "" " let mut valid_urls = Vec::new();\n" -" for elemento em html.select(&seletor) {\n" +" for element in html.select(&selector) {\n" " if let Some(href) = element.value().attr(\"href\") {\n" " match base_url.join(href) {\n" " Ok(url) => valid_urls.push(url),\n" @@ -13467,9 +14107,9 @@ msgstr "" "fn main() {\n" " let start_url = Url::parse(\"https://www.google.org\").unwrap();\n" " let response = get(start_url).unwrap();\n" -" match extract_links(resposta) {\n" +" match extract_links(response) {\n" " Ok(links) => println!(\"Links: {links:#?}\"),\n" -" Err(err) => println!(\"Não foi possível extrair links: {err:#}\"),\n" +" Err(err) => println!(\"Não foi possível extrair os links: {err:#}\"),\n" " }\n" "}\n" "```" @@ -13485,7 +14125,7 @@ msgid "" "```" msgstr "" "```shell\n" -"corrida de cargo $\n" +"$ cargo run\n" "```" #: src/exercises/day-4/link-checker.md:96 @@ -13500,10 +14140,10 @@ msgid "" " `www.google.org` domain. Put an upper limit of 100 pages or so so that you\n" " don't end up being blocked by the site." msgstr "" -"* Use threads para verificar os links em paralelo: envie as URLs a serem verificadas para um\n" -" channel e deixe alguns threads verificarem as URLs em paralelo.\n" +"* Use _threads_ para verificar os links em paralelo: envie as URLs a serem verificadas para um\n" +" _channel_ e deixe alguns _threads_ verificarem as URLs em paralelo.\n" "* Estenda isso para extrair recursivamente links de todas as páginas no\n" -" domínio `www.google.org`. Coloque um limite máximo de 100 páginas ou mais para que você\n" +" domínio `www.google.org`. Coloque um limite máximo de 100 páginas ou menos para que você\n" " não acabe sendo bloqueado pelo site." #: src/exercises/day-4/link-checker.md:104 @@ -13518,7 +14158,7 @@ msgstr "" #: src/android.md:1 msgid "# Android" -msgstr "#Android" +msgstr "# Android" #: src/android.md:3 msgid "" @@ -13552,8 +14192,8 @@ msgid "" msgstr "" "```shell\n" "$ source build/envsetup.sh\n" -"$ almoço aosp_cf_x86_64_phone-userdebug\n" -"$ acloud criar\n" +"$ launch aosp_cf_x86_64_phone-userdebug\n" +"$ acloud create\n" "```" #: src/android/setup.md:12 @@ -13561,8 +14201,8 @@ msgid "" "Please see the [Android Developer\n" "Codelab](https://source.android.com/docs/setup/start) for details." msgstr "" -"Consulte o [Desenvolvedor Android\n" -"Codelab](https://source.android.com/docs/setup/start) para obter detalhes." +"Consulte o [Codelab para Desenvolvedor Android]\n" +"[https://source.android.com/docs/setup/start] para obter detalhes." #: src/android/build-rules.md:1 msgid "# Build Rules" @@ -13586,17 +14226,15 @@ msgid "" "| `rust_bindgen` | Generates source and produces a Rust library containing Rust bindings to C libraries. |" msgstr "" "| Tipo de módulo | Descrição |\n" -"|-------------------|---------------------------- -------------------------------------------------- " -"---------------------|\n" -"| `rust_binary` | Produz um binário Rust. |\n" -"| `rust_library` | Produz uma biblioteca Rust e fornece as variantes `rlib` e `dylib`. |\n" -"| `rust_ffi` | Produz uma biblioteca Rust C utilizável por módulos `cc` e fornece variantes estáticas e compartilhadas. |\n" -"| `rust_proc_macro` | Produz uma biblioteca Rust `proc-macro`. Estes são análogos aos plugins do compilador. |\n" -"| `rust_test` | Produz um binário de teste Rust que usa o equipamento de teste Rust padrão. |\n" -"| `rust_fuzz` | Produz um binário Rust fuzz aproveitando `libfuzzer`. |\n" -"| `rust_protobuf` | Gera o código-fonte e produz uma biblioteca Rust que fornece uma interface para um protobuf específico. " -"|\n" -"| `rust_bindgen` | Gera fonte e produz uma biblioteca Rust contendo ligações Rust para bibliotecas C. |" +"|-------------------|----------------------------------------------------------------------------------------------------------|\n" +"| `rust_binary` | Produz um binário Rust. |\n" +"| `rust_library` | Produz uma biblioteca Rust e fornece as variantes `rlib` e `dylib`. |\n" +"| `rust_ffi` | Produz uma biblioteca Rust C utilizável por módulos `cc` e fornece variantes estáticas e compartilhadas. |\n" +"| `rust_proc_macro` | Produz uma biblioteca Rust `proc-macro`. Estes são análogos aos plugins do compilador. |\n" +"| `rust_test` | Produz um binário de teste Rust que usa o equipamento de teste Rust padrão. |\n" +"| `rust_fuzz` | Produz um binário Rust fuzz aproveitando `libfuzzer`. |\n" +"| `rust_protobuf` | Gera o código-fonte e produz uma biblioteca Rust que fornece uma interface para um _protobuf_ específico.|\n" +"| `rust_bindgen` | Gera fonte e produz uma biblioteca Rust contendo ligações Rust para bibliotecas C. |" #: src/android/build-rules.md:16 msgid "We will look at `rust_binary` and `rust_library` next." @@ -13629,7 +14267,7 @@ msgid "" "```" msgstr "" "```javascript\n" -"rust_binário {\n" +"rust_binary{\n" " name: \"olá_rust\",\n" " crate_name: \"hello_rust\",\n" " srcs: [\"src/main.rs\"],\n" @@ -13646,7 +14284,7 @@ msgid "" "//! Rust demo." msgstr "" "```rust\n" -"//! Demonstração de rust." +"//! Demonstração de Rust." #: src/android/build-rules/binary.md:21 msgid "" @@ -13676,7 +14314,7 @@ msgid "" "```" msgstr "" "```shell\n" -"$ m olá_rust\n" +"$ m hello_rust\n" "$ adb push $ANDROID_PRODUCT_OUT/system/bin/hello_rust /data/local/tmp\n" "$ adb shell /data/local/tmp/hello_rust\n" "Saudações da Rust!\n" @@ -13684,7 +14322,7 @@ msgstr "" #: src/android/build-rules/library.md:1 msgid "# Rust Libraries" -msgstr "# Bibliotecas de rust" +msgstr "# Bibliotecas de Rust" #: src/android/build-rules/library.md:3 msgid "You use `rust_library` to create a new Rust library for Android." @@ -13695,23 +14333,20 @@ msgid "Here we declare a dependency on two libraries:" msgstr "Aqui declaramos uma dependência em duas bibliotecas:" #: src/android/build-rules/library.md:7 -#, fuzzy msgid "" "* `libgreeting`, which we define below,\n" "* `libtextwrap`, which is a crate already vendored in\n" " [`external/rust/crates/`][crates]." msgstr "" "* `libgreeting`, que definimos abaixo,\n" -"* `libtextwrap`, que é uma caixa já vendida em\n" -" [`externo/rust/caixas/`][caixas]." +"* `libtextwrap`, que é um `crate` já vendida em\n" +" [`external/rust/crates/`][crates]." #: src/android/build-rules/library.md:11 -#, fuzzy msgid "[crates]: https://cs.android.com/android/platform/superproject/+/master:external/rust/crates/" -msgstr "[caixas]: https://cs.android.com/android/platform/superproject/+/master:external/rust/crates/" +msgstr "[crates]: https://cs.android.com/android/platform/superproject/+/master:external/rust/crates/" #: src/android/build-rules/library.md:15 -#, fuzzy msgid "" "```javascript\n" "rust_binary {\n" @@ -13793,7 +14428,7 @@ msgid "" "//! Greeting library." msgstr "" "```rust, ignore\n" -"//! Saudação biblioteca." +"//! Biblioteca de Saudação." #: src/android/build-rules/library.md:53 msgid "" @@ -13803,8 +14438,8 @@ msgid "" "}\n" "```" msgstr "" -"/// Saudação `name`.\n" -"pub fn saudação(name: &str) -> String {\n" +"/// Saudação `nome`.\n" +"pub fn greeting(name: &str) -> String {\n" " format!(\"Olá {name}, prazer em conhecê-lo!\")\n" "}\n" "```" @@ -13827,13 +14462,12 @@ msgstr "" "$ m hello_rust_with_dep\n" "$ adb push $ANDROID_PRODUCT_OUT/system/bin/hello_rust_with_dep /data/local/tmp\n" "$ adb shell /data/local/tmp/hello_rust_with_dep\n" -"Olá Bob, é muito\n" -"prazer em conhecê-lo!\n" +"Olá Bob, prazer em conhecê-lo!\n" "```" #: src/android/aidl.md:1 msgid "# AIDL" -msgstr "#AIDL" +msgstr "# AIDL" #: src/android/aidl.md:3 msgid "" @@ -13883,13 +14517,13 @@ msgstr "" "/** Interface de serviço de aniversário. */\n" "interface IBirthdayService {\n" " /** Gera uma mensagem de feliz aniversário. */\n" -" String desejoFelizAniversário(String name, int anos);\n" +" String wishHappyBirthday(String name, int years);\n" "}\n" "```" #: src/android/aidl/interface.md:17 msgid "*birthday_service/aidl/Android.bp*:" -msgstr "*aniversário_service/aidl/Android.bp*:" +msgstr "*birthday_service/aidl/Android.bp*:" #: src/android/aidl/interface.md:19 msgid "" @@ -13910,10 +14544,10 @@ msgstr "" "aidl_interface {\n" " name: \"com.example.birthdayservice\",\n" " srcs: [\"com/example/birthdayservice/*.aidl\"],\n" -" instável: true,\n" -" Processo interno: {\n" +" unstable: true,\n" +" backend: {\n" " rust: { // Rust não está ativado por padrão\n" -" ativado: true,\n" +" enabled: true,\n" " },\n" " },\n" "}\n" @@ -13924,8 +14558,7 @@ msgid "" "Add `vendor_available: true` if your AIDL file is used by a binary in the vendor\n" "partition." msgstr "" -"Adicione `vendor_available: true` se seu arquivo AIDL for usado por um binário no fornecedor\n" -"partição." +"Adicione `vendor_available: true` se seu arquivo AIDL for usado por um binário na partição _vendor_." #: src/android/aidl/implementation.md:1 msgid "# Service Implementation" @@ -13937,7 +14570,7 @@ msgstr "Agora podemos implementar o serviço AIDL:" #: src/android/aidl/implementation.md:5 msgid "*birthday_service/src/lib.rs*:" -msgstr "*aniversário_serviço/src/lib.rs*:" +msgstr "*birthday_service/src/lib.rs*:" #: src/android/aidl/implementation.md:7 msgid "" @@ -13961,7 +14594,7 @@ msgstr "" #: src/android/aidl/implementation.md:15 msgid "impl binder::Interface for BirthdayService {}" -msgstr "impl binder::Interface para BirthdayService {}" +msgstr "impl binder::Interface for BirthdayService {}" #: src/android/aidl/implementation.md:17 msgid "" @@ -13985,7 +14618,7 @@ msgstr "" #: src/android/aidl/implementation.md:26 src/android/aidl/server.md:28 src/android/aidl/client.md:37 msgid "*birthday_service/Android.bp*:" -msgstr "*aniversário_serviço/Android.bp*:" +msgstr "*birthday_service/Android.bp*:" #: src/android/aidl/implementation.md:28 msgid "" @@ -14005,7 +14638,7 @@ msgstr "" "rust_library {\n" " name: \"libbirthdayservice\",\n" " srcs: [\"src/lib.rs\"],\n" -" crate_name: \"aniversário\",\n" +" crate_name: \"birthdayservice\",\n" " rustlibs: [\n" " \"com.example.birthdayservice-rust\",\n" " \"libbinder_rs\",\n" @@ -14019,11 +14652,11 @@ msgstr "# Servidor AIDL" #: src/android/aidl/server.md:3 msgid "Finally, we can create a server which exposes the service:" -msgstr "Finalmente, podemos criar um servidor que exponha o serviço:" +msgstr "Finalmente, podemos criar um servidor que expõe o serviço:" #: src/android/aidl/server.md:5 msgid "*birthday_service/src/server.rs*:" -msgstr "*aniversário_serviço/src/servidor.rs*:" +msgstr "*birthday_service/src/server.rs*:" #: src/android/aidl/server.md:7 msgid "" @@ -14041,7 +14674,7 @@ msgstr "" #: src/android/aidl/server.md:13 src/android/aidl/client.md:12 msgid "const SERVICE_IDENTIFIER: &str = \"birthdayservice\";" -msgstr "const SERVICE_IDENTIFIER: &str = \"aniversário\";" +msgstr "const SERVICE_IDENTIFIER: &str = \"birthdayservice\";" #: src/android/aidl/server.md:15 msgid "" @@ -14060,9 +14693,9 @@ msgid "" msgstr "" "/// Point de entrada para serviço de aniversário.\n" "fn main() {\n" -" let serviço_aniversário = ServiçoAniversário;\n" +" let birthday_service = BirthdayService;\n" " let birthday_service_binder = BnBirthdayService::new_binder(\n" -" aniversário_serviço,\n" +" birthday_server,\n" " binder::BinderFeatures::default(),\n" " );\n" " binder::add_service(SERVICE_IDENTIFIER, birthday_service_binder.as_binder())\n" @@ -14088,10 +14721,10 @@ msgid "" "```" msgstr "" "```javascript\n" -"rust_binário {\n" -" name: \"aniversário_servidor\",\n" -" crate_name: \"aniversário_servidor\",\n" -" srcs: [\"src/servidor.rs\"],\n" +"rust_binary {\n" +" name: \"birthday_server\",\n" +" crate_name: \"birthday_server\",\n" +" srcs: [\"src/server.rs\"],\n" " rustlibs: [\n" " \"com.example.birthdayservice-rust\",\n" " \"libbinder_rs\",\n" @@ -14118,7 +14751,7 @@ msgid "" "```" msgstr "" "```shell\n" -"$ m aniversário_servidor\n" +"$ m birthday_server\n" "$ adb push $ANDROID_PRODUCT_OUT/system/bin/birthday_server /data/local/tmp\n" "$ adb shell /data/local/tmp/birthday_server\n" "```" @@ -14163,7 +14796,7 @@ msgstr "" "Result: Parcel(\n" " 0x00000000: 00000000 00000036 00610048 00700070 '....6...H.a.p.p.'\n" " 0x00000010: 00200079 00690042 00740072 00640068 'y. .B.i.r.t.h.d.'\n" -" 0x00000020: 00790061 00420020 0062006f 0020002c 'a.y. .Prumo.,. .'\n" +" 0x00000020: 00790061 00420020 0062006f 0020002c 'a.y. .B.o.b.,. .'\n" " 0x00000030: 006f0063 0067006e 00610072 00750074 'c.o.n.g.r.a.t.u.'\n" " 0x00000040: 0061006c 00690074 006e006f 00200073 'l.a.t.i.o.n.s. .'\n" " 0x00000050: 00690077 00680074 00740020 00650068 'w.i.t.h. .a.'\n" @@ -14181,7 +14814,7 @@ msgstr "Por fim, podemos criar um cliente Rust para nosso novo serviço." #: src/android/aidl/client.md:5 msgid "*birthday_service/src/client.rs*:" -msgstr "*aniversário_service/src/client.rs*:" +msgstr "*birthday_server/src/client.rs*:" #: src/android/aidl/client.md:7 msgid "" @@ -14219,7 +14852,7 @@ msgid "" " .and_then(|arg| arg.parse::().ok())\n" " .unwrap_or(42);" msgstr "" -"/// Ligue para o serviço de aniversário.\n" +"/// Chamada ao serviço de aniversário.\n" "fn main() -> Result<(), binder::Status> {\n" " let name = std::env::args()\n" " .nth(1)\n" @@ -14263,9 +14896,9 @@ msgid "" "```" msgstr "" "```javascript\n" -"rust_binário {\n" -" name: \"aniversario_cliente\",\n" -" crate_name: \"aniversário_cliente\",\n" +"rust_binary {\n" +" name: \"birthday_client\",\n" +" crate_name: \"birthday_client\",\n" " srcs: [\"src/client.rs\"],\n" " rustlibs: [\n" " \"com.example.birthdayservice-rust\",\n" @@ -14293,7 +14926,7 @@ msgid "" "```" msgstr "" "```shell\n" -"$ m aniversário_cliente\n" +"$ m birthday_client\n" "$ adb push $ANDROID_PRODUCT_OUT/system/bin/birthday_client /data/local/tmp\n" "$ adb shell /data/local/tmp/birthday_client Charlie 60\n" "Parabéns Charlie, parabéns pelos 60 anos!\n" @@ -14308,7 +14941,7 @@ msgid "" "Let us extend the API with more functionality: we want to let clients specify a\n" "list of lines for the birthday card:" msgstr "" -"Vamos estender a API com mais funcionalage: queremos permitir que os clientes especifiquem um\n" +"Vamos estender a API com mais funcionalidades: queremos permitir que os clientes especifiquem uma\n" "lista de linhas para o cartão de aniversário:" #: src/android/aidl/changing.md:9 @@ -14329,15 +14962,15 @@ msgstr "" #: src/android/logging.md:1 msgid "# Logging" -msgstr "# Exploração madeireira" +msgstr "# Gerando registros (Log)" #: src/android/logging.md:3 msgid "" "You should use the `log` crate to automatically log to `logcat` (on-device) or\n" "`stdout` (on-host):" msgstr "" -"Você deve usar a caixa `log` para logar automaticamente no `logcat` (on-device dispositivo) ou\n" -"`stdout` (on-host):" +"Você deve usar o `crate` `log` para logar automaticamente no `logcat` (no dispositivo) ou\n" +"`stdout` (no hospedeiro):" #: src/android/logging.md:6 msgid "_hello_rust_logs/Android.bp_:" @@ -14360,13 +14993,13 @@ msgid "" "```" msgstr "" "```javascript\n" -"rust_binário {\n" +"rust_binary {\n" " name: \"hello_rust_logs\",\n" " crate_name: \"hello_rust_logs\",\n" " srcs: [\"src/main.rs\"],\n" " rustlibs: [\n" " \"liblog_rust\",\n" -" \"blogueiro\",\n" +" \"liblogger\",\n" " ],\n" " prefere_rlib: true,\n" " host_supported: true,\n" @@ -14413,7 +15046,7 @@ msgstr "" " );\n" " debug!(\"Iniciando programa.\");\n" " info!(\"As coisas estão indo bem.\");\n" -" erro!(\"Algo deu errado!\");\n" +" error!(\"Algo deu errado!\");\n" "}\n" "```" @@ -14457,43 +15090,43 @@ msgstr "" #: src/android/interoperability.md:1 msgid "# Interoperability" -msgstr "# Interoperabilage" +msgstr "# Interoperabilidade" #: src/android/interoperability.md:3 msgid "" "Rust has excellent support for interoperability with other languages. This means\n" "that you can:" msgstr "" -"Rust tem excelente suporte para interoperabilage com outras linguagens. Isso significa\n" -"isso você pode:" +"Rust tem excelente suporte para interoperabilidade com outras linguagens. Isso significa\n" +"que você pode:" #: src/android/interoperability.md:6 msgid "" "* Call Rust functions from other languages.\n" "* Call functions written in other languages from Rust." msgstr "" -"* Chame funções Rust de outros idiomas.\n" -"* Chama funções escritas em outras linguagens do Rust." +"* Chamar funções _Rust_ em outras linguagens.\n" +"* Chamar funções escritas em outras linguagens no _Rust_." #: src/android/interoperability.md:9 msgid "" "When you call functions in a foreign language we say that you're using a\n" "_foreign function interface_, also known as FFI." msgstr "" -"Quando você chama funções em um idioma estrangeiro, dizemos que você está usando um\n" +"Quando você chama funções em outra linguagem, dizemos que você está usando uma\n" "_interface de função externa_, também conhecida como FFI." #: src/android/interoperability/with-c.md:1 msgid "# Interoperability with C" -msgstr "# Interoperabilage com C" +msgstr "# Interoperabilidade com C" #: src/android/interoperability/with-c.md:3 msgid "" "Rust has full support for linking object files with a C calling convention.\n" "Similarly, you can export Rust functions and call them from C." msgstr "" -"Rust tem suporte completo para vincular arquivos de objeto com uma convenção de chamada C.\n" -"Da mesma forma, você pode exportar funções Rust e chamá-las de C." +"_Rust_ tem suporte completo para vincular arquivos de objeto com uma convenção de chamada C.\n" +"Da mesma forma, você pode exportar funções Rust e chamá-las em C." #: src/android/interoperability/with-c.md:6 msgid "You can do it by hand if you want:" @@ -14528,13 +15161,12 @@ msgstr "" "```" #: src/android/interoperability/with-c.md:20 -#, fuzzy msgid "" "We already saw this in the [Safe FFI Wrapper\n" "exercise](../../exercises/day-3/safe-ffi-wrapper.md)." msgstr "" -"Já vimos isso no [Safe FFI Wrapper\n" -"exercício](../../exercises/day-3/safe-ffi-wrapper.md)." +"Já vimos isso no exercício [Safe FFI Wrapper\n" +"](../../exercises/day-3/safe-ffi-wrapper.md)." #: src/android/interoperability/with-c.md:23 msgid "" @@ -14566,7 +15198,7 @@ msgstr "Primeiro crie uma pequena biblioteca C:" #: src/android/interoperability/with-c/bindgen.md:8 msgid "_interoperability/bindgen/libbirthday.h_:" -msgstr "_interoperabilage/bindgen/libbirthday.h_:" +msgstr "_interoperability/bindgen/libbirthday.h_:" #: src/android/interoperability/with-c/bindgen.md:10 msgid "" @@ -14592,7 +15224,7 @@ msgstr "" #: src/android/interoperability/with-c/bindgen.md:19 msgid "_interoperability/bindgen/libbirthday.c_:" -msgstr "_interoperabilage/bindgen/libbirthday.c_:" +msgstr "_interoperability/bindgen/libbirthday.c_:" #: src/android/interoperability/with-c/bindgen.md:21 msgid "" @@ -14602,7 +15234,7 @@ msgid "" msgstr "" "```c\n" "#include \n" -"#include \"libaniversário.h\"" + "#include \"libbirthday.h\"" #: src/android/interoperability/with-c/bindgen.md:25 msgid "" @@ -14616,7 +15248,7 @@ msgid "" msgstr "" "void print_card(const card* card) {\n" " printf(\"+--------------\\n\");\n" -" printf(\"| Feliz Aniversário %s!\\n\", cartão->name);\n" +" printf(\"| Feliz Aniversário %s!\\n\", card->name);\n" " printf(\"| Parabéns pelos %i anos!\\n\", card->years);\n" " printf(\"+--------------\\n\");\n" "}\n" @@ -14629,7 +15261,7 @@ msgstr "Adicione isto ao seu arquivo `Android.bp`:" #: src/android/interoperability/with-c/bindgen.md:35 src/android/interoperability/with-c/bindgen.md:55 #: src/android/interoperability/with-c/bindgen.md:69 src/android/interoperability/with-c/bindgen.md:108 msgid "_interoperability/bindgen/Android.bp_:" -msgstr "_interoperabilage/bindgen/Android.bp_:" +msgstr "_interoperability/bindgen/Android.bp_:" #: src/android/interoperability/with-c/bindgen.md:37 msgid "" @@ -14642,7 +15274,7 @@ msgid "" msgstr "" "```javascript\n" "cc_library {\n" -" name: \"libaniversário\",\n" +" name: \"libbirthday\",\n" " srcs: [\"libbirthday.c\"],\n" "}\n" "```" @@ -14657,7 +15289,7 @@ msgstr "" #: src/android/interoperability/with-c/bindgen.md:47 msgid "_interoperability/bindgen/libbirthday_wrapper.h_:" -msgstr "_interoperabilage/bindgen/libbirthday_wrapper.h_:" +msgstr "_interoperability/bindgen/libbirthday_wrapper.h_:" #: src/android/interoperability/with-c/bindgen.md:49 msgid "" @@ -14666,7 +15298,7 @@ msgid "" "```" msgstr "" "```c\n" -"#include \"libaniversário.h\"\n" +"#include \"libbirthday.h\"\n" "```" #: src/android/interoperability/with-c/bindgen.md:53 @@ -14688,10 +15320,10 @@ msgstr "" "```javascript\n" "rust_bindgen {\n" " name: \"libbirthday_bindgen\",\n" -" crate_name: \"aniversário_bindgen\",\n" +" crate_name: \"birthday_bindgen\",\n" " wrapper_src: \"libbirthday_wrapper.h\",\n" -" source_stem: \"vinculações\",\n" -" static_libs: [\"libaniversário\"],\n" +" source_stem: \"bindings\",\n" +" static_libs: [\"libbirthday\"],\n" "}\n" "```" @@ -14710,7 +15342,7 @@ msgid "" "```" msgstr "" "```javascript\n" -"rust_binário {\n" +"rust_binary{\n" " name: \"print_birthday_card\",\n" " srcs: [\"main.rs\"],\n" " rustlibs: [\"libbirthday_bindgen\"],\n" @@ -14719,7 +15351,7 @@ msgstr "" #: src/android/interoperability/with-c/bindgen.md:79 msgid "_interoperability/bindgen/main.rs_:" -msgstr "_interoperabilage/bindgen/main.rs_:" +msgstr "_interoperability/bindgen/main.rs_:" #: src/android/interoperability/with-c/bindgen.md:81 msgid "" @@ -14823,25 +15455,23 @@ msgstr "Exportar funções e tipos do Rust para C é fácil:" #: src/android/interoperability/with-c/rust.md:5 msgid "_interoperability/rust/libanalyze/analyze.rs_" -msgstr "_interoperabilage/rust/libanalyze/analyze.rs_" +msgstr "_interoperability/rust/libanalyze/analyze.rs_" #: src/android/interoperability/with-c/rust.md:7 -#, fuzzy msgid "" "```rust,editable\n" "//! Rust FFI demo.\n" "#![deny(improper_ctypes_definitions)]" msgstr "" "```rust, editable\n" -"//! Rust FFI demonstração.\n" -"#![negar(improper_ctypes_definitions)]" +"//! Demonstração de uso do FFI com Rust.\n" +"#![deny(improper_ctypes_definitions)]" #: src/android/interoperability/with-c/rust.md:11 msgid "use std::os::raw::c_int;" msgstr "use std::os::raw::c_int;" #: src/android/interoperability/with-c/rust.md:13 -#, fuzzy msgid "" "/// Analyze the numbers.\n" "#[no_mangle]\n" @@ -14856,7 +15486,7 @@ msgid "" msgstr "" "/// Analisar os números.\n" "#[no_mangle]\n" -"pub extern \"C\" fn analise_números(x: c_int, y: c_int) {\n" +"pub extern \"C\" fn analyze_numbers(x: c_int, y: c_int) {\n" " if x < y {\n" " println!(\"x ({x}) é o menor!\");\n" " } else {\n" @@ -14867,7 +15497,7 @@ msgstr "" #: src/android/interoperability/with-c/rust.md:24 msgid "_interoperability/rust/libanalyze/analyze.h_" -msgstr "_interoperabilage/rust/libanalyze/analyze.h_" +msgstr "_interoperability/rust/libanalyze/analyze.h_" #: src/android/interoperability/with-c/rust.md:26 msgid "" @@ -14885,8 +15515,8 @@ msgid "" "void analyze_numbers(int x, int y);\n" "}" msgstr "" -"externo \"C\" {\n" -"void analizar_números(int x, int y);\n" +"extern \"C\" {\n" +"void analyze_numbers(int x, int y);\n" "}" #: src/android/interoperability/with-c/rust.md:34 @@ -14894,12 +15524,12 @@ msgid "" "#endif\n" "```" msgstr "" -"#fim se\n" +"#endif\n" "```" #: src/android/interoperability/with-c/rust.md:37 msgid "_interoperability/rust/libanalyze/Android.bp_" -msgstr "_interoperabilage/rust/libanalyze/Android.bp_" +msgstr "_interoperability/rust/libanalyze/Android.bp_" #: src/android/interoperability/with-c/rust.md:39 msgid "" @@ -14916,7 +15546,7 @@ msgstr "" "rust_ffi {\n" " name: \"libanalyze_ffi\",\n" " crate_name: \"analyze_ffi\",\n" -" srcs: [\"analisar.rs\"],\n" +" srcs: [\"analyze.rs\"],\n" " include_dirs: [\".\"],\n" "}\n" "```" @@ -14927,7 +15557,7 @@ msgstr "Agora podemos chamar isso de um binário C:" #: src/android/interoperability/with-c/rust.md:50 msgid "_interoperability/rust/analyze/main.c_" -msgstr "_interoperabilage/rust/analisar/main.c_" +msgstr "_interoperability/rust/analisar/main.c_" #: src/android/interoperability/with-c/rust.md:52 msgid "" @@ -14935,7 +15565,7 @@ msgid "" "#include \"analyze.h\"" msgstr "" "```c\n" -"#include \"analisar.h\"" +"#include \"analyze.h\"" #: src/android/interoperability/with-c/rust.md:55 msgid "" @@ -14955,7 +15585,7 @@ msgstr "" #: src/android/interoperability/with-c/rust.md:62 msgid "_interoperability/rust/analyze/Android.bp_" -msgstr "_interoperabilage/rust/analyze/Android.bp_" +msgstr "_interoperability/rust/analyze/Android.bp_" #: src/android/interoperability/with-c/rust.md:64 msgid "" @@ -14969,7 +15599,7 @@ msgid "" msgstr "" "```javascript\n" "cc_binary {\n" -" name: \"analisar_números\",\n" +" name: \"analyze_numbers\",\n" " srcs: [\"main.c\"],\n" " static_libs: [\"libanalyze_ffi\"],\n" "}\n" @@ -14984,7 +15614,7 @@ msgid "" "```" msgstr "" "```shell\n" -"$ m analizar_números\n" +"$ m analyze_numbers\n" "$ adb push $ANDROID_PRODUCT_OUT/system/bin/analyze_numbers /data/local/tmp\n" "$ adb shell /data/local/tmp/analyze_numbers\n" "```" @@ -14994,8 +15624,8 @@ msgid "" "`#[no_mangle]` disables Rust's usual name mangling, so the exported symbol will just be the name of\n" "the function. You can also use `#[export_name = \"some_name\"]` to specify whatever name you want." msgstr "" -"`#[no_mangle]` desativa a alteração de name usual do Rust, então o símbolo exportado será apenas o name de\n" -"a função. Você também pode usar `#[export_name = \"some_name\"]` para especificar qualquer name que desejar." +"`#[no_mangle]` desativa a alteração de name usual do Rust, então o símbolo exportado será apenas o nome da\n" +"função. Você também pode usar `#[export_name = \"some_name\"]` para especificar qualquer nome que desejar." #: src/android/interoperability/cpp.md:1 msgid "# With C++" @@ -15006,7 +15636,7 @@ msgid "" "The [CXX crate][1] makes it possible to do safe interoperability between Rust\n" "and C++." msgstr "" -"A [caixa CXX] [1] possibilita a interoperabilage segura entre Rust\n" +"O [crate CXX][1] possibilita a interoperabilidade segura entre Rust\n" "e C++." #: src/android/interoperability/cpp.md:6 @@ -15019,7 +15649,7 @@ msgstr "" #: src/android/interoperability/cpp.md:10 msgid "See the [CXX tutorial][2] for an full example of using this." -msgstr "Veja o [tutorial CXX][2] para um exemplo completo de como usar isso." +msgstr "Veja o [tutorial CXX][2] para um exemplo completo de como usá-lo." #: src/android/interoperability/cpp.md:12 msgid "" @@ -15031,7 +15661,7 @@ msgstr "" #: src/android/interoperability/java.md:1 msgid "# Interoperability with Java" -msgstr "# Interoperabilage com Java" +msgstr "# Interoperabilidade com Java" #: src/android/interoperability/java.md:3 msgid "" @@ -15040,8 +15670,8 @@ msgid "" "crate](https://docs.rs/jni/) allows you to create a compatible library." msgstr "" "Java pode carregar objetos compartilhados via [Java Native Interface\n" -"(JNI)](https://en.wikipedia.org/wiki/Java_Native_Interface). O [`jni`\n" -"crate](https://docs.rs/jni/) permite que você crie uma biblioteca compatível." +"(JNI)](https://en.wikipedia.org/wiki/Java_Native_Interface).\n" +"O [crate `jni`](https://docs.rs/jni/) permite que você crie uma biblioteca compatível." #: src/android/interoperability/java.md:7 msgid "First, we create a Rust function to export to Java:" @@ -15049,7 +15679,7 @@ msgstr "Primeiro, criamos uma função Rust para exportar para Java:" #: src/android/interoperability/java.md:9 msgid "_interoperability/java/src/lib.rs_:" -msgstr "_interoperabilage/java/src/lib.rs_:" +msgstr "_interoperability/java/src/lib.rs_:" #: src/android/interoperability/java.md:11 msgid "" @@ -15057,7 +15687,7 @@ msgid "" "//! Rust <-> Java FFI demo." msgstr "" "```rust,compile_fail\n" -"//! Rust <-> Demonstração Java FFI." +"//! Demonstração FFI Rust <-> Java." #: src/android/interoperability/java.md:14 msgid "" @@ -15087,13 +15717,13 @@ msgid "" msgstr "" "/// Implementação do método HelloWorld::hello.\n" "#[no_mangle]\n" -"pub extern \"sistema\" fn Java_HelloWorld_hello(\n" +"pub extern \"system\" fn Java_HelloWorld_hello(\n" " env: JNIEnv,\n" " _class: JClass,\n" " name: JString,\n" ") -> jstring {\n" " let input: String = env.get_string(name).unwrap().into();\n" -" let saudação = format!(\"Olá, {input}!\");\n" +" let greeting = format!(\"Olá, {input}!\");\n" " let output = env.new_string(greeting).unwrap();\n" " output.into_inner()\n" "}\n" @@ -15101,7 +15731,7 @@ msgstr "" #: src/android/interoperability/java.md:32 src/android/interoperability/java.md:62 msgid "_interoperability/java/Android.bp_:" -msgstr "_interoperabilage/java/Android.bp_:" +msgstr "_interoperability/java/Android.bp_:" #: src/android/interoperability/java.md:34 msgid "" @@ -15129,7 +15759,7 @@ msgstr "Finalmente, podemos chamar esta função do Java:" #: src/android/interoperability/java.md:45 msgid "_interoperability/java/HelloWorld.java_:" -msgstr "_interoperabilage/java/HelloWorld.java_:" +msgstr "_interoperability/java/HelloWorld.java_:" #: src/android/interoperability/java.md:47 msgid "" @@ -15138,8 +15768,8 @@ msgid "" " private static native String hello(String name);" msgstr "" "```java\n" -"classe AlôMundo {\n" -" private static nativo String hello(String name);" +"classe HelloWorld{\n" +" private static native String hello(String name);" #: src/android/interoperability/java.md:51 msgid "" @@ -15162,7 +15792,7 @@ msgid "" msgstr "" " public static void main(String[] args) {\n" " String output = HelloWorld.hello(\"Alice\");\n" -" System.out.println(saída);\n" +" System.out.println(output);\n" " }\n" "}\n" "```" @@ -15182,7 +15812,7 @@ msgstr "" "java_binary {\n" " name: \"helloworld_jni\",\n" " srcs: [\"HelloWorld.java\"],\n" -" main_class: \"OláMundo\",\n" +" main_class: \"HelloWorld\",\n" " necessário: [\"libhello_jni\"],\n" "}\n" "```" @@ -15210,8 +15840,8 @@ msgid "" "For the last exercise, we will look at one of the projects you work with. Let us\n" "group up and do this together. Some suggestions:" msgstr "" -"No último exercício, veremos um dos projetos com os quais você trabalha. let-nos\n" -"agrupe-se e faça isso juntos. Algumas sugestões:" +"No último exercício, veremos um dos projetos com os quais você trabalha. Chamem-nos\n" +"agrupem-se e façam isso juntos. Algumas sugestões:" #: src/exercises/day-4/afternoon.md:6 msgid "* Call your AIDL service with a client written in Rust." @@ -15226,8 +15856,8 @@ msgid "" "No solution is provided here since this is open-ended: it relies on someone in\n" "the class having a piece of code which you can turn in to Rust on the fly." msgstr "" -"Nenhuma solução é fornecida aqui, pois isso é aberto: depende de alguém em\n" -"a classe tendo um pedaço de código que você pode transformar em Rust em tempo real." +"Nenhuma solução é fornecida aqui, pois isso é aberto: depende de você ter\n" +"uma classe tendo um pedaço de código que você pode transformar em Rust em tempo real." #: src/thanks.md:1 msgid "# Thanks!" @@ -15239,7 +15869,7 @@ msgid "" "was useful." msgstr "" "_Obrigado por fazer o Comprehensive Rust 🦀!_ Esperamos que tenha gostado e que\n" -"foi útil." +"tenha sido útil." #: src/thanks.md:6 msgid "" @@ -15252,19 +15882,19 @@ msgstr "" "Nós nos divertimos muito montando o curso. O curso não é perfeito,\n" "portanto, se você identificou algum erro ou tem ideias para melhorias, entre em\n" "[entre em contato conosco em\n" -"GitHub](https://github.com/google/comprehensive-rust/discussions). nós adoraríamos\n" -"ouvir de você." +"GitHub](https://github.com/google/comprehensive-rust/discussions). Nós adoraríamos\n" +"ouvir você." #: src/other-resources.md:1 msgid "# Other Rust Resources" -msgstr "# Outros recursos de rust" +msgstr "# Outros recursos de Rust" #: src/other-resources.md:3 msgid "" "The Rust community has created a wealth of high-quality and free resources\n" "online." msgstr "" -"A comunage Rust criou uma riqueza de recursos gratuitos e de alta qualage\n" +"A comunidade Rust tem abundância de recursos gratuitos e de alta qualidade\n" "on-line." #: src/other-resources.md:6 @@ -15290,14 +15920,14 @@ msgid "" " which describes the Rust grammar and memory model." msgstr "" "* [A Linguagem de Programação Rust](https://doc.rust-lang.org/book/): o\n" -" livro gratuito canônico sobre Rust. Abrange o idioma em detalhes e inclui um\n" -" poucos projetos para as Persons construírem.\n" -"* [Rust By Example](https://doc.rust-lang.org/rust-by-example/): abrange o Rust\n" -" sintaxe por meio de uma série de exemplos que mostram diferentes construções. As vezes\n" -" inclui pequenos exercícios onde você é solicitado a expandir o código no\n" +" livro gratuito canônico sobre Rust. Abrange o idioma em detalhes e inclui alguns\n" +" projetos para as pessoas construírem.\n" +"* [Rust By Example](https://doc.rust-lang.org/rust-by-example/): abrange a sintaxe de Rust\n" +" por meio de uma série de exemplos que mostram diferentes construções. As vezes\n" +" inclui pequenos exercícios onde você é solicitado a expandir o código dos\n" " exemplos.\n" -"* [Rust Standard Library](https://doc.rust-lang.org/std/): documentação completa de\n" -" a biblioteca padrão para Rust.\n" +"* [Rust Standard Library](https://doc.rust-lang.org/std/): documentação completa da\n" +" biblioteca padrão para Rust.\n" "* [The Rust Reference](https://doc.rust-lang.org/reference/): um livro incompleto\n" " que descreve a gramática Rust e o modelo de memória." @@ -15317,12 +15947,12 @@ msgid "" " introduction to using Rust on embedded devices without an operating system." msgstr "" "* [O Rustonomicon](https://doc.rust-lang.org/nomicon/): cobre Rust inseguro,\n" -" incluindo trabalhar com ponteiros brutos e fazer interface com outros idiomas\n" +" incluindo trabalhar com ponteiros brutos e fazer interface com outras linguagens\n" " (FFI).\n" "* [Programação assíncrona em Rust](https://rust-lang.github.io/async-book/):\n" " abrange o novo modelo de programação assíncrona que foi introduzido após o\n" -" Rust Book foi escrito.\n" -"* [The Embedded Rust Book](https://doc.rust-lang.org/stable/embedded-book/): um\n" +" Rust Book ser escrito.\n" +"* [The Embedded Rust Book](https://doc.rust-lang.org/stable/embedded-book/): uma\n" " introdução ao uso do Rust em dispositivos embarcados sem um sistema operacional." #: src/other-resources.md:33 @@ -15359,24 +15989,23 @@ msgid "" msgstr "" "* [Aprenda Rust da maneira perigosa](http://cliffle.com/p/dangerust/): cobre Rust\n" " da perspectiva de programadores C de baixo nível.\n" -"* [Rust for Embedded C\n" -" Programadores](https://docs.opentitan.org/doc/ug/rust_for_c/): cobre Rust de\n" -" a perspectiva dos desenvolvedores que escrevem firmware em C.\n" +"* [Rust para Programadores Embedded C](https://docs.opentitan.org/doc/ug/rust_for_c/):\n" +" cobre Rust da perspectiva dos desenvolvedores que escrevem firmware em C.\n" "* [Rust para profissionais](https://overexact.com/rust-for-professionals/):\n" " cobre a sintaxe do Rust usando comparações lado a lado com outras linguagens\n" " como C, C++, Java, JavaScript e Python.\n" "* [Rust on Exercism](https://exercism.org/tracks/rust): mais de 100 exercícios para ajudar\n" " você aprende Rust.\n" "* [Ensino Ferroso\n" -" Material](https://ferrous-systems.github.io/teaching-material/index.html): a\n" -" série de pequenas apresentações abrangendo tanto a parte básica quanto a avançada do\n" -" Linguagem de rust. Outros tópicos como WebAssembly e async/await também são\n" -" abordado.\n" +" Material](https://ferrous-systems.github.io/teaching-material/index.html): uma\n" +" série de pequenas apresentações abrangendo tanto a parte básica quanto a avançada da\n" +" Linguagem Rust. Outros tópicos como WebAssembly e async/await também são\n" +" abordados.\n" "* [Série Iniciante a\n" " Rust](https://docs.microsoft.com/en-us/shows/beginners-series-to-rust/) e\n" " [Dê seus primeiros passos com\n" " Rust](https://docs.microsoft.com/en-us/learn/paths/rust-first-steps/): dois\n" -" Rust guias voltados para novos desenvolvedores. O primeiro é um conjunto de 35 vídeos e o\n" +" guias Rust voltados para novos desenvolvedores. O primeiro é um conjunto de 35 vídeos e o\n" " o segundo é um conjunto de 11 módulos que cobrem a sintaxe Rust e as construções básicas." #: src/other-resources.md:59 @@ -15398,16 +16027,15 @@ msgid "" "resources." msgstr "" "O material aqui se baseia em muitas fontes excelentes de documentação do Rust.\n" -"Consulte a página em [outros recursos](outros-recursos.md) para obter uma lista completa de recursos úteis\n" -"Recursos." +"Consulte a página em [outros recursos](outros-recursos.md) para obter uma lista completa de recursos úteis\n." #: src/credits.md:7 msgid "" "The material of Comprehensive Rust is licensed under the terms of the Apache 2.0\n" "license, please see [`LICENSE`](../LICENSE) for details." msgstr "" -"O material do Comprehensive Rust é licenciado sob os termos do Apache 2.0\n" -"licença, consulte [`LICENSE`](../LICENSE) para obter detalhes." +"O material do Comprehensive Rust é licenciado sob os termos da licença Apache 2.0\n" +", consulte [`LICENSE`](../LICENSE) para obter detalhes." #: src/credits.md:10 msgid "## Rust by Example" @@ -15422,8 +16050,8 @@ msgid "" msgstr "" "Alguns exemplos e exercícios foram copiados e adaptados de [Rust by\n" "Exemplo](https://doc.rust-lang.org/rust-by-example/). por favor veja o\n" -"diretório `third_party/rust-by-example/` para detalhes, incluindo a licença\n" -"termos." +"diretório `third_party/rust-by-example/` para detalhes, incluindo os termos de\n" +"licença." #: src/credits.md:17 msgid "## Rust on Exercism" @@ -15438,8 +16066,8 @@ msgid "" msgstr "" "Alguns exercícios foram copiados e adaptados de [Rust on\n" "Exercism](https://exercism.org/tracks/rust). por favor veja o\n" -"diretório `third_party/rust-on-exercism/` para obter detalhes, incluindo a licença\n" -"termos." +"diretório `third_party/rust-on-exercism/` para obter detalhes, incluindo os termos\n" +"licença." #: src/credits.md:24 msgid "## CXX" @@ -15451,7 +16079,7 @@ msgid "" "image from [CXX](https://cxx.rs/). Please see the `third_party/cxx/` directory\n" "for details, including the license terms." msgstr "" -"A seção [Interoperability with C++](android/interoperability/cpp.md) usa um\n" +"A seção [Interoperability with C++](android/interoperability/cpp.md) usa uma\n" "imagem de [CXX](https://cxx.rs/). Consulte o diretório `third_party/cxx/`\n" "para obter detalhes, incluindo os termos da licença." @@ -15479,8 +16107,8 @@ msgid "" "> comments you see in the solutions. They are there to make it possible to\n" "> re-use parts of the solutions as the exercises." msgstr "" -"> **Nota:** Ignore `// ANCHOR: label` e `// ANCHOR_END: label`\n" -"> comentários que você vê nas soluções. Eles estão lá para tornar possível\n" +"> **Nota:** Ignore os comentários `// ANCHOR: label` e `// ANCHOR_END: label`\n" +"> que você vê nas soluções. Eles estão lá para tornar possível\n" "> reutilizar partes das soluções como exercícios." #: src/exercises/day-1/solutions-morning.md:1 @@ -15489,7 +16117,7 @@ msgstr "# Dia 1 Exercícios matinais" #: src/exercises/day-1/solutions-morning.md:3 msgid "## Arrays and `for` Loops" -msgstr "## Arrays e loops `for`" +msgstr "## Vetores e laços `for`" #: src/exercises/day-1/solutions-morning.md:5 msgid "([back to exercise](for-loops.md))" @@ -15545,15 +16173,15 @@ msgid "" "}" msgstr "" "// ANCHOR: transpose\n" -"fn transpose(matrix: [[i32; 3]; 3]) -> [[i32; 3]; 3] {\n" +"fn transposta(matriz: [[i32; 3]; 3]) -> [[i32; 3]; 3] {\n" " // ANCHOR_END: transpose\n" -" let mut result = [[0; 3]; 3];\n" +" let mut resultado = [[0; 3]; 3];\n" " for i in 0..3 {\n" " for j in 0..3 {\n" -" result[j][i] = matrix[i][j];\n" +" resultado[j][i] = matriz[i][j];\n" " }\n" " }\n" -" return result;\n" +" return resultado;\n" "}" #: src/exercises/day-1/solutions-morning.md:34 @@ -15567,10 +16195,10 @@ msgid "" "}" msgstr "" "// ANCHOR: pretty_print\n" -"fn pretty_print(matrix: &[[i32; 3]; 3]) {\n" +"fn impressao_formatada(matriz: &[[i32; 3]; 3]) {\n" " // ANCHOR_END: pretty_print\n" -" for row in matrix {\n" -" println!(\"{row:?}\");\n" +" for linha in matriz {\n" +" println!(\"{linha:?}\");\n" " }\n" "}" @@ -15598,15 +16226,15 @@ msgid "" msgstr "" "// ANCHOR: tests\n" "#[test]\n" -"fn test_transpose() {\n" -" let matrix = [\n" +"fn test_transposta() {\n" +" let matriz = [\n" " [101, 102, 103], //\n" " [201, 202, 203],\n" " [301, 302, 303],\n" " ];\n" -" let transposed = transpose(matrix);\n" +" let matriz_transposta = transposta(matriz);\n" " assert_eq!(\n" -" transposed,\n" +" matriz_transposta,\n" " [\n" " [101, 201, 301], //\n" " [102, 202, 302],\n" @@ -15617,7 +16245,6 @@ msgstr "" "// ANCHOR_END: tests" #: src/exercises/day-1/solutions-morning.md:62 -#, fuzzy msgid "" "// ANCHOR: main\n" "fn main() {\n" @@ -15629,29 +16256,27 @@ msgid "" msgstr "" "// ANCHOR: main\n" "fn main() {\n" -" let array = [\n" +" let matriz = [\n" " [101, 102, 103], // <-- o comentário faz com que o rustfmt adicione uma nova linha\n" " [201, 202, 203],\n" " [301, 302, 303],\n" " ];" #: src/exercises/day-1/solutions-morning.md:73 -#, fuzzy msgid "" " let transposed = transpose(matrix);\n" " println!(\"transposed:\");\n" " pretty_print(&transposed);\n" "}\n" "```\n" +"### Bonus question" msgstr "" -" let transposed = transpose(array);\n" -" println!(\"transposto:\");\n" -" pretty_print(&transposed);\n" +" let matriz_transposta = transposta(matriz);\n" +" println!(\"Transposta:\");\n" +" impressao_formatada(&matriz_transposta);\n" "}\n" "```\n" - -msgid "### Bonus question" -msgstr "### Pergunta bônus" +"### Pergunta bônus" #: src/exercises/day-1/solutions-morning.md:80 msgid "" @@ -15659,8 +16284,8 @@ msgid "" "transpose and thus make our function handle any size of matrix. However, this quickly breaks down: the return type cannot " "be `&[&[i32]]` since it needs to own the data you return." msgstr "" -"Sinceramente não funciona tão bem. Pode parecer que poderíamos usar uma slice de slices (`&[&[i32]]`) como o tipo de " -"entrada para transpose e, assim, fazer nossa função lidar com qualquer tamanho de array. No entanto, isso falha " +"Isso necessita a utilização de conceitos mais avançados. Pode parecer que poderíamos usar uma slice de slices (`&[&[i32]]`) como o tipo de " +"entrada para `transposta` e, assim, fazer nossa função lidar com qualquer tamanho de matriz. No entanto, isso falha " "rapidamente: o tipo de retorno não pode ser `&[&[i32]]`, pois ele precisa possuir os dados que você retorna." #: src/exercises/day-1/solutions-morning.md:82 @@ -15669,13 +16294,15 @@ msgid "" "from `Vec>` to `&[&[i32]]` so now you cannot easily use `pretty_print` either." msgstr "" "Você pode tentar usar algo como `Vec>`, mas isso também não funciona muito bem: é difícil converter de " -"`Vec>` para `&[&[i32]] ` então agora você também não pode usar `pretty_print` facilmente." +"`Vec>` para `&[&[i32]] ` então agora você também não pode usar `impressao_formatada` facilmente." #: src/exercises/day-1/solutions-morning.md:84 msgid "" "Once we get to traits and generics, we'll be able to use the [`std::convert::AsRef`][1] trait to abstract over anything " "that can be referenced as a slice." msgstr "" +"Assim que chegarmos aos _traits_ and _generics_, podemos usar o _trait_ [`std::convert::AsRef`][1] para abstrair qualquer coisa\n" +"que pode ser referenciada como um _slice_." #: src/exercises/day-1/solutions-morning.md:86 msgid "" @@ -15702,16 +16329,16 @@ msgid "" " }\n" "}" msgstr "" -"fn pretty_print(matrix: Matrix)\n" +"fn impressao_formatada(matriz: Matriz)\n" "where\n" " T: Debug,\n" -" // A line references a slice of items\n" -" Line: AsRef<[T]>,\n" -" // A matrix references a slice of lines\n" -" Matrix: AsRef<[Line]>\n" +" // Linha referencia uma slice de itens\n" +" Linha: AsRef<[T]>,\n" +" // Matriz referencia uma slice de linhas\n" +" Matriz: AsRef<[Linha]>\n" "{\n" -" for row in matrix.as_ref() {\n" -" println!(\"{:?}\", row.as_ref());\n" +" for linha in matriz.as_ref() {\n" +" println!(\"{:?}\", linha.as_ref());\n" " }\n" "}" @@ -15729,11 +16356,11 @@ msgid "" msgstr "" "fn main() {\n" " // &[&[i32]]\n" -" pretty_print(&[&[1, 2, 3], &[4, 5, 6], &[7, 8, 9]]);\n" +" impressao_formatada(&[&[1, 2, 3], &[4, 5, 6], &[7, 8, 9]]);\n" " // [[&str; 2]; 2]\n" -" pretty_print([[\"a\", \"b\"], [\"c\", \"d\"]]);\n" +" impressao_formatada([[\"a\", \"b\"], [\"c\", \"d\"]]);\n" " // Vec>\n" -" pretty_print(vec![vec![1, 2], vec![3, 4]]);\n" +" impressao_formatada(vec![vec![1, 2], vec![3, 4]]);\n" "}\n" "```" @@ -15743,7 +16370,7 @@ msgid "" "an invalid matrix." msgstr "" "Além disso, o próprio tipo não imporia que as slices filhas tenham o mesmo comprimento, portanto, tal variável poderia " -"conter uma array inválida." +"conter uma matriz inválida." #: src/exercises/day-1/solutions-morning.md:115 msgid "[1]: https://doc.rust-lang.org/std/convert/trait.AsRef.html" @@ -15769,8 +16396,8 @@ msgid "" "}" msgstr "" "// ANCHOR: configuração\n" -"struct Library {\n" -" books: Vec,\n" +"struct Biblioteca {\n" +" livros: Vec,\n" "}" #: src/exercises/day-1/solutions-afternoon.md:42 @@ -15784,12 +16411,12 @@ msgid "" "// ANCHOR_END: setup" msgstr "" "// Isso torna possível imprimir valores de livros com {}.\n" -"impl std::fmt::Display for Book {\n" +"impl std::fmt::Display for Livro {\n" " fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n" -" write!(f, \"{} ({})\", self.title, self.year)\n" +" write!(f, \"{} ({})\", self.titulo, self.ano)\n" " }\n" "}\n" -"// ANCHOR_END: setup" +"// ANCHOR_END: Configuração" #: src/exercises/day-1/solutions-afternoon.md:50 msgid "" @@ -15800,15 +16427,14 @@ msgid "" " Library { books: Vec::new() }\n" " }" msgstr "" -"// ANCHOR: Library_new\n" -"impl Library {\n" -" fn new() -> Library {\n" +"impl Biblioteca {\n" +" // ANCHOR: Library_new\n" +" fn new() -> Biblioteca {\n" " // ANCHOR_END: Library_new\n" -" Library { books: Vec::new() }\n" +" Biblioteca { livros: Vec::new() }\n" " }" #: src/exercises/day-1/solutions-afternoon.md:57 -#, fuzzy msgid "" " // ANCHOR: Library_len\n" " //fn len(self) -> usize {\n" @@ -15821,15 +16447,14 @@ msgid "" msgstr "" " // ANCHOR: Library_len\n" " //fn len(self) -> usize {\n" -" // não implementado!()\n" +" // unimplemented!()\n" " ///}\n" " // ANCHOR_END: Library_len\n" -" fn len(&self) -> usize {\n" -" self.books.len()\n" +" fn tamanho(&self) -> usize {\n" +" self.livros.len()\n" " }" #: src/exercises/day-1/solutions-afternoon.md:66 -#, fuzzy msgid "" " // ANCHOR: Library_is_empty\n" " //fn is_empty(self) -> bool {\n" @@ -15842,15 +16467,14 @@ msgid "" msgstr "" " // ANCHOR: Library_is_empty\n" " //fn is_empty(self) -> bool {\n" -" // não implementado!()\n" -" ///}\n" +" // unimplemented!()\n" +" //}\n" " // ANCHOR_END: Library_is_empty\n" -" fn is_empty(&self) -> bool {\n" -" self.books.is_empty()\n" +" fn esta_vazia(&self) -> bool {\n" +" self.livros.is_empty()\n" " }" #: src/exercises/day-1/solutions-afternoon.md:75 -#, fuzzy msgid "" " // ANCHOR: Library_add_book\n" " //fn add_book(self, book: Book) {\n" @@ -15863,15 +16487,14 @@ msgid "" msgstr "" " // ANCHOR: Library_add_book\n" " //fn add_book(self, book: Book) {\n" -" // não implementado!()\n" +" // unimplemented!()\n" " ///}\n" " // ANCHOR_END: Library_add_book\n" -" fn add_book(&mut self, book: Book) {\n" -" self.books.push(book)\n" +" fn adiciona_livro(&mut self, livro: Livro) {\n" +" self.livros.push(livro)\n" " }" #: src/exercises/day-1/solutions-afternoon.md:84 -#, fuzzy msgid "" " // ANCHOR: Library_print_books\n" " //fn print_books(self) {\n" @@ -15886,17 +16509,16 @@ msgid "" msgstr "" " // ANCHOR: Library_print_books\n" " //fn print_books(self) {\n" -" // não implementado!()\n" +" // unimplemented!()\n" " ///}\n" " // ANCHOR_END: Library_print_books\n" -" fn print_books(&self) {\n" -" for book in &self.books {\n" -" println!(\"{}\", book);\n" +" fn imprime_livros(&self) {\n" +" for livro in &self.livros {\n" +" println!(\"{}\", livro);\n" " }\n" " }" #: src/exercises/day-1/solutions-afternoon.md:95 -#, fuzzy msgid "" " // ANCHOR: Library_oldest_book\n" " //fn oldest_book(self) -> Option<&Book> {\n" @@ -15913,8 +16535,8 @@ msgstr "" " // não implementado!()\n" " ///}\n" " // ANCHOR_END: Library_oldest_book\n" -" fn oldest_book(&self) -> Option<&Book> {\n" -" self.books.iter().min_by_key(|book| book.year)\n" +" fn livro_mais_antigo(&self) -> Option<&Livro> {\n" +" self.livros.iter().min_by_key(|livro| livro.ano)\n" " }\n" "}" @@ -15934,10 +16556,9 @@ msgstr "" "// assinaturas de método, incluindo o parâmetro \"self\"! Você pode\n" "// também precisa atualizar as ligações de variáveis dentro de main.\n" "fn main() {\n" -" let library = Library::new();" +" let mut biblioteca = Biblioteca::new();" #: src/exercises/day-1/solutions-afternoon.md:113 -#, fuzzy msgid "" " //println!(\"Our library is empty: {}\", library.is_empty());\n" " //\n" @@ -15955,19 +16576,19 @@ msgid "" "}\n" "// ANCHOR_END: main" msgstr "" -" //println!(\"Nossa biblioteca está vazia: {}\", library.is_empty());\n" +" //println!(\"Nossa biblioteca está vazia: {}\", biblioteca.esta_vazia());\n" " //\n" -" //library.add_book(Book::new(\"O Senhor dos Anéis\", 1954));\n" -" //library.add_book(Book::new(\"As Aventuras de Alice no País das Maravilhas\", 1865));\n" +" //biblioteca.adiciona_livro(Livro::new(\"O Senhor dos Anéis\", 1954));\n" +" //biblioteca.adiciona_livro(Livro::new(\"As Aventuras de Alice no País das Maravilhas\", 1865));\n" " //\n" -" //library.print_books();\n" +" //biblioteca.imprime_livros();\n" " //\n" -" //corresponde à library.oldest_book() {\n" -" // Some(book) => println!(\"Meu livro mais antigo é {book}\"),\n" +" //match biblioteca.livro_mais_antigo() {\n" +" // Some(livro) => println!(\"Meu livro mais antigo é {livro}\"),\n" " // None => println!(\"Minha biblioteca está vazia!\"),\n" -" ///}\n" +" //}\n" " //\n" -" //println!(\"Nossa biblioteca tem {} livros\", library.len());\n" +" //println!(\"Nossa biblioteca tem {} livros\", biblioteca.tamanho());\n" "}\n" "// ANCHOR_END: main" @@ -15980,10 +16601,10 @@ msgid "" " assert!(library.is_empty());" msgstr "" "#[test]\n" -"fn test_library_len() {\n" -" let mut library = Library::new();\n" -" assert_eq!(library.len(), 0);\n" -" assert!(library.is_empty());" +"fn test_tamanho_biblioteca() {\n" +" let mut biblioteca = Biblioteca::new();\n" +" assert_eq!(biblioteca.tamanho(), 0);\n" +" assert!(biblioteca.esta_vazia());" #: src/exercises/day-1/solutions-afternoon.md:135 msgid "" @@ -15993,10 +16614,10 @@ msgid "" " assert!(!library.is_empty());\n" "}" msgstr "" -" library.add_book(Book::new(\"O Senhor dos Anéis\", 1954));\n" -" library.add_book(Book::new(\"As Aventuras de Alice no País das Maravilhas\", 1865));\n" -" assert_eq!(library.len(), 2);\n" -" assert!(!library.is_empty());\n" +" biblioteca.adiciona_livro(Livro::new(\"O Senhor dos Anéis\", 1954));\n" +" biblioteca.adiciona_livro(Livro::new(\"As Aventuras de Alice no País das Maravilhas\", 1865));\n" +" assert_eq!(biblioteca.tamanho(), 2);\n" +" assert!(!biblioteca.esta_vazia());\n" "}" #: src/exercises/day-1/solutions-afternoon.md:141 @@ -16007,9 +16628,9 @@ msgid "" " assert!(library.is_empty());" msgstr "" "#[test]\n" -"fn test_library_is_empty() {\n" -" let mut library = Library::new();\n" -" assert!(library.is_empty());" +"fn test_biblioteca_esta_vazia() {\n" +" let mut biblioteca = Biblioteca::new();\n" +" assert!(biblioteca.esta_vazia());" #: src/exercises/day-1/solutions-afternoon.md:146 msgid "" @@ -16017,8 +16638,8 @@ msgid "" " assert!(!library.is_empty());\n" "}" msgstr "" -" library.add_book(Book::new(\"O Senhor dos Anéis\", 1954));\n" -" assert!(!library.is_empty());\n" +" biblioteca.adiciona_livro(Livro::new(\"O Senhor dos Anéis\", 1954));\n" +" assert!(!biblioteca.esta_vazia());\n" "}" #: src/exercises/day-1/solutions-afternoon.md:150 @@ -16034,13 +16655,13 @@ msgid "" "}" msgstr "" "#[test]\n" -"fn test_library_print_books() {\n" -" let mut library = Library::new();\n" -" library.add_book(Book::new(\"O Senhor dos Anéis\", 1954));\n" -" library.add_book(Book::new(\"As Aventuras de Alice no País das Maravilhas\", 1865));\n" +"fn test_biblioteca_imprime_livros() {\n" +" let mut biblioteca = Biblioteca::new();\n" +" biblioteca.adiciona_livro(Livro::new(\"O Senhor dos Anéis\", 1954));\n" +" biblioteca.adiciona_livro(Livro::new(\"As Aventuras de Alice no País das Maravilhas\", 1865));\n" " // Poderíamos tentar capturar stdout, mas vamos apenas chamar o\n" " // método para começar.\n" -" library.print_books();\n" +" biblioteca.imprime_livros();\n" "}" #: src/exercises/day-1/solutions-afternoon.md:160 @@ -16051,9 +16672,9 @@ msgid "" " assert!(library.oldest_book().is_none());" msgstr "" "#[test]\n" -"fn test_library_oldest_book() {\n" -" let mut library = Library::new();\n" -" assert!(library.oldest_book().is_none());" +"fn test_biblioteca_livro_mais_antigo() {\n" +" let mut biblioteca = Biblioteca::new();\n" +" assert!(biblioteca.livro_mais_antigo().is_none());" #: src/exercises/day-1/solutions-afternoon.md:165 msgid "" @@ -16063,9 +16684,9 @@ msgid "" " Some(\"Lord of the Rings\")\n" " );" msgstr "" -" library.add_book(Book::new(\"O Senhor dos Anéis\", 1954));\n" +" biblioteca.adiciona_livro(Livro::new(\"O Senhor dos Anéis\", 1954));\n" " assert_eq!(\n" -" library.oldest_book().map(|b| b.title.as_str()),\n" +" biblioteca.livro_mais_antigo().map(|b| b.titulo.as_str()),\n" " Some(\"O Senhor dos Anéis\")\n" " );" @@ -16079,9 +16700,9 @@ msgid "" "}\n" "```" msgstr "" -" library.add_book(Book::new(\"As Aventuras de Alice no País das Maravilhas\", 1865));\n" +" biblioteca.adiciona_livro(Livro::new(\"As Aventuras de Alice no País das Maravilhas\", 1865));\n" " assert_eq!(\n" -" library.oldest_book().map(|b| b.title.as_str()),\n" +" biblioteca.livro_mais_antigo().map(|b| b.titulo.as_str()),\n" " Some(\"As Aventuras de Alice no País das Maravilhas\")\n" " );\n" "}\n" @@ -16093,7 +16714,7 @@ msgstr "# Dia 2 Exercícios matinais" #: src/exercises/day-2/solutions-morning.md:3 msgid "## Points and Polygons" -msgstr "## Points e Polígonos" +msgstr "## Pontos e Polígonos" #: src/exercises/day-2/solutions-morning.md:5 msgid "([back to exercise](points-polygons.md))" @@ -16111,7 +16732,7 @@ msgid "" msgstr "" "#[derive(Debug, Copy, Clone, PartialEq, Eq)]\n" "// ANCHOR: Point\n" -"pub struct Point {\n" +"pub struct Ponto {\n" " // ANCHOR_END: Point\n" " x: i32,\n" " y: i32,\n" @@ -16127,10 +16748,10 @@ msgid "" " }" msgstr "" "// ANCHOR: Point-impl\n" -"impl Point {\n" +"impl Ponto {\n" " // ANCHOR_END: Point-impl\n" -" pub fn new(x: i32, y: i32) -> Point {\n" -" Point { x, y }\n" +" pub fn new(x: i32, y: i32) -> Ponto {\n" +" Ponto { x, y }\n" " }" #: src/exercises/day-2/solutions-morning.md:37 @@ -16150,8 +16771,8 @@ msgid "" " }\n" "}" msgstr "" -" pub fn dist(self, other: Point) -> f64 {\n" -" (self - other).magnitude()\n" +" pub fn dist(self, outro: Ponto) -> f64 {\n" +" (self - outro).magnitude()\n" " }\n" "}" @@ -16165,10 +16786,10 @@ msgid "" " }\n" "}" msgstr "" -" fn add(self, other: Self) -> Self::Output {\n" +" fn add(self, outro: Self) -> Self::Output {\n" " Self {\n" -" x: self.x + other.x,\n" -" y: self.y + other.y,\n" +" x: self.x + outro.x,\n" +" y: self.y + outro.y,\n" " }\n" " }\n" "}" @@ -16178,7 +16799,7 @@ msgid "" "impl std::ops::Sub for Point {\n" " type Output = Self;" msgstr "" -"impl std::ops::Sub for Point {\n" +"impl std::ops::Sub for Ponto {\n" " type Output = Self;" #: src/exercises/day-2/solutions-morning.md:60 @@ -16191,10 +16812,10 @@ msgid "" " }\n" "}" msgstr "" -" fn sub(self, other: Self) -> Self::Output {\n" +" fn sub(self, outro: Self) -> Self::Output {\n" " Self {\n" -" x: self.x - other.x,\n" -" y: self.y - other.y,\n" +" x: self.x - outro.x,\n" +" y: self.y - outro.y,\n" " }\n" " }\n" "}" @@ -16208,9 +16829,9 @@ msgid "" "}" msgstr "" "// ANCHOR: Polygon\n" -"pub struct Polygon {\n" +"pub struct Poligono {\n" " // ANCHOR_END: Polygon\n" -" points: Vec,\n" +" pontos: Vec,\n" "}" #: src/exercises/day-2/solutions-morning.md:74 @@ -16223,10 +16844,9 @@ msgid "" " }" msgstr "" "// ANCHOR: Polygon-impl\n" -"impl Polygon {\n" -" // ANCHOR_END: Polygon-impl\n" -" pub fn new() -> Polygon {\n" -" Polygon { points: Vec::new() }\n" +"impl Poligono {\n" +" pub fn new() -> Poligono {\n" +" Poligono { pontos: Vec::new() }\n" " }" #: src/exercises/day-2/solutions-morning.md:81 @@ -16235,8 +16855,8 @@ msgid "" " self.points.push(point);\n" " }" msgstr "" -" pub fn add_point(&mut self, point: Point) {\n" -" self.points.push(point);\n" +" pub fn adiciona_ponto(&mut self, ponto: Ponto) {\n" +" self.pontos.push(ponto);\n" " }" #: src/exercises/day-2/solutions-morning.md:85 @@ -16245,8 +16865,8 @@ msgid "" " self.points.iter().min_by_key(|p| p.x).copied()\n" " }" msgstr "" -" pub fn left_most_point(&self) -> Option {\n" -" self.points.iter().min_by_key(|p| p.x).copied()\n" +" pub fn ponto_mais_a_esquerda(&self) -> Option {\n" +" self.pontos.iter().min_by_key(|p| p.x).copied()\n" " }" #: src/exercises/day-2/solutions-morning.md:89 @@ -16255,8 +16875,8 @@ msgid "" " self.points.iter()\n" " }" msgstr "" -" pub fn iter(&self) -> impl Iterator {\n" -" self.points.iter()\n" +" pub fn iter(&self) -> impl Iterator {\n" +" self.pontos.iter()\n" " }" #: src/exercises/day-2/solutions-morning.md:93 @@ -16266,8 +16886,8 @@ msgid "" " return 0.0;\n" " }" msgstr "" -" pub fn length(&self) -> f64 {\n" -" if self.points.is_empty() {\n" +" pub fn comprimento(&self) -> f64 {\n" +" if self.pontos.is_empty() {\n" " return 0.0;\n" " }" @@ -16284,14 +16904,14 @@ msgid "" " }\n" "}" msgstr "" -" let mut result = 0.0;\n" -" let mut last_point = self.points[0];\n" -" for point in &self.points[1..] {\n" -" result += last_point.dist(*point);\n" -" last_point = *point;\n" +" let mut resultado = 0.0;\n" +" let mut ultimo_ponto = self.pontos[0];\n" +" for ponto in &self.pontos[1..] {\n" +" resultado += ultimo_ponto.dist(*ponto);\n" +" ultimo_ponto = *ponto;\n" " }\n" -" result += last_point.dist(self.points[0]);\n" -" result\n" +" resultado += ultimo_ponto.dist(self.pontos[0]);\n" +" resultado\n" " }\n" "}" @@ -16305,14 +16925,13 @@ msgid "" "}" msgstr "" "// ANCHOR: Circle\n" -"pub struct Circle {\n" +"pub struct Circulo {\n" " // ANCHOR_END: Circle\n" -" center: Point,\n" -" radius: i32,\n" +" centro: Ponto,\n" +" raio: i32,\n" "}" #: src/exercises/day-2/solutions-morning.md:116 -#, fuzzy msgid "" "// ANCHOR: Circle-impl\n" "impl Circle {\n" @@ -16322,25 +16941,22 @@ msgid "" " }" msgstr "" "// ANCHOR: Circle-impl\n" -"impl Círculo {\n" -" // ANCHOR_END: Implantação do círculo\n" -" pub fn new(center: Point, radius: i32) -> Circle {\n" -" Círculo { centro, raio }\n" +"impl Circulo {\n" +" pub fn new(centro: Ponto, raio: i32) -> Circulo {\n" +" Circulo { centro, raio }\n" " }" #: src/exercises/day-2/solutions-morning.md:123 -#, fuzzy msgid "" " pub fn circumference(&self) -> f64 {\n" " 2.0 * std::f64::consts::PI * f64::from(self.radius)\n" " }" msgstr "" -" pub fn circunferência(&self) -> f64 {\n" -" 2.0 * std::f64::consts::PI * f64::from(self.radius)\n" +" pub fn circunferencia(&self) -> f64 {\n" +" 2.0 * std::f64::consts::PI * f64::from(self.raio)\n" " }" #: src/exercises/day-2/solutions-morning.md:127 -#, fuzzy msgid "" " pub fn dist(&self, other: &Self) -> f64 {\n" " self.center.dist(other.center)\n" @@ -16348,7 +16964,7 @@ msgid "" "}" msgstr "" " pub fn dist(&self, outro: &Self) -> f64 {\n" -" self.center.dist(outro.centro)\n" +" self.centro.dist(outro.centro)\n" " }\n" "}" @@ -16362,9 +16978,9 @@ msgid "" "// ANCHOR_END: Shape" msgstr "" "// ANCHOR: Shape\n" -"pub enum Shape {\n" -" Polygon(Polygon),\n" -" Circle(Circle),\n" +"pub enum Forma {\n" +" Poligono(Poligono),\n" +" Circulo(Circulo),\n" "}\n" "// ANCHOR_END: Shape" @@ -16376,9 +16992,9 @@ msgid "" " }\n" "}" msgstr "" -"impl From for Shape {\n" -" fn from(poly: Polygon) -> Self {\n" -" Shape:: Polygon (poly)\n" +"impl From for Forma {\n" +" fn from(poli: Poligono) -> Self {\n" +" Forma::Poligono(poli)\n" " }\n" "}" @@ -16390,9 +17006,9 @@ msgid "" " }\n" "}" msgstr "" -"impl From for Shape {\n" -" fn from(circle: Circle) -> Self {\n" -" Shape::Circle(circle)\n" +"impl From for Forma {\n" +" fn from(circulo: Circulo) -> Self {\n" +" Forma::Circulo(circulo)\n" " }\n" "}" @@ -16407,11 +17023,11 @@ msgid "" " }\n" "}" msgstr "" -"impl Shape {\n" -" pub fn perimeter(&self) -> f64 {\n" +"impl Forma {\n" +" pub fn perimetro(&self) -> f64 {\n" " match self {\n" -" Shape::Polygon(poly) => poly.length(),\n" -" Shape::Circle(circle) => circle.circumference(),\n" +" Forma::Poligono(poli) => poli.comprimento(),\n" +" Forma::Circulo(circulo) => circulo.circunferencia(),\n" " }\n" " }\n" "}" @@ -16451,21 +17067,21 @@ msgid "" "// ANCHOR_END: unit-tests" msgstr "" " #[test]\n" -" fn test_shape_perimeters() {\n" -" let mut poly = Polygon::new();\n" -" poly.add_point(Point::new(12, 13));\n" -" poly.add_point(Point::new(17, 11));\n" -" poly.add_point(Point::new(16, 16));\n" -" let shapes = vec![\n" -" Shape::from(poly),\n" -" Shape::from(Circle::new(Point::new(10, 20), 5)),\n" +" fn test_forma_perimetros() {\n" +" let mut poli = Poligono::new();\n" +" poli.adiciona_ponto(Ponto::new(12, 13));\n" +" poli.adiciona_ponto(Ponto::new(17, 11));\n" +" poli.adiciona_ponto(Ponto::new(16, 16));\n" +" let formas = vec![\n" +" Forma::from(poli),\n" +" Forma::from(Circulo::new(Ponto::new(10, 20), 5)),\n" " ];\n" -" let perimeters = shapes\n" +" let perimetros = formas\n" " .iter()\n" -" .map(Shape::perimeter)\n" -" .map(round_two_digits)\n" +" .map(Forma::perimetro)\n" +" .map(arredonda_dois_digitos)\n" " .collect::>();\n" -" assert_eq!(perimeters, vec![15.48, 31.42]);\n" +" assert_eq!(perimetros, vec![15.48, 31.42]);\n" " }\n" "}\n" "// ANCHOR_END: unit-tests" @@ -16514,20 +17130,20 @@ msgid "" " }" msgstr "" "// ANCHOR: luhn\n" -"pub fn luhn(cc_number: &str) -> bool {\n" +"pub fn luhn(numero_cc: &str) -> bool {\n" " // ANCHOR_END: luhn\n" -" let mut digits_seen = 0;\n" -" let mut sum = 0;\n" -" for (i, ch) in cc_number.chars().rev().filter(|&ch| ch != ' ').enumerate() {\n" +" let mut digitos_vistos = 0;\n" +" let mut soma = 0;\n" +" for (i, ch) in numero_cc.chars().rev().filter(|&ch| ch != ' ').enumerate() {\n" " match ch.to_digit(10) {\n" " Some(d) => {\n" -" sum += if i % 2 == 1 {\n" +" soma += if i % 2 == 1 {\n" " let dd = d * 2;\n" " dd / 10 + dd % 10\n" " } else {\n" " d\n" " };\n" -" digits_seen += 1;\n" +" digitos_vistos += 1;\n" " }\n" " None => return false,\n" " }\n" @@ -16539,7 +17155,7 @@ msgid "" " return false;\n" " }" msgstr "" -" if digits_seen < 2 {\n" +" if digitos_vistos < 2 {\n" " return false;\n" " }" @@ -16548,7 +17164,7 @@ msgid "" " sum % 10 == 0\n" "}" msgstr "" -" sum % 10 == 0\n" +" soma % 10 == 0\n" "}" #: src/exercises/day-2/solutions-afternoon.md:49 @@ -16563,11 +17179,11 @@ msgid "" "}" msgstr "" "fn main() {\n" -" let cc_number = \"1234 5678 1234 5670\";\n" +" let numero_cc = \"1234 5678 1234 5670\";\n" " println!(\n" -" \"Is {} a valid credit card number? {}\",\n" -" cc_number,\n" -" if luhn(cc_number) { \"yes\" } else { \"no\" }\n" +" \"{} é um número de cartão de crédito válido? {}\",\n" +" numero_cc,\n" +" if luhn(numero_cc) { \"Sim\" } else { \"Não\" }\n" " );\n" "}" @@ -16581,7 +17197,7 @@ msgid "" msgstr "" "// ANCHOR: unit-tests\n" "#[test]\n" -"fn test_non_digit_cc_number() {\n" +"fn test_numero_cc_nao_numerico() {\n" " assert!(!luhn(\"foo\"));\n" "}" @@ -16597,7 +17213,7 @@ msgid "" "```" msgstr "" "#[test]\n" -"fn test_invalid_cc_number() {\n" +"fn test_numero_cc_invalido() {\n" " assert!(!luhn(\"4223 9826 4026 9299\"));\n" " assert!(!luhn(\"4539 3195 0343 6476\"));\n" " assert!(!luhn(\"8273 1232 7352 0569\"));\n" @@ -16625,10 +17241,10 @@ msgid "" " .chain(std::iter::once(None));" msgstr "" "// ANCHOR: prefix_matches\n" -"pub fn prefix_matches(prefix: &str, request_path: &str) -> bool {\n" -" // ANCHOR_END: prefix_matches\n" -" let prefixes = prefix.split('/');\n" -" let request_paths = request_path\n" +"pub fn correspondencia_prefixo(prefixo: &str, caminho_requisitado: &str) -> bool {\n" +"// ANCHOR_END: prefix_matches\n" +" let prefixos = prefixo.split('/');\n" +" let caminhos_requisitados = caminho_requisitado\n" " .split('/')\n" " .map(|p| Some(p))\n" " .chain(std::iter::once(None));" @@ -16648,10 +17264,10 @@ msgid "" " true\n" "}" msgstr "" -" for (prefix, request_path) in prefixes.zip(request_paths) {\n" -" match request_path {\n" -" Some(request_path) => {\n" -" if (prefix != \"*\") && (prefix != request_path) {\n" +" for (prefixo, caminho_requisitado) in prefixos.zip(caminhos_requisitados) {\n" +" match caminho_requisitado {\n" +" Some(caminho_requisitado) => {\n" +" if (prefixo != \"*\") && (prefixo != caminho_requisitado) {\n" " return false;\n" " }\n" " }\n" @@ -16673,9 +17289,9 @@ msgstr "" "// ANCHOR: unit-tests\n" "#[test]\n" "fn test_matches_without_wildcard() {\n" -" assert!(prefix_matches(\"/v1/publishers\", \"/v1/publishers\"));\n" -" assert!(prefix_matches(\"/v1/publishers\", \"/v1/publishers/abc-123\"));\n" -" assert!(prefix_matches(\"/v1/publishers\", \"/v1/publishers/abc/books\"));" +" assert!(correspondencia_prefixo(\"/v1/publishers\", \"/v1/publishers\"));\n" +" assert!(correspondencia_prefixo(\"/v1/publishers\", \"/v1/publishers/abc-123\"));\n" +" assert!(correspondencia_prefixo(\"/v1/publishers\", \"/v1/publishers/abc/books\"));" #: src/exercises/day-2/solutions-afternoon.md:166 msgid "" @@ -16687,8 +17303,8 @@ msgid "" "}\n" "// ANCHOR_END: unit-tests" msgstr "" -" assert!(!prefix_matches(\"/v1/publishers/*/books\", \"/v1/publishers\"));\n" -" assert!(!prefix_matches(\n" +" assert!(!correspondencia_prefixo(\"/v1/publishers/*/books\", \"/v1/publishers\"));\n" +" assert!(!correspondencia_prefixo(\n" " \"/v1/publishers/*/books\",\n" " \"/v1/publishers/foo/booksByAuthor\"\n" " ));\n" @@ -16886,7 +17502,6 @@ msgstr "" "}" #: src/exercises/day-3/solutions-morning.md:157 -#, fuzzy msgid "" "// ANCHOR: main\n" "fn main() {\n" @@ -16905,7 +17520,7 @@ msgstr "" "fn main() {\n" " let mut window = Window::new(\"Rust GUI Demo 1.23\");\n" " window.add_widget(Box::new(Label::new(\"Esta é uma pequena demonstração de GUI de texto.\")));\n" -" window.add_widget(Caixa::new(Botão::new(\n" +" window.add_widget(Box::new(Button::new(\n" " \"Clique em mim!\",\n" " Box::new(|| println!(\"Você clicou no botão!\")),\n" " )));\n" @@ -16920,7 +17535,7 @@ msgstr "# Dia 3 Exercícios da Tarde" #: src/exercises/day-3/solutions-afternoon.md:3 msgid "## Safe FFI Wrapper" -msgstr "## Invólucro FFI Seguro" +msgstr "## Wrapper FFI Seguro" #: src/exercises/day-3/solutions-afternoon.md:5 msgid "([back to exercise](safe-ffi-wrapper.md))" @@ -16977,11 +17592,11 @@ msgstr "" " // Call opendir and return a Ok value if that worked,\n" " // otherwise return Err with a message.\n" " // ANCHOR_END: DirectoryIterator\n" -" let path = CString::new(path).map_err(|err| format!(\"Invalid path: {err}\"))?;\n" +" let path = CString::new(path).map_err(|err| format!(\"Caminho inválido: {err}\"))?;\n" " // SAFETY: path.as_ptr() cannot be NULL.\n" " let dir = unsafe { ffi::opendir(path.as_ptr()) };\n" " if dir.is_null() {\n" -" Err(format!(\"Could not open {:?}\", path))\n" +" Err(format!(\"Não foi possível abrir {:?}\", path))\n" " } else {\n" " Ok(DirectoryIterator { path, dir })\n" " }\n" @@ -17054,7 +17669,7 @@ msgstr "" " if !self.dir.is_null() {\n" " // SAFETY: self.dir is not NULL.\n" " if unsafe { ffi::closedir(self.dir) } != 0 {\n" -" panic!(\"Could not close {:?}\", self.path);\n" +" panic!(\"Não foi possível fechar {:?}\", self.path);\n" " }\n" " }\n" " }\n" @@ -17074,7 +17689,7 @@ msgstr "" "// ANCHOR: main\n" "fn main() -> Result<(), String> {\n" " let iter = DirectoryIterator::new(\".\")?;\n" -" println!(\"files: {:#?}\", iter.collect::>());\n" +" println!(\"Arquivos: {:#?}\", iter.collect::>());\n" " Ok(())\n" "}\n" "// ANCHOR_END: main\n" @@ -17086,7 +17701,7 @@ msgstr "# Dia 4 Exercício matinal" #: src/exercises/day-4/solutions-morning.md:3 msgid "## Dining Philosophers" -msgstr "## Jantar com Filósofos" +msgstr "## Filósofos jantando" #: src/exercises/day-4/solutions-morning.md:5 msgid "([back to exercise](dining-philosophers.md))" @@ -17116,12 +17731,12 @@ msgid "" " thoughts: mpsc::SyncSender,\n" "}" msgstr "" -"struct Philosopher {\n" -" name: String,\n" +"struct Filosofo {\n" +" nome: String,\n" " // ANCHOR_END: Philosopher\n" -" left_fork: Arc>,\n" -" right_fork: Arc>,\n" -" thoughts: mpsc::SyncSender,\n" +" garfo_esquerda: Arc>,\n" +" garfo_direita: Arc>,\n" +" pensamentos: mpsc::SyncSender,\n" "}" #: src/exercises/day-4/solutions-morning.md:38 @@ -17136,10 +17751,10 @@ msgid "" " // ANCHOR_END: Philosopher-think" msgstr "" "// ANCHOR: Philosopher-think\n" -"impl Philosopher {\n" -" fn think(&self) {\n" -" self.thoughts\n" -" .send(format!(\"Eureka! {} has a new idea!\", &self.name))\n" +"impl Filosofo {\n" +" fn pensar(&self) {\n" +" self.pensamentos\n" +" .send(format!(\"Eureka! {} teve uma nova ideia!\", &self.nome))\n" " .unwrap();\n" " }\n" " // ANCHOR_END: Philosopher-think" @@ -17154,11 +17769,11 @@ msgid "" " let right = self.right_fork.lock().unwrap();" msgstr "" " // ANCHOR: Philosopher-eat\n" -" fn eat(&self) {\n" +" fn comer(&self) {\n" " // ANCHOR_END: Philosopher-eat\n" -" println!(\"{} is trying to eat\", &self.name);\n" -" let left = self.left_fork.lock().unwrap();\n" -" let right = self.right_fork.lock().unwrap();" +" println!(\"{} está tentando comer\", &self.nome);\n" +" let _esquerda = self.garfo_esquerda.lock().unwrap();\n" +" let _direita = self.garfo_direita.lock().unwrap();" #: src/exercises/day-4/solutions-morning.md:54 msgid "" @@ -17169,7 +17784,7 @@ msgid "" "}" msgstr "" " // ANCHOR: Philosopher-eat-end\n" -" println!(\"{} is eating...\", &self.name);\n" +" println!(\"{} está comendo...\", &self.nome);\n" " thread::sleep(Duration::from_millis(10));\n" " }\n" "}" @@ -17190,8 +17805,8 @@ msgid "" " .map(|_| Arc::new(Mutex::new(Fork)))\n" " .collect::>();" msgstr "" -" let forks = (0..PHILOSOPHERS.len())\n" -" .map(|_| Arc::new(Mutex::new(Fork)))\n" +" let garfos = (0..FILOSOFOS.len())\n" +" .map(|_| Arc::new(Mutex::new(Garfo)))\n" " .collect::>();" #: src/exercises/day-4/solutions-morning.md:71 @@ -17201,10 +17816,10 @@ msgid "" " let mut left_fork = forks[i].clone();\n" " let mut right_fork = forks[(i + 1) % forks.len()].clone();" msgstr "" -" for i in 0..forks.len() {\n" +" for i in 0..garfos.len() {\n" " let tx = tx.clone();\n" -" let mut left_fork = forks[i].clone();\n" -" let mut right_fork = forks[(i + 1) % forks.len()].clone();" +" let mut garfo_esquerda = garfos[i].clone();\n" +" let mut garfo_direita = garfos[(i + 1) % garfos.len()].clone();" #: src/exercises/day-4/solutions-morning.md:76 msgid "" @@ -17218,8 +17833,8 @@ msgstr "" " // Para evitar um impasse, temos que quebrar a simetria\n" " // algum lugar. Isso irá trocar os garfos sem desinicializar\n" " // qualquer um deles.\n" -" if i == forks.len() - 1 {\n" -" std::mem::swap(&mut left_fork, &mut right_fork);\n" +" if i == garfos.len() - 1 {\n" +" std::mem::swap(&mut garfo_esquerda, &mut garfo_direita);\n" " }" #: src/exercises/day-4/solutions-morning.md:83 @@ -17231,11 +17846,11 @@ msgid "" " right_fork,\n" " };" msgstr "" -" let philosopher = Philosopher {\n" -" name: PHILOSOPHERS[i].to_string(),\n" -" thoughts: tx,\n" -" left_fork,\n" -" right_fork,\n" +" let filosofo = Filosofo {\n" +" nome: FILOSOFOS[i].to_string(),\n" +" pensamentos: tx,\n" +" garfo_esquerda,\n" +" garfo_direita,\n" " };" #: src/exercises/day-4/solutions-morning.md:90 @@ -17250,8 +17865,8 @@ msgid "" msgstr "" " thread::spawn(move || {\n" " for _ in 0..100 {\n" -" philosopher.eat();\n" -" philosopher.think();\n" +" filosofo.comer();\n" +" filosofo.pensar();\n" " }\n" " });\n" " }" @@ -17266,8 +17881,8 @@ msgid "" "```" msgstr "" " drop(tx);\n" -" for thought in rx {\n" -" println!(\"{thought}\");\n" +" for pensamento in rx {\n" +" println!(\"{pensamento}\");\n" " }\n" "}\n" "```" @@ -17278,3 +17893,4 @@ msgstr "" #~ msgstr "" #~ "* `Box` é como `std::unique_ptr` em C++.\n" #~ "* No exemplo acima, você pode até deixar de fora o `*` na declaração `println!` graças a `Deref`." +