diff --git a/po/es.po b/po/es.po index cc143dae5297..b676e4bd7f92 100644 --- a/po/es.po +++ b/po/es.po @@ -1,21 +1,25 @@ +# +# Phosphorus , 2024. +# Phosphorus-M , 2024. +# msgid "" msgstr "" "Project-Id-Version: Comprehensive Rust 🦀\n" -"POT-Creation-Date: 2024-07-19T19:45:30Z\n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" +"POT-Creation-Date: 2024-09-17T23:10:16-03:00\n" +"PO-Revision-Date: 2024-09-27 14:11-0300\n" +"Last-Translator: Phosphorus-M \n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Gtranslator 46.1\n" "X-Poedit-Bookmarks: -1,304,-1,-1,-1,-1,-1,-1,-1,-1\n" #: src/SUMMARY.md src/index.md msgid "Welcome to Comprehensive Rust 🦀" -msgstr "Te damos la bienvenida a Comprehensive Rust 🦀" +msgstr "Te damos la bienvenida a Comprehensive Rust 🦀\t" #: src/SUMMARY.md src/running-the-course.md msgid "Running the Course" @@ -210,9 +214,9 @@ msgstr "Enums compartidas" msgid "Exclusive References" msgstr "Referencias exclusivas" -#: src/SUMMARY.md -msgid "Slices: `&[T]`" -msgstr "Slices: `&[T]`" +#: src/SUMMARY.md src/references.md src/references/slices.md +msgid "Slices" +msgstr "Slices" #: src/SUMMARY.md src/references.md src/references/strings.md msgid "Strings" @@ -242,14 +246,14 @@ msgstr "Estructuras de tuplas" msgid "Enums" msgstr "Enumeraciones" -#: src/SUMMARY.md src/user-defined-types.md -msgid "Static" -msgstr "Estático" - #: src/SUMMARY.md msgid "Const" msgstr "Const (constantes)" +#: src/SUMMARY.md src/user-defined-types.md +msgid "Static" +msgstr "Estático" + #: src/SUMMARY.md src/user-defined-types.md src/user-defined-types/aliases.md msgid "Type Aliases" msgstr "Aliases de tipo" @@ -416,7 +420,7 @@ msgstr "`From` e `Into`" #: src/SUMMARY.md src/std-traits.md src/std-traits/casting.md msgid "Casting" -msgstr "Probando" +msgstr "Casting" #: src/SUMMARY.md src/std-traits/read-and-write.md msgid "`Read` and `Write`" @@ -453,7 +457,7 @@ msgstr "Métodos de Gestión de Memoria" #: src/SUMMARY.md src/memory-management.md src/memory-management/ownership.md msgid "Ownership" -msgstr "Ownership" +msgstr "Ownership (_Sistema de Propiedad_)" #: src/SUMMARY.md src/memory-management.md src/memory-management/move.md msgid "Move Semantics" @@ -465,7 +469,7 @@ msgstr "Trait `Clone`" #: src/SUMMARY.md src/memory-management.md src/memory-management/copy-types.md msgid "Copy Types" -msgstr "Tipos Copy" +msgstr "Tipos Copiables" #: src/SUMMARY.md msgid "`Drop`" @@ -491,7 +495,7 @@ msgstr "`Rc`" #: src/SUMMARY.md src/smart-pointers.md src/smart-pointers/trait-objects.md msgid "Owned Trait Objects" -msgstr "Objetos Trait Poseídos" +msgstr "Objetos de Trait Owned" #: src/SUMMARY.md src/smart-pointers.md src/smart-pointers/exercise.md msgid "Exercise: Binary Tree" @@ -508,7 +512,7 @@ msgstr "Préstamos (_Borrowing_)" #: src/SUMMARY.md src/borrowing.md src/borrowing/shared.md msgid "Borrowing a Value" -msgstr "Emprestar (_borrow_) un valor" +msgstr "Préstamo de un Valor" #: src/SUMMARY.md src/borrowing.md src/borrowing/borrowck.md msgid "Borrow Checking" @@ -526,22 +530,25 @@ msgstr "Mutabilidad Interior" msgid "Exercise: Health Statistics" msgstr "Ejercicio: Estadísticas de Salud" +# En español también decimos lifetimes, duración de vida es raro o tiempo de vida. #: src/SUMMARY.md src/running-the-course/course-structure.md #: src/welcome-day-3-afternoon.md src/lifetimes.md msgid "Lifetimes" -msgstr "Duraciones de vida" +msgstr "Lifetimes" +# Nadie dice Duración de tiempo de vida, solemos hablar de lifetime, el termino en ingles. #: src/SUMMARY.md src/lifetimes.md src/lifetimes/lifetime-annotations.md msgid "Lifetime Annotations" -msgstr "Anotaciones de duración de vida" +msgstr "Anotaciones de Lifetime" +# Elision es un termino muy extraño, lo mismo con Duración de tiempo de vida, es poco natural, la gente suele decir directamente lifetimes, y por el significado de la palabra Elisión me parece más sencillo hablar de omitir. #: src/SUMMARY.md src/lifetimes.md msgid "Lifetime Elision" -msgstr "Elisión de duración de vida" +msgstr "Omisión de Lifetimes" #: src/SUMMARY.md src/lifetimes.md msgid "Struct Lifetimes" -msgstr "Duraciones de vida de estructuras (_structs_)" +msgstr "Lifetimes en Estructuras" #: src/SUMMARY.md src/lifetimes.md src/lifetimes/exercise.md msgid "Exercise: Protobuf Parsing" @@ -1433,9 +1440,9 @@ msgid "" "based browsers. This includes interoperability with C++ and how to include " "third-party crates in Chromium." msgstr "" -"[Chromium](../chromium.md): una clase de medio día sobre el uso de Rust " -"dentro del navegador Chromium. Incluye interoperabilidad con C++ y como " -"incorporar bibliotecas de tercer partido (\"crates\") en Chromium." +"[Chromium](chromium.md): una clase de medio día sobre el uso de Rust dentro " +"del navegador Chromium. Incluye interoperabilidad con C++ y como incorporar " +"bibliotecas de tercer partido (\"crates\") en Chromium." #: src/index.md msgid "" @@ -1449,15 +1456,15 @@ msgstr "" #: src/index.md msgid "" -"[Concurrency](concurrency.md): a whole-day class on concurrency in Rust. We " -"cover both classical concurrency (preemptively scheduling using threads and " -"mutexes) and async/await concurrency (cooperative multitasking using " -"futures)." +"[Concurrency](concurrency/welcome.md): a whole-day class on concurrency in " +"Rust. We cover both classical concurrency (preemptively scheduling using " +"threads and mutexes) and async/await concurrency (cooperative multitasking " +"using futures)." msgstr "" -"[Concurrencia](concurrency.md): una clase de un día sobre concurrencia en " -"Rust. Abordaremos tanto la concurrencia clásica (programación interrumpible " -"mediante hilos y exclusiones mutuas), como la concurrencia async / await " -"(multitarea cooperativa mediante traits future)." +"[Concurrencia](concurrency/welcome.md): una clase de un día entero sobre " +"concurrencia en Rust. Cubrimos tanto la concurrencia clásica (programación " +"preventiva utilizando hilos y mutexes) como la concurrencia async/await " +"(multitarea cooperativa utilizando futures)." #: src/index.md msgid "Non-Goals" @@ -1897,11 +1904,11 @@ msgstr "Concurrencia en Rust" #: src/running-the-course/course-structure.md msgid "" -"The [Concurrency in Rust](../concurrency.md) deep dive is a full day class " -"on classical as well as `async`/`await` concurrency." +"The [Concurrency in Rust](../concurrency/welcome.md) deep dive is a full day " +"class on classical as well as `async`/`await` concurrency." msgstr "" -"[Concurrencia en profundidad](../concurrency.md) es una clase de un día " -"sobre la concurrencia clásica y la concurrencia `async`/`await`." +"La inmersión en [Concurrencia en Rust](../concurrency/welcome.md) es una " +"clase de un día completo sobre concurrencia clásica así como `async`/`await`." #: src/running-the-course/course-structure.md msgid "" @@ -1999,8 +2006,7 @@ msgid "" "by [@suetfei](https://github.com/suetfei), [@wnghl](https://github.com/" "wnghl), [@anlunx](https://github.com/anlunx), [@kongy](https://github.com/" "kongy), [@noahdragon](https://github.com/noahdragon), [@superwhd](https://" -"github.com/superwhd), [@SketchK](https://github.com/SketchK), and [@nodmp]" -"(https://github.com/nodmp)." +"github.com/superwhd), @SketchK, and [@nodmp](https://github.com/nodmp)." msgstr "" "[Chino (simplificado)](https://google.github.io/comprehensive-rust/zh-CN/) " "por [@suetfei](https://github.com/suetfei), [@wnghl](https://github.com/" @@ -2099,6 +2105,20 @@ msgstr "" "[Bengalí](https://google.github.io/comprehensive-rust/bn/) por [@raselmandol]" "(https://github.com/raselmandol)." +#: src/running-the-course/translations.md +msgid "" +"[Farsi](https://google.github.io/comprehensive-rust/fa/) by [@Alix1383]" +"(https://github.com/alix1383), [@DannyRavi](https://github.com/DannyRavi), " +"[@hamidrezakp](https://github.com/hamidrezakp), [@javad-jafari](https://" +"github.com/javad-jafari) and [@moaminsharifi](https://github.com/" +"moaminsharifi)." +msgstr "" +"[Chino (tradicional)](https://google.github.io/comprehensive-rust/zh-TW/) " +"por [@hueich](https://github.com/hueich), [@victorhsieh](https://github.com/" +"victorhsieh), [@mingyc](https://github.com/mingyc), [@kuanhungchen](https://" +"github.com/kuanhungchen) y [@johnathan79717](https://github.com/" +"johnathan79717)." + #: src/running-the-course/translations.md msgid "" "[French](https://google.github.io/comprehensive-rust/fr/) by [@KookaS]" @@ -3071,7 +3091,7 @@ msgid "" "arguments (no function [overloading](../control-flow-basics/functions.md))." msgstr "" "Rust utiliza macros en situaciones en las que se desea un número variable de " -"argumentos (sin [sobrecarga](basic-syntax/functions-interlude.md) de " +"argumentos (sin [sobrecarga](../control-flow-basics/functions.md) de " "funciones)." #: src/types-and-values/hello-world.md @@ -3447,13 +3467,15 @@ msgstr "" #: src/control-flow-basics/if.md msgid "" -"When `if` is used in an expression, the expression must have a `;` to " -"separate it from the next statement. Remove the `;` before `println!` to see " -"the compiler error." +"An `if` expression should be used in the same way as the other expressions. " +"For example, when it is used in a `let` statement, the statement must be " +"terminated with a `;` as well. Remove the `;` before `println!` to see the " +"compiler error." msgstr "" -"Cuando se utiliza `if` en una expresión, esta debe tener un `;` para " -"separarla de la siguiente instrucción. Elimina `;` antes de `println!` para " -"ver el error del compilador." +"Una expresión `if` debe usarse de la misma manera que las otras expresiones. " +"Por ejemplo, cuando se utiliza en una declaración `let`, la declaración " +"también debe terminar con un `;`. Elimina `;` antes de `println!` para ver " +"el error del compilador." #: src/control-flow-basics/loops.md msgid "There are three looping keywords in Rust: `while`, `loop`, and `for`:" @@ -3531,7 +3553,7 @@ msgstr "" #: src/control-flow-basics/break-continue.md msgid "" "If you want to exit any kind of loop early, use [`break`](https://doc.rust-" -"lang.org/reference/expressions/loop-expr.html#break-expressions). For " +"lang.org/reference/expressions/loop-expr.html#break-expressions). With " "`loop`, this can take an optional expression that becomes the value of the " "`loop` expression." msgstr "" @@ -3549,6 +3571,17 @@ msgstr "" msgid "\"{}\"" msgstr "\"{}\"" +#: src/control-flow-basics/break-continue.md +msgid "" +"Note that `loop` is the only looping construct which can return a non-" +"trivial value. This is because it's guaranteed to only return at a `break` " +"statement (unlike `while` and `for` loops, which can also return when the " +"condition fails)." +msgstr "" +"Ten en cuenta que `loop` es la única construcción de bucle que devuelve un " +"valor no trivial. Esto se debe a que es inevitable que se introduzca al " +"menos una vez (a diferencia de los bucles `while` y `for`)." + #: src/control-flow-basics/break-continue/labels.md msgid "" "Both `continue` and `break` can optionally take a label argument which is " @@ -3561,16 +3594,6 @@ msgstr "" msgid "\"elements searched: {elements_searched}\"" msgstr "\"elementos travesados: {elements_searched}\"" -#: src/control-flow-basics/break-continue/labels.md -msgid "" -"Note that `loop` is the only looping construct which returns a non-trivial " -"value. This is because it's guaranteed to be entered at least once (unlike " -"`while` and `for` loops)." -msgstr "" -"Ten en cuenta que `loop` es la única construcción de bucle que devuelve un " -"valor no trivial. Esto se debe a que es inevitable que se introduzca al " -"menos una vez (a diferencia de los bucles `while` y `for`)." - #: src/control-flow-basics/blocks-and-scopes.md msgid "Blocks" msgstr "Bloques" @@ -3649,13 +3672,13 @@ msgstr "" #: src/control-flow-basics/blocks-and-scopes/scopes.md msgid "" "Shadowing is different from mutation, because after shadowing both " -"variable's memory locations exist at the same time. Both are available under " +"variables' memory locations exist at the same time. Both are available under " "the same name, depending where you use it in the code." msgstr "" -"Definición: _Shadowing_ (sombreado) es distinto de la mutación, ya que " -"después de sombrear las ubicaciones de memoria de las dos variables existen " -"al mismo tiempo. Ambas están disponibles bajo el mismo nombre, en función de " -"dónde se utiliza en el código." +"El _Shadowing_ (sombreado) es distinto de la mutación, ya que después de " +"sombrear las ubicaciones de memoria de las dos variables existen al mismo " +"tiempo. Ambas están disponibles bajo el mismo nombre, en función de dónde se " +"utiliza en el código." #: src/control-flow-basics/blocks-and-scopes/scopes.md msgid "A shadowing variable can have a different type." @@ -3694,7 +3717,7 @@ msgstr "" #: src/control-flow-basics/functions.md msgid "" "Some functions have no return value, and return the 'unit type', `()`. The " -"compiler will infer this if the `-> ()` return type is omitted." +"compiler will infer this if the return type is omitted." msgstr "" "Algunas funciones no devuelven ningún valor, devuelven el \"tipo unitario\", " "`()`. El compilador deducirá esto si se omite el tipo de retorno `-> ()`." @@ -3976,7 +3999,7 @@ msgstr "" #: src/tuples-and-arrays/iteration.md msgid "" "The `assert_ne!` macro is new here. There are also `assert_eq!` and `assert!" -"` macros. These are always checked while, debug-only variants like " +"` macros. These are always checked, while debug-only variants like " "`debug_assert!` compile to nothing in release builds." msgstr "" "La macro `assert_ne!` es nueva. También existen las macros `assert_eq!` y " @@ -4093,15 +4116,11 @@ msgstr "\"traspuesto: {:#?}\"" msgid "This segment should take about 55 minutes. It contains:" msgstr "Esta sección tiene una duración aproximada de 55 minutos. Contiene:" -#: src/references.md -msgid "Slices: &\\[T\\]" -msgstr "Slices: &\\[T\\]" - #: src/references/shared.md msgid "" -"A reference provides a way to access another value without taking " -"responsibility for the value, and is also called \"borrowing\". Shared " -"references are read-only, and the referenced data cannot change." +"A reference provides a way to access another value without taking ownership " +"of the value, and is also called \"borrowing\". Shared references are read-" +"only, and the referenced data cannot change." msgstr "" "Una referencia ofrece una forma de acceder a otro valor sin asumir la " "responsabilidad del valor. También se denomina \"préstamo\". Las referencias " @@ -4238,10 +4257,6 @@ msgstr "" "vincular a distintos valores, mientras que la segunda representa una " "referencia a un valor mutable." -#: src/references/slices.md -msgid "Slices" -msgstr "Slices" - #: src/references/slices.md msgid "A slice gives you a view into a larger collection:" msgstr "Un _slice_ ofrece una visión de una colección más amplia:" @@ -4800,6 +4815,49 @@ msgstr "" "el compilador no ofrece garantías con respecto a esta representación, por lo " "tanto es totalmente inseguro." +#: src/user-defined-types/const.md +msgid "`const`" +msgstr "`const`" + +#: src/user-defined-types/const.md +msgid "" +"Constants are evaluated at compile time and their values are inlined " +"wherever they are used:" +msgstr "" +"Las variables constantes se evalúan en tiempo de compilación y sus valores " +"se insertan donde sean utilizados:" + +#: src/user-defined-types/const.md +msgid "" +"According to the [Rust RFC Book](https://rust-lang.github.io/rfcs/0246-const-" +"vs-static.html) these are inlined upon use." +msgstr "" +"Según el libro [Rust RFC Book](https://rust-lang.github.io/rfcs/0246-const-" +"vs-static.html), se insertan cuando se utilizan." + +#: src/user-defined-types/const.md +msgid "" +"Only functions marked `const` can be called at compile time to generate " +"`const` values. `const` functions can however be called at runtime." +msgstr "" +"Sólo se pueden llamar a las funciones marcadas como `const` en tiempo de " +"compilación para generar valores `const`. Sin embargo, las funciones `const` " +"se pueden llamar en _runtime_." + +#: src/user-defined-types/const.md +msgid "Mention that `const` behaves semantically similar to C++'s `constexpr`" +msgstr "" +"Menciona que `const` se comporta semánticamente de forma similar a " +"`constexpr` de C++" + +#: src/user-defined-types/const.md +msgid "" +"It isn't super common that one would need a runtime evaluated constant, but " +"it is helpful and safer than using a static." +msgstr "" +"No es muy habitual que se necesite una constante evaluada en _runtime_, pero " +"es útil y más seguro que usar una estática." + #: src/user-defined-types/static.md msgid "`static`" msgstr "`static`" @@ -4864,49 +4922,6 @@ msgid "Thread-local data can be created with the macro `std::thread_local`." msgstr "" "Datos locales al hilo se pueden crear con el macro `std::thread_local`." -#: src/user-defined-types/const.md -msgid "`const`" -msgstr "`const`" - -#: src/user-defined-types/const.md -msgid "" -"Constants are evaluated at compile time and their values are inlined " -"wherever they are used:" -msgstr "" -"Las variables constantes se evalúan en tiempo de compilación y sus valores " -"se insertan donde sean utilizados:" - -#: src/user-defined-types/const.md -msgid "" -"According to the [Rust RFC Book](https://rust-lang.github.io/rfcs/0246-const-" -"vs-static.html) these are inlined upon use." -msgstr "" -"Según el libro [Rust RFC Book](https://rust-lang.github.io/rfcs/0246-const-" -"vs-static.html), se insertan cuando se utilizan." - -#: src/user-defined-types/const.md -msgid "" -"Only functions marked `const` can be called at compile time to generate " -"`const` values. `const` functions can however be called at runtime." -msgstr "" -"Sólo se pueden llamar a las funciones marcadas como `const` en tiempo de " -"compilación para generar valores `const`. Sin embargo, las funciones `const` " -"se pueden llamar en _runtime_." - -#: src/user-defined-types/const.md -msgid "Mention that `const` behaves semantically similar to C++'s `constexpr`" -msgstr "" -"Menciona que `const` se comporta semánticamente de forma similar a " -"`constexpr` de C++" - -#: src/user-defined-types/const.md -msgid "" -"It isn't super common that one would need a runtime evaluated constant, but " -"it is helpful and safer than using a static." -msgstr "" -"No es muy habitual que se necesite una constante evaluada en _runtime_, pero " -"es útil y más seguro que usar una estática." - #: src/user-defined-types/aliases.md msgid "" "A type alias creates a name for another type. The two types can be used " @@ -5432,16 +5447,16 @@ msgstr "" "cualquier acción es válida menos colocarlo al final del bloque)." #: src/pattern-matching/let-control-flow.md -msgid "\"got None\"" -msgstr "\"se ha obtenido None\"" +msgid "\"not a hex digit\"" +msgstr "\"no es un dígito hexadecimal\"" #: src/pattern-matching/let-control-flow.md msgid "\"got empty string\"" msgstr "\"se ha encontrado una cadena vacía\"" #: src/pattern-matching/let-control-flow.md -msgid "\"not a hex digit\"" -msgstr "\"no es un dígito hexadecimal\"" +msgid "\"got None\"" +msgstr "\"se ha obtenido None\"" #: src/pattern-matching/let-control-flow.md src/pattern-matching/solution.md msgid "\"result: {:?}\"" @@ -5868,7 +5883,6 @@ msgstr "" "`Pet` también debe implementar `Animal`." #: src/methods-and-traits/traits/supertraits.md -#: src/concurrency/async-control-flow/select.md msgid "\"Rex\"" msgstr "\"Rex\"" @@ -6236,7 +6250,7 @@ msgstr "" "trait." #: src/generics/trait-bounds.md -msgid "You can do this with `T: Trait` or `impl Trait`:" +msgid "You can do this with `T: Trait`:" msgstr "Puedes hacerlo con `T: Trait` o `impl Trait`:" #: src/generics/trait-bounds.md @@ -7377,11 +7391,24 @@ msgstr "" "Se podría implementar `Add` para dos tipos distintos; por ejemplo, `impl " "Add<(i32, i32)> for Point` añadiría una tupla a un `Point`." +#: src/std-traits/operators.md +msgid "" +"The `Not` trait (`!` operator) is notable because it does not \"boolify\" " +"like the same operator in C-family languages; instead, for integer types it " +"negates each bit of the number, which arithmetically is equivalent to " +"subtracting it from -1: `!5 == -6`." +msgstr "" +"El trait `Not` (operador `!`) es notable porque no convierte a booleano como " +"el mismo operador en los lenguajes de la familia C; en su lugar, para los " +"tipos enteros, niega cada bit del número, lo que aritméticamente es " +"equivalente a restarlo de -1: `!5 == -6`." + #: src/std-traits/from-and-into.md msgid "" "Types implement [`From`](https://doc.rust-lang.org/std/convert/trait.From." "html) and [`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) to " -"facilitate type conversions:" +"facilitate type conversions. Unlike `as`, these traits correspond to " +"lossless, infallible conversions." msgstr "" "Los tipos implementan [`From`](https://doc.rust-lang.org/std/convert/trait." "From.html) y [`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) " @@ -7551,7 +7578,9 @@ msgid "" "produces a default value for a type." msgstr "" "El trait [`Default`](https://doc.rust-lang.org/std/default/trait.Default." -"html) produce un valor predeterminado para un tipo." +"html) produce un valor predeterminado para un tipo.[`Default`](https://doc." +"rust-lang.org/std/default/trait.Default.html) se usa para construir una " +"instancia predeterminada de un tipo." #: src/std-traits/default.md msgid "\"John Smith\"" @@ -7642,46 +7671,50 @@ msgstr "" "html):" #: src/std-traits/closures.md -msgid "\"Calling function on {input}\"" -msgstr "\"Llamado función sobre {input}\"" +msgid "\"Calling {func_name}({input}): {}\"" +msgstr "\"Ejecutando {func_name}({input}): {}\"" #: src/std-traits/closures.md -msgid "\"add_3: {}\"" -msgstr "\"add_3: {}\"" +msgid "\"add_3\"" +msgstr "\"add_3\"" #: src/std-traits/closures.md -msgid "\"accumulate: {}\"" -msgstr "\"accumulate: {}\"" +msgid "\"accumulate\"" +msgstr "\"accumulate\"" #: src/std-traits/closures.md -msgid "\"multiply_sum: {}\"" -msgstr "\"multiply_sum: {}\"" +msgid "\"multiply_sum\"" +msgstr "\"multiply_sum\"" #: src/std-traits/closures.md msgid "" -"An `Fn` (e.g. `add_3`) neither consumes nor mutates captured values, or " -"perhaps captures nothing at all. It can be called multiple times " -"concurrently." +"An `Fn` (e.g. `add_3`) neither consumes nor mutates captured values. It can " +"be called needing only a shared reference to the closure, which means the " +"closure can be executed repeatedly and even concurrently." msgstr "" "Un `Fn` (por ejemplo, `add_3`) no consume ni modifica los valores " -"capturados, o quizá no captura nada en absoluto. Se puede llamar varias " -"veces al mismo tiempo." +"capturados. Puede ser llamado con solo una referencia compartida al closure, " +"lo que significa que el cierre puede ejecutarse repetidamente e incluso de " +"manera concurrente." #: src/std-traits/closures.md msgid "" -"An `FnMut` (e.g. `accumulate`) might mutate captured values. You can call it " -"multiple times, but not concurrently." +"An `FnMut` (e.g. `accumulate`) might mutate captured values. The closure " +"object is accessed via exclusive reference, so it can be called repeatedly " +"but not concurrently." msgstr "" "Un `FnMut` (por ejemplo, `accumulate`) puede modificar los valores " -"capturados. Se puede llamar varias veces, pero no de forma simultánea." +"capturados. La closure se accede a través de una referencia exclusiva, por " +"lo que se puede llamar varias veces, pero no de forma simultánea." #: src/std-traits/closures.md msgid "" -"If you have an `FnOnce` (e.g. `multiply_sum`), you may only call it once. It " -"might consume captured values." +"If you have an `FnOnce` (e.g. `multiply_sum`), you may only call it once. " +"Doing so consumes the closure and any values captured by move." msgstr "" "Si tienes un `FnOnce` (por ejemplo, `multiply_sum`), solo puedes llamarlo " -"una vez. Puede consumir valores capturados." +"una vez. Al hacerlo, consumes la closure y cualquier valor capturado por " +"`move`." #: src/std-traits/closures.md msgid "" @@ -7708,27 +7741,33 @@ msgstr "" #: src/std-traits/closures.md msgid "" "In contrast, when you have a closure, the most flexible you can have is `Fn` " -"(it can be passed everywhere), then `FnMut`, and lastly `FnOnce`." +"(which can be passed to a consumer of any of the 3 closure traits), then " +"`FnMut`, and lastly `FnOnce`." msgstr "" -"Por el contrario, cuando tienes un cierre (closure), lo más flexible que " -"puedes tener es `Fn` (se puede transmitir en todas partes), a continuación " -"`FnMut` y, por último, `FnOnce`." +"Por el contrario, cuando tienes una closure, lo más flexible que puedes " +"tener es `Fn` (se puede transmitir en todas partes), a continuación `FnMut` " +"y, por último, `FnOnce`." #: src/std-traits/closures.md msgid "" "The compiler also infers `Copy` (e.g. for `add_3`) and `Clone` (e.g. " -"`multiply_sum`), depending on what the closure captures." +"`multiply_sum`), depending on what the closure captures. Function pointers " +"(references to `fn` items) implement `Copy` and `Fn`." msgstr "" "El compilador también infiere `Copy` (por ejemplo, `add_3`) y `Clone` (por " -"ejemplo, `multiply_sum`), dependiendo de lo que capture el cierre." +"ejemplo, `multiply_sum`), dependiendo de lo que capture la closure." #: src/std-traits/closures.md msgid "" -"By default, closures will capture by reference if they can. The `move` " -"keyword makes them capture by value." +"By default, closures will capture each variable from an outer scope by the " +"least demanding form of access they can (by shared reference if possible, " +"then exclusive reference, then by move). The `move` keyword forces capture " +"by value." msgstr "" -"De forma predeterminada, los cierres capturan, si pueden, por referencia. La " -"palabra clave `move` hace que capturen por valor." +"Por defecto, las closures capturan cada variable del alcance exterior con la " +"forma de acceso menos exigente posible (por referencia compartida si es " +"posible, luego por referencia exclusiva, y finalmente por movimiento). La " +"palabra clave `move` obliga a capturar por valor." #: src/std-traits/closures.md src/smart-pointers/trait-objects.md msgid "\"{} {}\"" @@ -7957,8 +7996,7 @@ msgstr "" "que ya no se pueda hacer referencia a ella." #: src/memory-management/approaches.md -msgid "" -"Typically implemented with reference counting, garbage collection, or RAII." +msgid "Typically implemented with reference counting or garbage collection." msgstr "" "Normalmente se implementa con un contador de referencias, la recolección de " "elementos no utilizados o RAII." @@ -8083,7 +8121,7 @@ msgstr "" msgid "An assignment will transfer _ownership_ between variables:" msgstr "Una asignación transferirá su _ownership_ entre variables:" -#: src/memory-management/move.md +#: src/memory-management/move.md src/concurrency/async-control-flow/select.md msgid "\"Hello!\"" msgstr "\"¡Hola!\"" @@ -8169,7 +8207,7 @@ msgid "\"Hello {name}\"" msgstr "\"Hola {name}\"" #: src/memory-management/move.md src/memory-management/clone.md -#: src/android/interoperability/java.md +#: src/android/aidl/types/parcelables.md src/android/interoperability/java.md msgid "\"Alice\"" msgstr "\"Alice\"" @@ -8334,9 +8372,8 @@ msgid "" "The idea of `Clone` is to make it easy to spot where heap allocations are " "occurring. Look for `.clone()` and a few others like `vec!` or `Box::new`." msgstr "" -"La función de `Clone` es poder encontrar fácilmente dónde se producen las " -"asignaciones al heap. Busca a `.clone()` y algunos otros como `vec!` o `Box::" -"new`." +"La función de `Clone` es poder encontrar fácilmente dónde se producen las " +"dines al heap. Busca a `.clone()` y algunos otros como `vec!` o `Box::new`." #: src/memory-management/clone.md msgid "" @@ -8710,10 +8747,12 @@ msgstr "" #: src/smart-pointers/box.md msgid "" -"Recursive data types or data types with dynamic sizes need to use a `Box`:" +"Recursive data types or data types with dynamic sizes cannot be stored " +"inline without a pointer indirection, which can be worked around using `Box`:" msgstr "" -"Los tipos de datos recursivos o los tipos de datos con tamaños dinámicos " -"deben utilizar un `Box`:" +"Los tipos de datos recursivos o los tipos de datos con tamaños dinámicos no " +"pueden almacenarse en línea sin una indirección de puntero, lo cual se puede " +"solucionar utilizando `Box`:" #: src/smart-pointers/box.md msgid "/// A non-empty list: first element and the rest of the list.\n" @@ -8781,8 +8820,8 @@ msgstr "Un `Box` puede resultar útil en los siguientes casos:" #: src/smart-pointers/box.md msgid "" -"have a type whose size that can't be known at compile time, but the Rust " -"compiler wants to know an exact size." +"have a type whose size can't be known at compile time, but the Rust compiler " +"wants to know an exact size." msgstr "" "tiene un tipo cuyo tamaño no se conoce durante la compilación, pero el " "compilador de Rust quiere saber el tamaño exacto." @@ -8893,11 +8932,11 @@ msgstr "\"b: {b}\"" #: src/smart-pointers/rc.md msgid "" -"See [`Arc`](../concurrency/shared_state/arc.md) and [`Mutex`](https://doc." +"See [`Arc`](../concurrency/shared-state/arc.md) and [`Mutex`](https://doc." "rust-lang.org/std/sync/struct.Mutex.html) if you are in a multi-threaded " "context." msgstr "" -"Consulta [`Arc`](../concurrency/shared_state/arc.md) y [`Mutex`](https://doc." +"Consulta [`Arc`](../concurrency/shared-state/arc.md) y [`Mutex`](https://doc." "rust-lang.org/std/sync/struct.Mutex.html) si te encuentras en un contexto " "multihilo." @@ -9393,13 +9432,57 @@ msgstr "" "una comprobación del tiempo de ejecución." #: src/borrowing/interior-mutability.md -msgid "`RefCell`" -msgstr "`RefCell`" +msgid "`Cell`" +msgstr "`Cell`" + +#: src/borrowing/interior-mutability.md +msgid "" +"`Cell` wraps a value and allows getting or setting the value using only a " +"shared reference to the `Cell`. However, it does not allow any references to " +"the inner value. Since there are no references, borrowing rules cannot be " +"broken." +msgstr "" +"`Cell` envuelve un valor y permite obtenerlo o definirlo, incluso con una " +"referencia compartida a `Cell`. Sin embargo, no permite obtener referencias " +"al valor. Como no hay referencias, las reglas de préstamos no pueden " +"romperse." #: src/borrowing/interior-mutability.md msgid "// Note that `cell` is NOT declared as mutable.\n" msgstr "// Nota que `cell` NO es declarado como mutable.\n" +#: src/borrowing/interior-mutability.md +msgid "`RefCell`" +msgstr "`RefCell`" + +#: src/borrowing/interior-mutability.md +msgid "" +"`RefCell` allows accessing and mutating a wrapped value by providing " +"alternative types `Ref` and `RefMut` that emulate `&T`/`&mut T` without " +"actually being Rust references." +msgstr "" +"`RefCell` permite acceder y modificar un valor envuelto al proporcionar " +"tipos alternativos `Ref` y `RefMut` que emulan `&T`/`&mut T` sin ser " +"realmente referencias de Rust." + +#: src/borrowing/interior-mutability.md +msgid "" +"These types perform dynamic checks using a counter in the `RefCell` to " +"prevent existence of a `RefMut` alongside another `Ref`/`RefMut`." +msgstr "" +"Estos tipos realizan verificaciones dinámicas utilizando un contador en el " +"`RefCell` para prevenir la existencia de un `RefMut` junto con otro `Ref`/" +"`RefMut`." + +#: src/borrowing/interior-mutability.md +msgid "" +"By implementing `Deref` (and `DerefMut` for `RefMut`), these types allow " +"calling methods on the inner value without allowing references to escape." +msgstr "" +"Al implementar `Deref` (y `DerefMut` para `RefMut`), estos tipos permiten " +"llamar a métodos en el valor interno sin permitir que las referencias se " +"escapen." + #: src/borrowing/interior-mutability.md msgid "" "// This triggers an error at runtime.\n" @@ -9414,21 +9497,6 @@ msgstr "" msgid "\"{cell:?}\"" msgstr "\"{cell:?}\"" -#: src/borrowing/interior-mutability.md -msgid "`Cell`" -msgstr "`Cell`" - -#: src/borrowing/interior-mutability.md -msgid "" -"`Cell` wraps a value and allows getting or setting the value, even with a " -"shared reference to the `Cell`. However, it does not allow any references to " -"the value. Since there are no references, borrowing rules cannot be broken." -msgstr "" -"`Cell` envuelve un valor y permite obtenerlo o definirlo, incluso con una " -"referencia compartida a `Cell`. Sin embargo, no permite obtener referencias " -"al valor. Como no hay referencias, las reglas de préstamos no pueden " -"quebrantarse." - #: src/borrowing/interior-mutability.md msgid "" "The main thing to take away from this slide is that Rust provides _safe_ " @@ -9852,24 +9920,33 @@ msgstr "/// Varint WireType indica que el valor es un único VARINT.\n" #: src/lifetimes/exercise.md src/lifetimes/solution.md msgid "" -"//I64, -- not needed for this exercise\n" +"/// The I64 WireType indicates that the value is precisely 8 bytes in\n" +" /// little-endian order containing a 64-bit signed integer or double " +"type.\n" +" //I64, -- not needed for this exercise\n" " /// The Len WireType indicates that the value is a length represented as " "a\n" " /// VARINT followed by exactly that number of bytes.\n" msgstr "" -"//I64, -- no es necesario para este ejercicio\n" +"/// El WireType I64 indica que el valor tiene exactamente 8 bytes en\n" +" /// orden little-endian que contienen un entero con signo de 64 bits o " +"un tipo double.\n" +" //I64, -- no es necesario para este ejercicio\n" " /// El Len WireType indica que el valor es una longitud representada " "como\n" " /// VARINT seguida exactamente de ese número de bytes.\n" #: src/lifetimes/exercise.md src/lifetimes/solution.md msgid "" -"/// The I32 WireType indicates that the value is precisely 4 bytes in\n" -" /// little-endian order containing a 32-bit signed integer.\n" +"// The I32 WireType indicates that the value is precisely 4 bytes in\n" +" // little-endian order containing a 32-bit signed integer or float " +"type.\n" +" //I32, -- not needed for this exercise\n" msgstr "" -"/// El WireType I32 indica que el valor es de 4 bytes en\n" -" /// el orden little endian que contiene un número entero con signo de 32 " -"bits.\n" +"// El WireType I32 indica que el valor es de 4 bytes en\n" +" // el orden little endian que contiene un número entero con signo de 32 " +"bits o flotante de 32 bits.\n" +" //I32, -- no es necesario para este ejercicio\n" #: src/lifetimes/exercise.md src/lifetimes/solution.md msgid "/// A field's value, typed based on the wire type.\n" @@ -9879,6 +9956,10 @@ msgstr "/// Valor de un campo, escrito en función del tipo de wire.\n" msgid "//I64(i64), -- not needed for this exercise\n" msgstr "//I64(i64), -- no es necesario para este ejercicio\n" +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "//I32(i32), -- not needed for this exercise\n" +msgstr "//I32(i32), -- no es necesario para este ejercicio\n" + #: src/lifetimes/exercise.md src/lifetimes/solution.md msgid "/// A field, containing the field number and its value.\n" msgstr "/// Campo que contiene el número de campo y su valor.\n" @@ -9887,6 +9968,10 @@ msgstr "/// Campo que contiene el número de campo y su valor.\n" msgid "//1 => WireType::I64, -- not needed for this exercise\n" msgstr "//1 => WireType::I64, no es necesario para este ejercicio\n" +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "//5 => WireType::I32, -- not needed for this exercise\n" +msgstr "//5 => WireType::I32, no es necesario para este ejercicio\n" + #: src/lifetimes/exercise.md src/lifetimes/solution.md msgid "\"Invalid wire type: {value}\"" msgstr "\"Tipo de wire no válido: {value}\"" @@ -9907,10 +9992,6 @@ msgstr "\"Bytes eran esperados ser un campo `Len`\"" msgid "\"Expected `u64` to be a `Varint` field\"" msgstr "\"`u64` era esperado ser un campo `Varint`\"" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "\"Expected `i32` to be an `I32` field\"" -msgstr "\"`i32` era esperado ser un campo `I32`\"" - #: src/lifetimes/exercise.md src/lifetimes/solution.md msgid "" "/// Parse a VARINT, returning the parsed value and the remaining bytes.\n" @@ -9998,14 +10079,31 @@ msgstr "\"len no es un `usize` valido\"" msgid "\"Unexpected EOF\"" msgstr "\"EOF inesperado\"" -#: src/lifetimes/solution.md -msgid "// Unwrap error because `value` is definitely 4 bytes long.\n" -msgstr "// Desenvuelve el error porque `value` tiene 4 bytes.\n" - #: src/lifetimes/solution.md msgid "// skip everything else\n" msgstr "// salta todos los demás pasos\n" +#: src/lifetimes/solution.md src/modules/exercise.md src/modules/solution.md +#: src/testing/unit-tests.md src/testing/solution.md +msgid "\"\"" +msgstr "\"\"" + +#: src/lifetimes/solution.md +msgid "\"beautiful name\"" +msgstr "\"hermoso nombre\"" + +#: src/lifetimes/solution.md +msgid "\"Evan\"" +msgstr "\"Evan\"" + +#: src/lifetimes/solution.md +msgid "\"+1234-777-9090\"" +msgstr "\"+1234-777-9090\"" + +#: src/lifetimes/solution.md +msgid "\"home\"" +msgstr "\"hogar\"" + #: src/welcome-day-4.md msgid "Welcome to Day 4" msgstr "Bienvenido al Día 4" @@ -10654,11 +10752,6 @@ msgstr "" msgid "\"+-{:-` as long as it implements `std::" "process::Termination`. In practice, this means that `E` implements `Debug`. " @@ -11349,14 +11451,14 @@ msgid "works the same as" msgstr "funciona igual que" #: src/error-handling/try-conversions.md -#, fuzzy msgid "" "The `From::from` call here means we attempt to convert the error type to the " "type returned by the function. This makes it easy to encapsulate errors into " "higher-level errors." msgstr "" "Aquí la llamada a `From::from` significa que intentamos convertir el tipo de " -"error al tipo que devuelve la función:" +"error al tipo que devuelve la función. Esto facilita encapsular errores en " +"errores de nivel superior." #: src/error-handling/try-conversions.md msgid "\"IO error: {e}\"" @@ -11367,9 +11469,8 @@ msgid "\"Found no username in {path}\"" msgstr "\"No se ha encontrado ningún nombre de usuario en {path}\"" #: src/error-handling/try-conversions.md -#, fuzzy msgid "//std::fs::write(\"config.dat\", \"\").unwrap();\n" -msgstr "//fs::write(\"config.dat\", \"\").unwrap();\n" +msgstr "//std::fs::write(\"config.dat\", \"\").unwrap();\n" #: src/error-handling/try-conversions.md msgid "" @@ -11419,7 +11520,6 @@ msgid "Dynamic Error Types" msgstr "Tipos de Errores Dinámicos" #: src/error-handling/error.md -#, fuzzy msgid "" "Sometimes we want to allow any type of error to be returned without writing " "our own enum covering all the different possibilities. The `std::error::" @@ -11427,8 +11527,9 @@ msgid "" "error." msgstr "" "A veces, queremos permitir que se devuelva cualquier tipo de error sin " -"escribir nuestra propia _enum_ que cubra todas las posibilidades. `std::" -"error::Error` facilita este proceso." +"escribir nuestra propia _enum_ que cubra todas las posibilidades. El trait " +"`std::error::Error` facilita la creación de un trait object que puede " +"contener cualquier error." #: src/error-handling/error.md msgid "\"count.dat\"" @@ -11455,7 +11556,6 @@ msgstr "" "de archivos) o `std::num::ParseIntError` (de `String::parse`)." #: src/error-handling/error.md -#, fuzzy msgid "" "Boxing errors saves on code, but gives up the ability to cleanly handle " "different error cases differently in the program. As such it's generally not " @@ -11472,26 +11572,19 @@ msgstr "" #: src/error-handling/error.md msgid "" "Make sure to implement the `std::error::Error` trait when defining a custom " -"error type so it can be boxed. But if you need to support the `no_std` " -"attribute, keep in mind that the `std::error::Error` trait is currently " -"compatible with `no_std` in [nightly](https://github.com/rust-lang/rust/" -"issues/103765) only." +"error type so it can be boxed." msgstr "" "Asegúrate de implementar el trait `std::error::Error` al definir un tipo de " -"error personalizado para que pueda tener una estructura box. Sin embargo, si " -"necesitas el atributo `no_std`, ten en cuenta que el trait `std::error::" -"Error` de momento solo es compatible con `no_std` en [nightly](https://" -"github.com/rust-lang/rust/issues/103765)." +"error personalizado para que pueda ser encapsulado (boxed)." #: src/error-handling/thiserror-and-anyhow.md -#, fuzzy msgid "" "The [`thiserror`](https://docs.rs/thiserror/) and [`anyhow`](https://docs.rs/" "anyhow/) crates are widely used to simplify error handling." msgstr "" -"Uno de los métodos más populares para crear una _enum_ (enumeración) de " -"errores es el crate [thiserror](https://docs.rs/thiserror/), como hicimos en " -"la página anterior:" +"Los crates [`thiserror`](https://docs.rs/thiserror/) y [`anyhow`](https://" +"docs.rs/anyhow/) son ampliamente utilizados para simplificar el manejo de " +"errores." #: src/error-handling/thiserror-and-anyhow.md msgid "" @@ -11534,9 +11627,8 @@ msgid "\"Error: {err:?}\"" msgstr "\"Error: {err:?}\"" #: src/error-handling/thiserror-and-anyhow.md -#, fuzzy msgid "`thiserror`" -msgstr "`Error`" +msgstr "`thiserror`" #: src/error-handling/thiserror-and-anyhow.md msgid "" @@ -11704,9 +11796,9 @@ msgid "\"Invalid number\"" msgstr "\"Número no válido\"" #: src/unsafe-rust.md -#, fuzzy msgid "This segment should take about 1 hour and 5 minutes. It contains:" -msgstr "Esta sección tiene una duración aproximada de 1 hora y 5 minutos." +msgstr "" +"Esta sección tiene una duración aproximada de 1 hora y 5 minutos. Contiene:" #: src/unsafe-rust/unsafe.md msgid "The Rust language has two parts:" @@ -11727,13 +11819,12 @@ msgstr "" "infringen las condiciones previas." #: src/unsafe-rust/unsafe.md -#, fuzzy msgid "" "We saw mostly safe Rust in this course, but it's important to know what " "Unsafe Rust is." msgstr "" -"En este curso, casi todo lo que veremos es _Safe_ Rust, aunque es importante " -"saber qué es _Unsafe_ Rust." +"En este curso, casi todo lo que veremos es Rust _Seguro_, aunque es " +"importante saber qué es _Unsafe_ Rust." #: src/unsafe-rust/unsafe.md msgid "" @@ -11780,7 +11871,6 @@ msgstr "" "documento [Rustonomicon](https://doc.rust-lang.org/nomicon/)." #: src/unsafe-rust/unsafe.md -#, fuzzy msgid "" "Unsafe Rust does not mean the code is incorrect. It means that developers " "have turned off some compiler safety features and have to write correct code " @@ -11803,7 +11893,6 @@ msgid "\"careful!\"" msgstr "\"¡cuidado!\"" #: src/unsafe-rust/dereferencing.md -#, fuzzy msgid "" "// SAFETY: r1 and r2 were obtained from references and so are guaranteed to\n" " // be non-null and properly aligned, the objects underlying the " @@ -11812,8 +11901,8 @@ msgid "" " // block, and they are not accessed either through the references or\n" " // concurrently through any other pointers.\n" msgstr "" -"// Es seguro porque r1 y r2 se han obtenido a partir desde referencias y, " -"por lo tanto,\n" +"// SEGURO; Es seguro porque r1 y r2 se han obtenido a partir desde " +"referencias y, por lo tanto,\n" " // se garantiza que no son nulos y que están alineados correctamente. " "Los objetos subyacentes\n" " // a las referencias de las que se han obtenido están activos\n" @@ -11940,6 +12029,8 @@ msgstr "" msgid "" "// SAFETY: There are no other threads which could be accessing `COUNTER`.\n" msgstr "" +"// SEGURO: Es seguro porque no hay otros hilos que puedan estar accediendo a " +"`COUNTER`.\n" #: src/unsafe-rust/mutable-static.md msgid "\"COUNTER: {COUNTER}\"" @@ -12033,13 +12124,12 @@ msgid "\"🗻∈🌏\"" msgstr "\"🗻∈🌏\"" #: src/unsafe-rust/unsafe-functions.md -#, fuzzy msgid "" "// SAFETY: The indices are in the correct order, within the bounds of the\n" " // string slice, and lie on UTF-8 sequence boundaries.\n" msgstr "" -"// Es seguro porque los índices están en el orden correcto, dentro de los " -"límites del\n" +"// SEGURO: Es seguro porque los índices están en el orden correcto, dentro " +"de los límites del\n" " // el slice de la cadena, y se encuentran en los límites de la secuencia " "de UTF-8.\n" @@ -12056,6 +12146,8 @@ msgid "" "// SAFETY: `abs` doesn't deal with pointers and doesn't have any safety\n" " // requirements.\n" msgstr "" +"// SEGURO: Es seguro porque `abs` no trata con punteros y no tiene " +"requisitos de seguridad.\n" #: src/unsafe-rust/unsafe-functions.md msgid "\"Absolute value of -3 according to C: {}\"" @@ -12096,21 +12188,19 @@ msgid "" msgstr "" "/// Cambia los valores a los que apuntan los punteros proporcionados.\n" "///\n" -"/// # Seguridad\n" +"/// # Seguro\n" "///\n" "/// Los punteros deben ser válidos y estar alineados adecuadamente.\n" #: src/unsafe-rust/unsafe-functions.md -#, fuzzy msgid "// SAFETY: ...\n" -msgstr "// ...\n" +msgstr "// Seguro: ...\n" #: src/unsafe-rust/unsafe-functions.md msgid "\"a = {}, b = {}\"" msgstr "\"a = {}, b = {}\"" #: src/unsafe-rust/unsafe-functions.md -#, fuzzy msgid "" "`get_unchecked`, like most `_unchecked` functions, is unsafe, because it can " "create UB if the range is incorrect. `abs` is incorrect for a different " @@ -12119,10 +12209,13 @@ msgid "" "might violate Rust's memory model, but in general any C function might have " "undefined behaviour under any arbitrary circumstances." msgstr "" -"Esto solo suele suponer un problema para las funciones externas que hacen " -"cosas con punteros que pueden infringir el modelo de memoria de Rust pero, " -"en general, cualquier función C puede tener un comportamiento indefinido " -"bajo cualquier circunstancia arbitraria." +"`get_unchecked`, como la mayoría de las funciones `_unchecked`, es inseguro " +"porque puede generar comportamiento indefinido (UB) si el rango es " +"incorrecto. `abs` es incorrecto por otra razón: es una función externa " +"(FFI). Llamar a funciones externas generalmente solo es problemático cuando " +"esas funciones realizan operaciones con punteros que podrían violar el " +"modelo de memoria de Rust, pero en general, cualquier función de C podría " +"tener comportamiento indefinido bajo cualquier circunstancia arbitraria." #: src/unsafe-rust/unsafe-functions.md msgid "" @@ -12133,16 +12226,14 @@ msgstr "" "(https://doc.rust-lang.org/reference/items/external-blocks.html)." #: src/unsafe-rust/unsafe-functions.md -#, fuzzy msgid "" "We wouldn't actually use pointers for a `swap` function - it can be done " "safely with references." msgstr "" -"En realidad, no usaríamos punteros para este caso porque se puede hacer de " -"forma segura con referencias." +"En realidad, no usaríamos punteros para una función `swap`; se puede hacer " +"de manera segura con referencias." #: src/unsafe-rust/unsafe-functions.md -#, fuzzy msgid "" "Note that unsafe code is allowed within an unsafe function without an " "`unsafe` block. We can prohibit this with `#[deny(unsafe_op_in_unsafe_fn)]`. " @@ -12150,8 +12241,9 @@ msgid "" "edition." msgstr "" "Ten en cuenta que el código inseguro se admite en una función insegura sin " -"un bloque `unsafe`. Podemos prohibirlo con " -"`#[deny(unsafe_op_in_unsafe_fn)]`. Prueba a añadirlo para ver qué ocurre." +"necesidad de un bloque `unsafe`. Podemos prohibirlo con " +"`#[deny(unsafe_op_in_unsafe_fn)]`. Prueba a añadirlo para ver qué ocurre. " +"Esto probablemente cambiará en una futura edición de Rust." #: src/unsafe-rust/unsafe-traits.md msgid "Implementing Unsafe Traits" @@ -12181,16 +12273,15 @@ msgid "" "/// The type must have a defined representation and no padding.\n" msgstr "" "/// ...\n" -"/// # Seguridad\n" -"/// El tipo debe tener una representación definida y no tener espacio de " -"relleno.\n" +"/// # SAFETY (SEGURO)\n" +"/// Seguro porque el tipo debe tener una representación definida y no tener " +"espacio de relleno.\n" #: src/unsafe-rust/unsafe-traits.md -#, fuzzy msgid "// SAFETY: `u32` has a defined representation and no padding.\n" msgstr "" -"// Es seguro porque u32 tiene una representación definida y no tiene espacio " -"de relleno.\n" +"// SEGURO: Es seguro porque u32 tiene una representación definida y no tiene " +"espacio de relleno.\n" #: src/unsafe-rust/unsafe-traits.md msgid "" @@ -12334,7 +12425,6 @@ msgstr "" "final `\\0`," #: src/unsafe-rust/exercise.md -#, fuzzy msgid "" "`&CStr` to `&[u8]`: a slice of bytes is the universal interface for \"some " "unknown data\"," @@ -12529,15 +12619,14 @@ msgid "Welcome to Rust in Android" msgstr "Te Damos la Bienvenida a Rust en Android" #: src/android.md -#, fuzzy msgid "" "Rust is supported for system software on Android. This means that you can " "write new services, libraries, drivers or even firmware in Rust (or improve " "existing code as needed)." msgstr "" "Rust es compatible con el desarrollo de plataformas nativas en Android. Esto " -"significa que puedes escribir nuevos servicios del sistema operativo en " -"Rust, así como ampliar los que ya existen." +"significa que puedes escribir nuevos servicios del sistema operativo en Rust " +"(o mejorar código existente." #: src/android.md msgid "" @@ -12592,13 +12681,12 @@ msgstr "" "metal-rust-in-android.html)" #: src/android/setup.md -#, fuzzy msgid "" "We will be using a Cuttlefish Android Virtual Device to test our code. Make " "sure you have access to one or create a new one with:" msgstr "" -"Utilizaremos un dispositivo Android virtual para probar el código. Asegúrate " -"de que tienes acceso a uno o créalo con:" +"Usaremos un Dispositivo Virtual Android Cuttlefish para probar nuestro " +"código. Asegúrate de tener acceso a uno o crea uno nuevo con:" #: src/android/setup.md msgid "" @@ -12750,29 +12838,11 @@ msgstr "" #: src/android/build-rules.md msgid "" -"Soong has many similarities to Bazel, which is the open-source variant of " -"Blaze (used in google3)." +"Soong has many similarities to [Bazel](https://bazel.build/), which is the " +"open-source variant of Blaze (used in google3)." msgstr "" -"Soong tiene muchas similitudes con Bazel, que es la variante de código " -"abierto de Blaze (se utiliza en google3)." - -#: src/android/build-rules.md -msgid "" -"There is a plan to transition [Android](https://source.android.com/docs/" -"setup/build/bazel/introduction), [ChromeOS](https://chromium.googlesource." -"com/chromiumos/bazel/), and [Fuchsia](https://source.android.com/docs/setup/" -"build/bazel/introduction) to Bazel." -msgstr "" -"Está previsto hacer la transición de [Android](https://source.android.com/" -"docs/setup/build/bazel/introduction), [ChromeOS](https://chromium." -"googlesource.com/chromiumos/bazel/) y [Fuchsia](https://source.android.com/" -"docs/setup/build/bazel/introduction) a Bazel." - -#: src/android/build-rules.md -msgid "Learning Bazel-like build rules is useful for all Rust OS developers." -msgstr "" -"Aprender reglas de compilación similares a Bazel es útil para todos los " -"desarrolladores del SO de Rust." +"Soong tiene muchas similitudes con [Bazel](https://bazel.build/), que es la " +"variante de código abierto de Blaze (se utiliza en google3)." #: src/android/build-rules.md msgid "Fun fact: Data from Star Trek is a Soong-type Android." @@ -12902,13 +12972,8 @@ msgid "/// Greet `name`.\n" msgstr "/// Saluda a `name`.\n" #: src/android/build-rules/library.md -#, fuzzy msgid "\"Hello {name}, it is very nice to meet you!\"" -msgstr "" -"```text\n" -"Hello Bob, it is very\n" -"nice to meet you!\n" -"```" +msgstr "\"Hola {name}. ¡Es un placer conocerte!\"" #: src/android/build-rules/library.md msgid "You build, push, and run the binary like before:" @@ -12953,6 +13018,9 @@ msgid "" "process of creating a Binder interface. We're then going to both implement " "the described service and write client code that talks to that service." msgstr "" +"Para ilustrar cómo usar Rust con Binder, vamos a recorrer el proceso de " +"creación de una interfaz Binder. Luego, implementaremos el servicio descrito " +"y escribiremos el código del cliente que se comunica con ese servicio." #: src/android/aidl/example-service/interface.md msgid "AIDL Interfaces" @@ -13003,45 +13071,58 @@ msgid "" "the package name used in the AIDL file, i.e. the package is `com.example." "birthdayservice` and the file is at `aidl/com/example/IBirthdayService.aidl`." msgstr "" +"Ten en cuenta que la estructura de directorios bajo el directorio `aidl/` " +"debe coincidir con el nombre del paquete utilizado en el archivo AIDL, es " +"decir, el paquete es `com.example.birthdayservice` y el archivo está en " +"`aidl/com/example/IBirthdayService.aidl`." #: src/android/aidl/example-service/service-bindings.md msgid "Generated Service API" -msgstr "" +msgstr "API del Servicio Generado" #: src/android/aidl/example-service/service-bindings.md msgid "" "Binder generates a trait corresponding to the interface definition. trait to " "talk to the service." msgstr "" +"Binder genera un trait correspondiente a la definición de la interfaz. El " +"trait no es necesario para comunicarse con el servicio." #: src/android/aidl/example-service/service-bindings.md -#, fuzzy msgid "_Generated trait_:" -msgstr "Rust generado:" +msgstr "_Trait generado_:" #: src/android/aidl/example-service/service-bindings.md msgid "" "Your service will need to implement this trait, and your client will use " "this trait to talk to the service." msgstr "" +"Tu servicio deberá implementar este trait, y tu cliente utilizará este rasgo " +"para comunicarse con el servicio." #: src/android/aidl/example-service/service-bindings.md msgid "" "The generated bindings can be found at `out/soong/.intermediates//`." msgstr "" +"Los bindings generados pueden ser encontrados en `out/soong/.intermediates/" +"/`." #: src/android/aidl/example-service/service-bindings.md msgid "" "Point out how the generated function signature, specifically the argument " "and return types, correspond the interface definition." msgstr "" +"Señala cómo la firma de la función generada, especificamente los tipos de " +"argumento y retorno, corresponde a la definición de la interfaz." #: src/android/aidl/example-service/service-bindings.md msgid "" "`String` for an argument results in a different Rust type than `String` as a " "return type." msgstr "" +"`String` para un argumento resulta en un tipo diferente en Rust que `String` " +"como el tipo de retorno." #: src/android/aidl/example-service/service.md msgid "Service Implementation" @@ -13057,15 +13138,14 @@ msgid "_birthday_service/src/lib.rs_:" msgstr "_birthday_service/src/lib.rs_:" #: src/android/aidl/example-service/service.md -#, fuzzy msgid "/// The `IBirthdayService` implementation.\n" -msgstr "/// Implementación del método HelloWorld::hello.\n" +msgstr "/// La implementación de `IBirthdayService`.\n" #: src/android/aidl/example-service/service.md #: src/android/aidl/example-service/changing-implementation.md #: src/android/aidl/types/file-descriptor.md msgid "\"Happy Birthday {name}, congratulations with the {years} years!\"" -msgstr "\"Feliz cumpleaños, {name}, te han caído {years} años\"." +msgstr "\"Feliz cumpleaños, {name}, te han caído {years} años\"" #: src/android/aidl/example-service/service.md #: src/android/aidl/example-service/server.md @@ -13101,12 +13181,16 @@ msgid "" "Point out the path to the generated `IBirthdayService` trait, and explain " "why each of the segments is necessary." msgstr "" +"Señala la ruta al trait generado `IBirthdayService` y explica por qué cada " +"uno de los segmentos es necesario." #: src/android/aidl/example-service/service.md msgid "" "TODO: What does the `binder::Interface` trait do? Are there methods to " "override? Where source?" msgstr "" +"TODO: ¿Qué hace el trait `binder::Interface? ¿Hay métodos que se puedan " +"sobreescribir? ¿Dónde está el fuente?" #: src/android/aidl/example-service/server.md msgid "AIDL Server" @@ -13153,10 +13237,16 @@ msgid "" "complicated than students are used to if they've used Binder from C++ or " "another language. Explain to students why each step is necessary." msgstr "" +"El proceso para tomar una implementación de servicio definida por el usuario " +"(en este caso `BirthdayService`, que implementa el `IBirthdayService`) y " +"comenzar a usarla como un servicio Binder tiene múltiples pasos, y puede " +"parecer más complicado de lo que los estudiantes están acostumbrados si han " +"utilizado Binder en C++ u otro lenguaje. Explica a los estudiantes por qué " +"cada paso es necesario." #: src/android/aidl/example-service/server.md msgid "Create an instance of your service type (`BirthdayService`)." -msgstr "" +msgstr "Crea una instancia de tu tipo de servicio (`BirthdayService`)." #: src/android/aidl/example-service/server.md msgid "" @@ -13166,18 +13256,28 @@ msgid "" "don't have inheritance in Rust, so instead we use composition, putting our " "`BirthdayService` within the generated `BnBinderService`." msgstr "" +"Envuelve el objeto del servicio en el tipo `Bn*` correspondiente " +"(`BnBirthdayService`en este caso). Este tipo es generado por Binder y " +"proporciona la funcionalidad común de Binder que sería provista por la clase " +"base `BnBinder` en C++. No tenemos herencia en Rust, así que en su lugar " +"usamos composición, colocando nuestro `BirthdayService`dentro del " +"`BnBinderService` generado." #: src/android/aidl/example-service/server.md msgid "" "Call `add_service`, giving it a service identifier and your service object " "(the `BnBirthdayService` object in the example)." msgstr "" +"Llama a `add_service`, proporcionándole un identificador de servicio y tu " +"objeto de servicio (el objeto `BnBirthdayService`en este ejemplo)." #: src/android/aidl/example-service/server.md msgid "" "Call `join_thread_pool` to add the current thread to Binder's thread pool " "and start listening for connections." msgstr "" +"Llama `join_thread_pool` para agregar el hilo actual al grupo de hilos de " +"Binder e iniciar la escucha de conexiones." #: src/android/aidl/example-service/deploy.md msgid "We can now build, push, and start the service:" @@ -13235,9 +13335,8 @@ msgstr "" "\"No se ha podido conectar con el servicio de felicitación de cumpleaños.\"" #: src/android/aidl/example-service/client.md -#, fuzzy msgid "// Call the service.\n" -msgstr "/// Llama al servicio de felicitación cumpleaños.\n" +msgstr "// Llama al servicio.\n" #: src/android/aidl/example-service/client.md msgid "\"{msg}\"" @@ -13280,6 +13379,8 @@ msgid "" "`Strong` is the trait object representing the service " "that the client has connected to." msgstr "" +"`Strong` es el objeto que representa el servicio al " +"que el cliente se ha conectado." #: src/android/aidl/example-service/client.md msgid "" @@ -13287,6 +13388,10 @@ msgid "" "process ref count for the service trait object, and the global Binder ref " "count that tracks how many processes have a reference to the object." msgstr "" +"`Strong` es un tipo de puntero inteligente para Binder. Maneja tanto un " +"conteo de referencias en el proceso para el trait object de servicio, como " +"el conteo de referencias global de Binder, que rastrea cuántos procesos " +"tienen una referencia a el objeto." #: src/android/aidl/example-service/client.md msgid "" @@ -13295,6 +13400,10 @@ msgid "" "interface, there is a single Rust trait generated that both client and " "server use." msgstr "" +"Ten en cuenta que el trait object que el cliente usa para comunicarse con el " +"servicio emplea exactamente el mismo trait que el servidor implementa. Para " +"una interfaz de Binder dada, se genera un único trait en Rust que tanto el " +"cliente como el servidor utilizan." #: src/android/aidl/example-service/client.md msgid "" @@ -13302,6 +13411,9 @@ msgid "" "should ideally be defined in a common crate that both the client and server " "can depend on." msgstr "" +"Utiliza el mismo identificador de servicio que se usó al registrar el " +"servicio. Esto debería definirse idealmente en un crate común del que tanto " +"el cliente como el servidor puedan depender." #: src/android/aidl/example-service/changing-definition.md msgid "" @@ -13314,6 +13426,8 @@ msgstr "" #: src/android/aidl/example-service/changing-definition.md msgid "This results in an updated trait definition for `IBirthdayService`:" msgstr "" +"Esto da como resultado una definición de trait actualizada para " +"`IBirthdayService`:" #: src/android/aidl/example-service/changing-definition.md msgid "" @@ -13321,147 +13435,153 @@ msgid "" "`&[String]` in Rust, i.e. that idiomatic Rust types are used in the " "generated bindings wherever possible:" msgstr "" +"Observa cómo el `String[]` en la definición de AIDL se traduce como un " +"`&[String]` en Rust, por ejemplo, se utilizan tipos idiomáticos en Rust en " +"los bindings generados siempre que sea posible:" #: src/android/aidl/example-service/changing-definition.md msgid "`in` array arguments are translated to slices." -msgstr "" +msgstr "Los argumentos de tipo `in` en arreglos se traduce a slices." #: src/android/aidl/example-service/changing-definition.md msgid "`out` and `inout` args are translated to `&mut Vec`." -msgstr "" +msgstr "Los argumentos `out` e `inout` se traducen a `&mut Vec`." #: src/android/aidl/example-service/changing-definition.md msgid "Return values are translated to returning a `Vec`." -msgstr "" +msgstr "Los valores de retorno se traducen a devolver un `Vec`." #: src/android/aidl/example-service/changing-implementation.md msgid "Updating Client and Service" -msgstr "" +msgstr "Actualizando Cliente y Servicio" #: src/android/aidl/example-service/changing-implementation.md msgid "Update the client and server code to account for the new API." msgstr "" +"Actualizando el cliente y el servidor para tener en cuenta la nuevo API." #: src/android/aidl/example-service/changing-implementation.md -#, fuzzy msgid "'\\n'" -msgstr "b'\\n'" +msgstr "'\\n'" #: src/android/aidl/example-service/changing-implementation.md msgid "\"Habby birfday to yuuuuu\"" -msgstr "" +msgstr "\"Feliz cumpleaños a tiiii\"" #: src/android/aidl/example-service/changing-implementation.md msgid "\"And also: many more\"" -msgstr "" +msgstr "\"Y también: muchos más.\"" #: src/android/aidl/example-service/changing-implementation.md msgid "" "TODO: Move code snippets into project files where they'll actually be built?" msgstr "" +"TODO: ¿Mover los fragmentos de código a archivos del proyecto donde " +"realmente se compilarán?" #: src/android/aidl/types.md msgid "Working With AIDL Types" -msgstr "" +msgstr "Trabajando con Tipos AIDL" #: src/android/aidl/types.md msgid "AIDL types translate into the appropriate idiomatic Rust type:" -msgstr "" +msgstr "Los tipos AIDL se traducen al tipo idiomático de Rust correspondiente:" #: src/android/aidl/types.md msgid "Primitive types map (mostly) to idiomatic Rust types." msgstr "" +"Los tipos primitivos se mapean (en su mayoría) a tipos idiomáticos de Rust." #: src/android/aidl/types.md msgid "Collection types like slices, `Vec`s and string types are supported." msgstr "" +"Los tipos de colección, como los slices, `Vec` y tipos de strings, son " +"compatibles." #: src/android/aidl/types.md msgid "" "References to AIDL objects and file handles can be sent between clients and " "services." msgstr "" +"Las referencias a objetos AIDL y file handles se pueden enviar entre " +"clientes y servicios." #: src/android/aidl/types.md msgid "File handles and parcelables are fully supported." -msgstr "" +msgstr "Los File Handles y los parcelables están completamente soportados." #: src/android/aidl/types/primitives.md msgid "Primitive types map (mostly) idiomatically:" -msgstr "" +msgstr "Los tipos primitivos se mapean (en su mayoría) de manera idiomática:" #: src/android/aidl/types/primitives.md -#, fuzzy msgid "AIDL Type" -msgstr "AIDL" +msgstr "Tipo de AIDL" #: src/android/aidl/types/primitives.md src/android/aidl/types/arrays.md #: src/android/interoperability/cpp/type-mapping.md -#, fuzzy msgid "Rust Type" -msgstr "Rust by Example" +msgstr "Tipo de Rust" #: src/android/aidl/types/primitives.md msgid "Note" -msgstr "" +msgstr "Notas" #: src/android/aidl/types/primitives.md -#, fuzzy msgid "`boolean`" -msgstr "`bool`" +msgstr "`boolean`" #: src/android/aidl/types/primitives.md msgid "`byte`" -msgstr "" +msgstr "`byte`" #: src/android/aidl/types/primitives.md msgid "`i8`" -msgstr "" +msgstr "`i8`" #: src/android/aidl/types/primitives.md -#, fuzzy msgid "Note that bytes are signed." -msgstr "// Un número mayor de 7 bytes no es válido.\n" +msgstr "Ten en cuenta que los bytes son con signo." #: src/android/aidl/types/primitives.md msgid "`u16`" -msgstr "" +msgstr "`u16`" #: src/android/aidl/types/primitives.md msgid "Note the usage of `u16`, NOT `u32`." -msgstr "" +msgstr "Observa el uso de `u16`, NO de `u32`." #: src/android/aidl/types/primitives.md msgid "`int`" -msgstr "" +msgstr "`int`" #: src/android/aidl/types/primitives.md msgid "`i32`" -msgstr "" +msgstr "`i32`" #: src/android/aidl/types/primitives.md msgid "`long`" -msgstr "" +msgstr "`long`" #: src/android/aidl/types/primitives.md msgid "`i64`" -msgstr "" +msgstr "`i64`" #: src/android/aidl/types/primitives.md msgid "`float`" -msgstr "" +msgstr "`float`" #: src/android/aidl/types/primitives.md msgid "`f32`" -msgstr "" +msgstr "`f32`" #: src/android/aidl/types/primitives.md msgid "`double`" -msgstr "" +msgstr "`double`" #: src/android/aidl/types/primitives.md msgid "`f64`" -msgstr "" +msgstr "`f64`" #: src/android/aidl/types/arrays.md msgid "" @@ -13469,33 +13589,33 @@ msgid "" "appropriate Rust array type depending on how they are used in the function " "signature:" msgstr "" +"Los tipos de arreglos (`T[]`, `byte[]`, y `List`) se traducen al tipo de " +"arreglo correspondiente en Rust, dependiendo de cómo se utilicen en la firma " +"de la función:" #: src/android/aidl/types/arrays.md -#, fuzzy msgid "Position" -msgstr "Descripción" +msgstr "Posición" #: src/android/aidl/types/arrays.md msgid "`in` argument" -msgstr "" +msgstr "argumentos `in`" #: src/android/aidl/types/arrays.md -#, fuzzy msgid "`&[T]`" -msgstr "Slices: `&[T]`" +msgstr "`&[T]`" #: src/android/aidl/types/arrays.md msgid "`out`/`inout` argument" -msgstr "" +msgstr "argumentos `out`/`inout`" #: src/android/aidl/types/arrays.md -#, fuzzy msgid "`&mut Vec`" -msgstr "`Vec`" +msgstr "`&mut Vec`" #: src/android/aidl/types/arrays.md msgid "Return" -msgstr "" +msgstr "Return" #: src/android/aidl/types/arrays.md #: src/android/interoperability/cpp/type-mapping.md @@ -13506,126 +13626,129 @@ msgstr "`Vec`" msgid "" "In Android 13 or higher, fixed-size arrays are supported, i.e. `T[N]` " "becomes `[T; N]`. Fixed-size arrays can have multiple dimensions (e.g. " -"int\\[3\\]\\[4\\]). In the Java backend, fixed-size arrays are represented " -"as array types." +"`int[3][4]`). In the Java backend, fixed-size arrays are represented as " +"array types." msgstr "" +"En Android 13 o superior, se admiten los arreglos de tamaño fijo, es decir, " +"`T[N]` se convierte en `[T; N]`. Los arreglos de tamaño fijo pueden tener " +"múltiples dimensiones (por ejemplo, `int[3][4]`). En el backend de Java, los " +"arreglos de tamaño fijo se representan como tipos de arreglo." #: src/android/aidl/types/arrays.md msgid "Arrays in parcelable fields always get translated to `Vec`." -msgstr "" +msgstr "Los arreglos en campos parcelables siempre se traducen a `Vec`." #: src/android/aidl/types/objects.md msgid "" "AIDL objects can be sent either as a concrete AIDL type or as the type-" "erased `IBinder` interface:" -msgstr "" +msgstr "w" #: src/android/aidl/types/objects.md -#, fuzzy msgid "" "**birthday_service/aidl/com/example/birthdayservice/IBirthdayInfoProvider." "aidl**:" msgstr "" -"_birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl_:" +"**birthday_service/aidl/com/example/birthdayservice/IBirthdayInfoProvider." +"aidl**:" #: src/android/aidl/types/objects.md src/android/aidl/types/parcelables.md #: src/android/aidl/types/file-descriptor.md -#, fuzzy msgid "" "**birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl**:" msgstr "" -"_birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl_:" +"**birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl**:" #: src/android/aidl/types/objects.md msgid "/** The same thing, but using a binder object. */" -msgstr "" +msgstr "/** Lo mismo, pero utilizando un objeto binder. */" #: src/android/aidl/types/objects.md msgid "/** The same thing, but using `IBinder`. */" -msgstr "" +msgstr "/** Lo mismo, pero utilizando `IBinder`. */" #: src/android/aidl/types/objects.md src/android/aidl/types/parcelables.md #: src/android/aidl/types/file-descriptor.md -#, fuzzy msgid "**birthday_service/src/client.rs**:" -msgstr "_birthday_service/src/client.rs_:" +msgstr "**birthday_service/src/client.rs**:" #: src/android/aidl/types/objects.md -#, fuzzy msgid "/// Rust struct implementing the `IBirthdayInfoProvider` interface.\n" -msgstr "//! Implementación de la interfaz de AIDL de `IBirthdayService`.\n" +msgstr "" +"/// Estructura de Rust que implementa la interfaz `IBirthdayInfoProvider`.\n" #: src/android/aidl/types/objects.md -#, fuzzy msgid "// Create a binder object for the `IBirthdayInfoProvider` interface.\n" -msgstr "//! Implementación de la interfaz de AIDL de `IBirthdayService`.\n" +msgstr "// Crea un objeto binder para la interfaz `IBirthdayInfoProvider`.\n" #: src/android/aidl/types/objects.md -#, fuzzy msgid "// Send the binder object to the service.\n" -msgstr "/// Llama al servicio de felicitación cumpleaños.\n" +msgstr "// Envía el objeto binder al servicio.\n" #: src/android/aidl/types/objects.md msgid "" "// Perform the same operation but passing the provider as an `SpIBinder`.\n" msgstr "" +"// Realiza la misma operación pero pasando el proveedor como un " +"`SpIBinder`.\n" #: src/android/aidl/types/objects.md msgid "" "Note the usage of `BnBirthdayInfoProvider`. This serves the same purpose as " "`BnBirthdayService` that we saw previously." msgstr "" +"Observa el uso de `BnBirthdayInfoProvider`. Esto cumple la misma función que " +"`BnBirthdayService` que vimos anteriormente." #: src/android/aidl/types/parcelables.md msgid "Binder for Rust supports sending parcelables directly:" -msgstr "" +msgstr "Binder para Rust admite enviar parcelables directamente:" #: src/android/aidl/types/parcelables.md -#, fuzzy msgid "" "**birthday_service/aidl/com/example/birthdayservice/BirthdayInfo.aidl**:" msgstr "" -"_birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl_:" +"**birthday_service/aidl/com/example/birthdayservice/BirthdayInfo.aidl**:" #: src/android/aidl/types/parcelables.md msgid "/** The same thing, but with a parcelable. */" -msgstr "" +msgstr "/** Lo mismo, pero con un parcelable. */" #: src/android/aidl/types/file-descriptor.md msgid "" "Files can be sent between Binder clients/servers using the " "`ParcelFileDescriptor` type:" msgstr "" +"Los archivos pueden enviarse entre clientes/servidores de Binder utilizando " +"el tipo `ParcelFileDescriptor`:" #: src/android/aidl/types/file-descriptor.md msgid "/** The same thing, but loads info from a file. */" -msgstr "" +msgstr "/** Lo mismo, pero carga la información desde un archivo. */" #: src/android/aidl/types/file-descriptor.md msgid "// Open a file and put the birthday info in it.\n" -msgstr "" +msgstr "// Abre un archivo y coloca la información de cumpleaños en él.\n" #: src/android/aidl/types/file-descriptor.md msgid "\"/data/local/tmp/birthday.info\"" -msgstr "" +msgstr "\"/data/local/tmp/birthday.info\"" #: src/android/aidl/types/file-descriptor.md -#, fuzzy msgid "\"{name}\"" -msgstr "\"Hola {name}\"" +msgstr "\"{name}\"" #: src/android/aidl/types/file-descriptor.md msgid "\"{years}\"" -msgstr "" +msgstr "\"{years}\"" #: src/android/aidl/types/file-descriptor.md msgid "// Create a `ParcelFileDescriptor` from the file and send it.\n" -msgstr "" +msgstr "// Crea un `ParcelFileDescriptor` a partir del archivo y envíalo.\n" #: src/android/aidl/types/file-descriptor.md -#, fuzzy msgid "**birthday_service/src/lib.rs**:" -msgstr "_birthday_service/src/lib.rs_:" +msgstr "**birthday_service/src/lib.rs**:" #: src/android/aidl/types/file-descriptor.md msgid "" @@ -13634,11 +13757,14 @@ msgid "" "`File`\n" " // object.\n" msgstr "" +"// Convierte el file descriptor a un `File`. `ParcelFileDescriptor` " +"envuelve\n" +"// un `OwnedFd`, que puede ser clonado y luego utilizado para crear un " +"objeto `File`.\n" #: src/android/aidl/types/file-descriptor.md -#, fuzzy msgid "\"Invalid file handle\"" -msgstr "\"Longitud no válida\"" +msgstr "\"File handle invalido\"" #: src/android/aidl/types/file-descriptor.md msgid "" @@ -13646,89 +13772,86 @@ msgid "" "`File` (or any other type that wraps an `OwnedFd`), and can be used to " "create a new `File` handle on the other side." msgstr "" +"`ParcelFileDescriptor` envuelve un `OwnedFd`, por lo que se puede crear a " +"partir de un `File` (o cualquier otro tipo que envuelva un `OwnedFd`), y " +"puede utilizarse para crear un nuevo handle de `File` en el otro lado." #: src/android/aidl/types/file-descriptor.md msgid "" "Other types of file descriptors can be wrapped and sent, e.g. TCP, UDP, and " "UNIX sockets." msgstr "" +"Se pueden envolver y enviar otros tipos de file descriptors, como sockets " +"TCP, UDP y UNIX." #: src/android/testing.md -#, fuzzy msgid "Testing in Android" -msgstr "Rust en Android" +msgstr "Testing en Android" #: src/android/testing.md msgid "" "Building on [Testing](../testing.md), we will now look at how unit tests " "work in AOSP. Use the `rust_test` module for your unit tests:" msgstr "" +"Basándonos en [Testing](../testing.md), ahora veremos cómo funcionan las " +"pruebas unitarias en AOSP. Usa el módulo `rust_test` para tus pruebas " +"unitarias:" #: src/android/testing.md -#, fuzzy msgid "_testing/Android.bp_:" -msgstr "_hello_rust/Android.bp_:" +msgstr "_testing/Android.bp_:" #: src/android/testing.md -#, fuzzy msgid "\"libleftpad\"" -msgstr "\"libtextwrap\"" +msgstr "\"libleftpad\"" #: src/android/testing.md msgid "\"leftpad\"" -msgstr "" +msgstr "\"leftpad\"" #: src/android/testing.md -#, fuzzy msgid "\"libleftpad_test\"" -msgstr "\"libbirthday_bindgen_test\"" +msgstr "\"libleftpad_test\"" #: src/android/testing.md msgid "\"leftpad_test\"" -msgstr "" +msgstr "\"leftpad_test\"" #: src/android/testing.md src/android/interoperability/with-c/bindgen.md msgid "\"general-tests\"" msgstr "\"general-tests\"" #: src/android/testing.md -#, fuzzy msgid "_testing/src/lib.rs_:" -msgstr "_hello_rust/src/lib.rs_:" +msgstr "_testing/src/lib.rs_:" #: src/android/testing.md -#, fuzzy msgid "//! Left-padding library.\n" -msgstr "//! Biblioteca de saludos.\n" +msgstr "//! Biblioteca de relleno a la izquierda.\n" #: src/android/testing.md msgid "/// Left-pad `s` to `width`.\n" -msgstr "" +msgstr "/// Rellena a la izquierda `s` hasta alcanzar el ancho `width`.\n" #: src/android/testing.md -#, fuzzy msgid "\"{s:>width$}\"" -msgstr "\"|{:^width$}|\"" +msgstr "\"{s:>width$}\"" #: src/android/testing.md -#, fuzzy msgid "\" foo\"" -msgstr "\"foo\"" +msgstr "\" foo\"" #: src/android/testing.md -#, fuzzy msgid "\"foobar\"" -msgstr "\"foo\"" +msgstr "\"foobar\"" #: src/android/testing.md -#, fuzzy msgid "You can now run the test with" -msgstr "Ahora puedes generar automáticamente los enlaces:" +msgstr "Ahora puedes ejecutar la prueba con:" #: src/android/testing.md -#, fuzzy msgid "The output looks like this:" -msgstr "El enfoque general es el siguiente:" +msgstr "La salida se ve así:" #: src/android/testing.md msgid "" @@ -13743,21 +13866,32 @@ msgid "" "Test cases: finished with 2 passing and 0 failing out of 2 test cases\n" "```" msgstr "" +"```text\n" +"INFO: Elapsed time: 2.666s, Critical Path: 2.40s\n" +"INFO: 3 processes: 2 internal, 1 linux-sandbox.\n" +"INFO: Build completed successfully, 3 total actions\n" +"//comprehensive-rust-android/testing:libleftpad_test_host PASSED " +"in 2.3s\n" +" PASSED libleftpad_test.tests::long_string (0.0s)\n" +" PASSED libleftpad_test.tests::short_string (0.0s)\n" +"Test cases: finished with 2 passing and 0 failing out of 2 test cases\n" +"```" #: src/android/testing.md msgid "" "Notice how you only mention the root of the library crate. Tests are found " "recursively in nested modules." msgstr "" +"Observa cómo solo mencionas la raíz del crate de la biblioteca. Las pruebas " +"se encuentran de manera recursiva en los módulos anidados." #: src/android/testing/googletest.md -#, fuzzy msgid "" "The [GoogleTest](https://docs.rs/googletest/) crate allows for flexible test " "assertions using _matchers_:" msgstr "" -"[googletest](https://docs.rs/googletest): biblioteca completa de aserción de " -"pruebas en la tradición de GoogleTest para C++." +"El crate [GoogleTest](https://docs.rs/googletest/) permite aserciones de " +"prueba flexibles utilizando _matchers_:" #: src/android/testing/googletest.md msgid "\"baz\"" @@ -13798,20 +13932,25 @@ msgstr "" msgid "" "This just scratches the surface, there are many builtin matchers. Consider " "going through the first chapter of [\"Advanced testing for Rust " -"applications\"](https://github.com/mainmatter/rust-advanced-testing-" -"workshop), a self-guided Rust course: it provides a guided introduction to " -"the library, with exercises to help you get comfortable with `googletest` " -"macros, its matchers and its overall philosophy." -msgstr "" +"applications\"](https://rust-exercises.com/advanced-testing/), a self-guided " +"Rust course: it provides a guided introduction to the library, with " +"exercises to help you get comfortable with `googletest` macros, its matchers " +"and its overall philosophy." +msgstr "" +"Esto solo es una introducción superficial, hay muchos *matchers* integrados. " +"Considera revisar el primer capítulo de [\"Pruebas avanzadas para " +"aplicaciones en Rust\"](https://rust-exercises.com/advanced-testing/), un " +"curso autodirigido de Rust: ofrece una introducción guiada a la biblioteca, " +"con ejercicios para ayudarte a familiarizarte con los macros de " +"`googletest`, sus *matchers* y su filosofía general." #: src/android/testing/googletest.md -#, fuzzy msgid "" "A particularly nice feature is that mismatches in multi-line strings are " "shown as a diff:" msgstr "" -"Una característica muy interesante es que las discrepancias en las cadenas " -"que contienen varias líneas se muestran como un diff:" +"Una característica particularmente útil es que las discrepancias en cadenas " +"de múltiples líneas se muestran como un diff:" #: src/android/testing/googletest.md msgid "" @@ -13856,7 +13995,6 @@ msgstr "" "podrás hacer simulaciones:" #: src/android/testing/mocking.md -#, fuzzy msgid "" "Mockall is the recommended mocking library in Android (AOSP). There are " "other [mocking libraries available on crates.io](https://crates.io/keywords/" @@ -14016,6 +14154,15 @@ msgstr "" msgid "The logs show up in `adb logcat`:" msgstr "Los registros se muestran en `adb logcat`:" +#: src/android/logging.md +msgid "" +"The logger implementation in `liblogger` is only needed in the final binary, " +"if you're logging from a library you only need the `log` facade crate." +msgstr "" +"La implementación del logger en `liblogger` solo es necesaria en el binario " +"final. Si estás registrando desde una biblioteca, solo necesitas el paquete " +"fachada `log`." + #: src/android/interoperability.md msgid "" "Rust has excellent support for interoperability with other languages. This " @@ -14058,7 +14205,7 @@ msgstr "Si quieres, puedes hacerlo de forma manual:" #: src/android/interoperability/with-c.md msgid "// SAFETY: `abs` doesn't have any safety requirements.\n" -msgstr "" +msgstr "// SEGURO: Es seguro porque `abs` no tiene requisitos de seguridad.\n" #: src/android/interoperability/with-c.md msgid "\"{x}, {abs_x}\"" @@ -14066,11 +14213,11 @@ msgstr "\"{x}, {abs_x}\"" #: src/android/interoperability/with-c.md msgid "" -"We already saw this in the [Safe FFI Wrapper exercise](../../exercises/day-3/" -"safe-ffi-wrapper.md)." +"We already saw this in the [Safe FFI Wrapper exercise](../../unsafe-rust/" +"exercise.md)." msgstr "" -"Ya lo hemos visto en el ejercicio [Envoltorio de FFI seguro](../../exercises/" -"day-3/safe-ffi-wrapper.md)." +"Ya lo hemos visto en el ejercicio [Envoltorio de FFI seguro](../../unsafe-" +"rust/exercise.md)." #: src/android/interoperability/with-c.md msgid "" @@ -14206,6 +14353,12 @@ msgid "" "later\n" " // after it returns.\n" msgstr "" +"// SEGURO: Es seguro porque el puntero que estamos pasando es válido porque " +"proviene de una referencia de Rust \n" +" // y el `name` que contiene se refiere al `name` que se encuentra " +"arriba, que también permanece válido. \n" +" // `print_card` no almacena ninguno de los punteros para utilizarlos más " +"tarde después de que regrese.\n" #: src/android/interoperability/with-c/bindgen.md msgid "" @@ -14318,7 +14471,6 @@ msgid "\"main.c\"" msgstr "\"main.c\"" #: src/android/interoperability/with-c/rust.md -#, fuzzy msgid "" "```shell\n" "m analyze_numbers\n" @@ -14452,9 +14604,8 @@ msgid "// Method on `MyType`\n" msgstr "// Método en `MyType`\n" #: src/android/interoperability/cpp/rust-bridge.md -#, fuzzy msgid "// Free function\n" -msgstr "Funciones" +msgstr "// Función\n" #: src/android/interoperability/cpp/rust-bridge.md msgid "" @@ -14624,14 +14775,12 @@ msgstr "" "se genera mediante una función `noexcept`de C++." #: src/android/interoperability/cpp/type-mapping.md -#, fuzzy msgid "C++ Type" -msgstr "Ejemplo en C++" +msgstr "Tipo de C++" #: src/android/interoperability/cpp/type-mapping.md -#, fuzzy msgid "`rust::String`" -msgstr "`std::string`" +msgstr "`rust::String`" #: src/android/interoperability/cpp/type-mapping.md msgid "`&str`" @@ -14723,9 +14872,8 @@ msgstr "" #: src/android/interoperability/cpp/android-build-cpp.md #: src/android/interoperability/cpp/android-cpp-genrules.md #: src/android/interoperability/cpp/android-build-rust.md -#, fuzzy msgid "Building in Android" -msgstr "Rust en Android" +msgstr "Construyendo en Android" #: src/android/interoperability/cpp/android-build-cpp.md msgid "" @@ -14924,7 +15072,6 @@ msgid "\"libjni\"" msgstr "\"libjni\"" #: src/android/interoperability/java.md -#, fuzzy msgid "We then call this function from Java:" msgstr "Por último, podemos llamar a esta función desde Java:" @@ -15047,7 +15194,6 @@ msgstr "" "preocupes, podrás ponerte al día en la siguiente clase." #: src/chromium/cargo.md -#, fuzzy msgid "" "The Rust community typically uses `cargo` and libraries from [crates.io]" "(https://crates.io/). Chromium is built using `gn` and `ninja` and a curated " @@ -15263,7 +15409,6 @@ msgstr "" "archivos de configuración." #: src/chromium/cargo.md -#, fuzzy msgid "" "Disclaimer: a unique reason for using `cargo` was unavailability of `gn` " "when building and bootstrapping Rust standard library when building Rust " @@ -15271,10 +15416,9 @@ msgid "" msgstr "" "Aclaración: una razón principal para usar `cargo` es que `gn` no está " "disponible al compilar e iniciar la biblioteca estándar de Rust cuando se " -"compila su cadena de herramientas." +"compila." #: src/chromium/cargo.md -#, fuzzy msgid "" "`run_gnrt.py` uses Chromium's copy of `cargo` and `rustc`. `gnrt` depends on " "third-party libraries downloaded from the internet, but `run_gnrt.py` asks " @@ -15712,13 +15856,12 @@ msgstr "" "vscode. Enlaces típicos de vim/CoC = espacio o)." #: src/chromium/build-rules/vscode.md -#, fuzzy msgid "" "Demo **type annotations** (there are quite a few nice examples in the " "`QrCode::with_bits` method)" msgstr "" -"Demo **anotaciones de tipos** (hay varios ejemplos en el método `QrCode::" -"with_bits`)." +"Demo **anotaciones de tipos** (hay varios ejemplos interesantes en el método " +"`QrCode::with_bits`)." #: src/chromium/build-rules/vscode.md msgid "" @@ -15743,7 +15886,6 @@ msgstr "" "`//ui/base/build.gn` que contenga lo siguiente:" #: src/exercises/chromium/build-rules.md -#, fuzzy msgid "" "**Important**: note that `no_mangle` here is considered a type of unsafety " "by the Rust compiler, so you'll need to allow unsafe code in your `gn` " @@ -16328,13 +16470,12 @@ msgstr "" "`#include`d en el código C++ generado para ayudar a los compiladores de C++." #: src/chromium/interoperability-with-cpp/limitations-of-cxx.md -#, fuzzy msgid "" "By far the most useful page when using CXX is the [type reference](https://" "cxx.rs/bindings.html)." msgstr "" -"Muestra la correspondencia entre [los tipos de Rust y C++](https://cxx.rs/" -"bindings.html):" +"Sin duda, la página más útil al usar CXX es la [referencia de tipos](https://" +"cxx.rs/bindings.html)." #: src/chromium/interoperability-with-cpp/limitations-of-cxx.md msgid "CXX fundamentally suits cases where:" @@ -16522,9 +16663,8 @@ msgstr "" "autorreferencia." #: src/chromium/interoperability-with-cpp/error-handling-png.md -#, fuzzy msgid "CXX Error Handling: PNG Example" -msgstr "Manejo de Errores" +msgstr "Manejo de errores CXX: Ejemplo de PNG" #: src/chromium/interoperability-with-cpp/error-handling-png.md msgid "" @@ -16674,7 +16814,7 @@ msgid "" "previous section." msgstr "" "La respuesta exacta se encuentra en el diagrama de la parte superior de " -"[esta página](../Interop-with-cpp.md): en segundo plano, CXX genera " +"[esta página](../interoperability-with-cpp.md): en segundo plano, CXX genera " "funciones de Rust `unsafe` y `extern \"C\"`, igual que hicimos de forma " "manual en la sección anterior." @@ -16832,11 +16972,8 @@ msgstr "" "cómo definirías esa interfaz." #: src/exercises/chromium/interoperability-with-cpp.md -#, fuzzy msgid "The [`cxx` binding reference](https://cxx.rs/bindings.html)" -msgstr "" -"Muestra la correspondencia entre [los tipos de Rust y C++](https://cxx.rs/" -"bindings.html):" +msgstr "La [referencia de bindings de `cxx`](https://cxx.rs/bindings.html)" #: src/exercises/chromium/interoperability-with-cpp.md msgid "" @@ -17585,9 +17722,8 @@ msgid "The total crates needed are:" msgstr "Estos son los crates que se necesitan:" #: src/exercises/chromium/third-party.md -#, fuzzy msgid "`instant`," -msgstr "Por ejemplo:" +msgstr "`instant`," #: src/exercises/chromium/third-party.md msgid "`lock_api`," @@ -17825,7 +17961,6 @@ msgid "Some useful crates for bare-metal Rust development." msgstr "Algunos crates útiles para el desarrollo de Rust bare-metal." #: src/bare-metal.md -#, fuzzy msgid "" "For the microcontroller part of the course we will use the [BBC micro:bit]" "(https://microbit.org/) v2 as an example. It's a [development board](https://" @@ -18002,11 +18137,10 @@ msgstr "" "(https://doc.rust-lang.org/stable/std/alloc/trait.GlobalAlloc.html)." #: src/bare-metal/alloc.md -#, fuzzy msgid "// SAFETY: `HEAP` is only used here and `entry` is only called once.\n" msgstr "" -"// Es seguro porque `HEAP` solo se usa aquí y solo se llama una vez a " -"`entry`.\n" +"// SEGURO: Es seguro porque `HEAP` solo se usa aquí y solo se llama una vez " +"a `entry`.\n" #: src/bare-metal/alloc.md msgid "// Give the allocator some memory to allocate.\n" @@ -18019,9 +18153,8 @@ msgstr "" "montículo.\n" #: src/bare-metal/alloc.md -#, fuzzy msgid "\"A string\"" -msgstr "String" +msgstr "\"Un string\"" #: src/bare-metal/alloc.md msgid "" @@ -18122,12 +18255,11 @@ msgid "// Configure GPIO 0 pins 21 and 28 as push-pull outputs.\n" msgstr "// Configura los pines 21 y 28 de GPIO 0 como salidas push-pull.\n" #: src/bare-metal/microcontrollers/mmio.md -#, fuzzy msgid "" "// SAFETY: The pointers are to valid peripheral control registers, and no\n" " // aliases exist.\n" msgstr "" -"// Es seguro porque los punteros dirigen a registros de control de " +"// SEGURO: Es seguro porque los punteros dirigen a registros de control de " "periféricos válidos y\n" " // no existe ningún alias.\n" @@ -18328,7 +18460,6 @@ msgid "Many HAL crates follow this pattern." msgstr "Muchos crates HAL siguen este patrón." #: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy msgid "" "The [`embedded-hal`](https://crates.io/crates/embedded-hal) crate provides a " "number of traits covering common microcontroller peripherals:" @@ -18343,15 +18474,15 @@ msgstr "GPIO" #: src/bare-metal/microcontrollers/embedded-hal.md msgid "PWM" -msgstr "" +msgstr "PWM" #: src/bare-metal/microcontrollers/embedded-hal.md msgid "Delay timers" -msgstr "" +msgstr "Temporizadores de retardo" #: src/bare-metal/microcontrollers/embedded-hal.md msgid "I2C and SPI buses and devices" -msgstr "" +msgstr "Buses y dispositivos I2C y SPI" #: src/bare-metal/microcontrollers/embedded-hal.md msgid "" @@ -18360,9 +18491,12 @@ msgid "" "can`](https://crates.io/crates/embedded-can) and [`rand_core`](https://" "crates.io/crates/rand_core) respectively." msgstr "" +"Traits similares para flujos de bytes (por ejemplo, UART), buses CAN y RNG " +"se han desglosado en [`embedded-io`](https://crates.io/crates/embedded-io), " +"[`embedded-can`](https://crates.io/crates/embedded-can) y [`rand_core`]" +"(https://crates.io/crates/rand_core), respectivamente." #: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy msgid "" "Other crates then implement [drivers](https://github.com/rust-embedded/" "awesome-embedded-rust#driver-crates) in terms of these traits, e.g. an " @@ -18379,6 +18513,9 @@ msgid "" "them, as initialisation and configuration is usually highly platform-" "specific." msgstr "" +"Los traits cubren el uso de los periféricos, pero no la inicialización o " +"configuración de los mismos, ya que la inicialización y configuración suele " +"ser altamente específica de la plataforma." #: src/bare-metal/microcontrollers/embedded-hal.md msgid "" @@ -18389,25 +18526,22 @@ msgstr "" "plataformas como Linux en Raspberry Pi." #: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy msgid "" "[`embedded-hal-async`](https://crates.io/crates/embedded-hal-async) provides " "async versions of the traits." msgstr "" -"El crate [`embedded-hal`](https://crates.io/crates/embedded-hal) proporciona " -"una serie de traits que cubren los periféricos habituales de los " -"microcontroladores." +"[`embedded-hal-async`](https://crates.io/crates/embedded-hal-async) " +"proporciona versiones asíncronas de los traits." #: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy msgid "" "[`embedded-hal-nb`](https://crates.io/crates/embedded-hal-nb) provides " "another approach to non-blocking I/O, based on the [`nb`](https://crates.io/" "crates/nb) crate." msgstr "" -"El crate [`embedded-hal`](https://crates.io/crates/embedded-hal) proporciona " -"una serie de traits que cubren los periféricos habituales de los " -"microcontroladores." +"[`embedded-hal-nb`](https://crates.io/crates/embedded-hal-nb) proporciona " +"otro enfoque para la E/S no bloqueante, basado en el crate [`nb`](https://" +"crates.io/crates/nb)." #: src/bare-metal/microcontrollers/probe-rs.md msgid "" @@ -18418,10 +18552,10 @@ msgstr "" "integradas muy útil, como OpenOCD, pero mejor integrado." #: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy msgid "" "SWD (Serial Wire Debug) and JTAG via CMSIS-DAP, ST-Link and J-Link probes" -msgstr " y JTAG a través de comprobaciones CMSIS-DAP, ST-Link y J-Link" +msgstr "" +"SWD (Serial Wire Debug) y JTAG a través de CMSIS-DAP, ST-Link y J-Link." #: src/bare-metal/microcontrollers/probe-rs.md msgid "GDB stub and Microsoft DAP (Debug Adapter Protocol) server" @@ -18434,14 +18568,15 @@ msgid "Cargo integration" msgstr "Integración de Cargo" #: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy msgid "" "`cargo-embed` is a cargo subcommand to build and flash binaries, log RTT " "(Real Time Transfers) output and connect GDB. It's configured by an `Embed." "toml` file in your project directory." msgstr "" -" y conectar GDB. Se configura mediante un archivo `Embed.toml` en el " -"directorio del proyecto." +"`cargo-embed` es un subcomando de cargo para compilar y flashear binarios, " +"registrar la salida de RTT (Transferencias en Tiempo Real) y conectar GDB. " +"Se configura mediante un archivo `Embed.toml` en el directorio de tu " +"proyecto." #: src/bare-metal/microcontrollers/probe-rs.md msgid "" @@ -18503,9 +18638,8 @@ msgstr "" "circulares." #: src/bare-metal/microcontrollers/debugging.md -#, fuzzy msgid "_Embed.toml_:" -msgstr "Embed.toml:" +msgstr "_Embed.toml_:" #: src/bare-metal/microcontrollers/debugging.md msgid "In one terminal under `src/bare-metal/microcontrollers/examples/`:" @@ -18678,16 +18812,14 @@ msgstr "" "TWIM." #: src/exercises/bare-metal/compass.md -#, fuzzy msgid "" "The LSM303AGR driver needs something implementing the `embedded_hal::i2c::" "I2c` trait. The [`microbit::hal::Twim`](https://docs.rs/microbit-v2/latest/" "microbit/hal/struct.Twim.html) struct implements this." msgstr "" "El controlador LSM303AGR necesita algo que implemente el trait " -"`embedded_hal::blocking::i2c::WriteRead`. La estructura [`microbit::hal::" -"Twim`](https://docs.rs/microbit-v2/latest/microbit/hal/struct.Twim.html) " -"implementa esto." +"`embedded_hal::i2c::I2c`. La estructura [`microbit::hal::Twim`](https://docs." +"rs/microbit-v2/latest/microbit/hal/struct.Twim.html) implementa esto." #: src/exercises/bare-metal/compass.md msgid "" @@ -18717,24 +18849,20 @@ msgstr "" "y busca los siguientes archivos en el directorio `compass`." #: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md -#, fuzzy msgid "_src/main.rs_:" -msgstr "`src/main.rs`:" +msgstr "_src/main.rs_:" #: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md -#, fuzzy msgid "_Cargo.toml_ (you shouldn't need to change this):" -msgstr "`Cargo.toml` (no debería ser necesario cambiarlo):" +msgstr "_Cargo.toml_ (no debería ser necesario cambiarlo):" #: src/exercises/bare-metal/compass.md -#, fuzzy msgid "_Embed.toml_ (you shouldn't need to change this):" -msgstr "`Embed.toml` (no debería ser necesario cambiarlo):" +msgstr "_Embed.toml_ (no debería ser necesario cambiarlo):" #: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md -#, fuzzy msgid "_.cargo/config.toml_ (you shouldn't need to change this):" -msgstr "`.cargo/config.toml` (no debería ser necesario cambiarlo):" +msgstr "_.cargo/config.toml_ (no debería ser necesario cambiarlo):" #: src/exercises/bare-metal/compass.md msgid "See the serial output on Linux with:" @@ -19096,22 +19224,21 @@ msgid "Inline assembly" msgstr "Ensamblaje integrado" #: src/bare-metal/aps/inline-assembly.md -#, fuzzy msgid "" "Sometimes we need to use assembly to do things that aren't possible with " "Rust code. For example, to make an HVC (hypervisor call) to tell the " "firmware to power off the system:" msgstr "" "A veces necesitamos usar el ensamblador para hacer cosas que no son posibles " -"con código Rust. Por ejemplo, hacer un " +"con código Rust. Por ejemplo, para hacer una HVC (llamada al hipervisor) y " +"decirle al firmware que apague el sistema:" #: src/bare-metal/aps/inline-assembly.md -#, fuzzy msgid "" "// SAFETY: this only uses the declared registers and doesn't do anything\n" " // with memory.\n" msgstr "" -"// Es seguro porque solo utiliza los registros declarados y no\n" +"// SEGURO: Es seguro porque solo utiliza los registros declarados y no\n" " // hace nada con la memoria.\n" #: src/bare-metal/aps/inline-assembly.md @@ -19322,12 +19449,12 @@ msgid "// Wait until there is room in the TX buffer.\n" msgstr "// Espera hasta que haya espacio en el búfer de TX.\n" #: src/bare-metal/aps/uart.md -#, fuzzy msgid "" "// SAFETY: We know that the base address points to the control\n" " // registers of a PL011 device which is appropriately mapped.\n" msgstr "" -"// Es seguro porque sabemos que la dirección base apunta a los registros\n" +"// SEGURO: Es seguro porque sabemos que la dirección base apunta a los " +"registros\n" " // de control de un dispositivo PL011 que está asignado " "correctamente.\n" @@ -19389,12 +19516,12 @@ msgstr "" "traits más." #: src/bare-metal/aps/uart/traits.md -#, fuzzy msgid "" "// SAFETY: `Uart` just contains a pointer to device memory, which can be\n" "// accessed from any context.\n" msgstr "" -"// Es seguro porque solo contiene un puntero a la memoria del dispositivo,\n" +"// SEGURO: Es seguro porque solo `Uart` contiene un puntero a la memoria del " +"dispositivo,\n" "// a la que se puede acceder desde cualquier contexto.\n" #: src/bare-metal/aps/uart/traits.md @@ -19684,14 +19811,13 @@ msgid "/// Driver for a PL011 UART.\n" msgstr "/// Controlador para un UART PL011.\n" #: src/bare-metal/aps/better-uart/driver.md -#, fuzzy msgid "" "// SAFETY: We know that self.registers points to the control registers\n" " // of a PL011 device which is appropriately mapped.\n" msgstr "" -"// Es seguro porque sabemos que self.registers apunta\n" +"// SEGURO: Es seguro porque sabemos que self.registers apunta\n" " // a los registros de control de un dispositivo PL011 que está " -"asignado correctamente.\n" +"mapeado correctamente.\n" #: src/bare-metal/aps/better-uart/driver.md msgid "" @@ -19702,14 +19828,13 @@ msgstr "" " ///.\n" #: src/bare-metal/aps/better-uart/driver.md -#, fuzzy msgid "" "// SAFETY: We know that self.registers points to the control\n" " // registers of a PL011 device which is appropriately mapped.\n" msgstr "" -"// Es seguro porque sabemos que self.registers apunta\n" +"// SEGURO: Es seguro porque sabemos que self.registers apunta\n" " // a los registros de control de un dispositivo PL011 que está " -"asignado correctamente.\n" +"mapeado correctamente.\n" #: src/bare-metal/aps/better-uart/driver.md msgid "// TODO: Check for error conditions in bits 8-11.\n" @@ -19743,12 +19868,11 @@ msgstr "/// Dirección base del UART de PL011 principal.\n" #: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md #: src/exercises/bare-metal/solutions-afternoon.md -#, fuzzy msgid "" "// SAFETY: `PL011_BASE_ADDRESS` is the base address of a PL011 device, and\n" " // nothing else accesses that address range.\n" msgstr "" -"// Es seguro porque `PL011_BASE_ADDRESS` es la dirección base de un " +"// SEGURO: Es seguro porque `PL011_BASE_ADDRESS` es la dirección base de un " "dispositivo PL011\n" " // y ninguna más accede a ese intervalo de direcciones.\n" @@ -20188,14 +20312,13 @@ msgstr "" "interrupciones." #: src/bare-metal/useful-crates/spin.md -#, fuzzy msgid "" "`spin` also has a ticket lock mutex implementation; equivalents of `RwLock`, " "`Barrier` and `Once` from `std::sync`; and `Lazy` for lazy initialisation." msgstr "" -"`spin` también cuenta con una implementación de exclusión mutua de bloqueo " -"de tickets; equivalentes de `RwLock`, `Barrier` y `Once` de `std::sync`, y " -"`Lazy` para inicialización perezosa" +"`spin` también cuenta con una implementación de mutex de bloqueo de tickets; " +"equivalentes de `RwLock`, `Barrier` y `Once` de `std::sync`, y `Lazy` para " +"inicialización perezosa" #: src/bare-metal/useful-crates/spin.md msgid "" @@ -20234,14 +20357,14 @@ msgstr "vmbase" #: src/bare-metal/android/vmbase.md msgid "" "For VMs running under crosvm on aarch64, the [vmbase](https://android." -"googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/" -"master/vmbase/) library provides a linker script and useful defaults for the " -"build rules, along with an entry point, UART console logging and more." +"googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/main/" +"libs/libvmbase/) library provides a linker script and useful defaults for " +"the build rules, along with an entry point, UART console logging and more." msgstr "" "En el caso de las máquinas virtuales que se ejecutan con crosvm en aarch64, " "la biblioteca [vmbase](https://android.googlesource.com/platform/packages/" -"modules/Virtualization/+/refs/heads/master/vmbase/) proporciona una " -"secuencia de comandos de enlazador y valores predeterminados útiles para las " +"modules/Virtualization/+/refs/heads/main/libs/libvmbase/) proporciona una " +"secuencia de comandos de linker y valores predeterminados útiles para las " "reglas de compilación, además de un punto de entrada, registro de la consola " "UART y mucho más." @@ -20346,12 +20469,11 @@ msgstr "" "y busca en el directorio `rtc` los siguientes archivos." #: src/exercises/bare-metal/rtc.md -#, fuzzy msgid "" "_src/exceptions.rs_ (you should only need to change this for the 3rd part of " "the exercise):" msgstr "" -"`src/exceptions.rs` (solo se debería cambiar esto en la tercera parte del " +"_src/exceptions.rs_ (solo se debería cambiar esto en la tercera parte del " "ejercicio):" #: src/exercises/bare-metal/rtc.md @@ -20419,25 +20541,23 @@ msgid "\"main({:#x}, {:#x}, {:#x}, {:#x})\"" msgstr "\"main({:#x}, {:#x}, {:#x}, {:#x})\"" #: src/exercises/bare-metal/solutions-afternoon.md -#, fuzzy msgid "" "// SAFETY: `GICD_BASE_ADDRESS` and `GICR_BASE_ADDRESS` are the base\n" " // addresses of a GICv3 distributor and redistributor respectively, and\n" " // nothing else accesses those address ranges.\n" msgstr "" -"// Es seguro porque `GICD_BASE_ADDRESS` y `GICR_BASE_ADDRESS` son las " -"direcciones base\n" +"// SEGURO: Es seguro porque `GICD_BASE_ADDRESS` y `GICR_BASE_ADDRESS` son " +"las direcciones base\n" " // de un distribuidor y un redistribuidor GICv3 respectivamente,\n" " // y ningún otro elemento tiene acceso a esos intervalos de " "direcciones.\n" #: src/exercises/bare-metal/solutions-afternoon.md -#, fuzzy msgid "" "// SAFETY: `PL031_BASE_ADDRESS` is the base address of a PL031 device, and\n" " // nothing else accesses that address range.\n" msgstr "" -"// Es seguro porque `PL031_BASE_ADDRESS` es la dirección base de un " +"// SEGURO: Es seguro porque `PL031_BASE_ADDRESS` es la dirección base de un " "dispositivo PL031\n" " // y ningún otro elemento puede acceder a ese intervalo de direcciones.\n" @@ -20534,12 +20654,11 @@ msgid "/// Reads the current RTC value.\n" msgstr "/// Lee el valor de RTC actual.\n" #: src/exercises/bare-metal/solutions-afternoon.md -#, fuzzy msgid "" "// SAFETY: We know that self.registers points to the control registers\n" " // of a PL031 device which is appropriately mapped.\n" msgstr "" -"// Es seguro porque sabemos que self.registers apunta\n" +"// SEGURO: Es seguro porque sabemos que self.registers apunta\n" " // a los registros de control de un dispositivo PL031 que está " "asignado correctamente.\n" @@ -20592,12 +20711,12 @@ msgid "/// Clears a pending interrupt, if any.\n" msgstr "/// Borra una interrupción pendiente, si la hubiera.\n" #: src/exercises/bare-metal/solutions-afternoon.md -#, fuzzy msgid "" "// SAFETY: `Rtc` just contains a pointer to device memory, which can be\n" "// accessed from any context.\n" msgstr "" -"// Es seguro porque solo contiene un puntero a la memoria del dispositivo,\n" +"// SEGURO: Es seguro porque solo contiene un puntero a la memoria del " +"dispositivo,\n" "// a la que se puede acceder desde cualquier contexto.\n" #: src/concurrency/welcome.md @@ -20624,23 +20743,26 @@ msgstr "" "en el compilador para asegurar la corrección en el tiempo de ejecución." #: src/concurrency/welcome.md src/concurrency/welcome-async.md -#, fuzzy msgid "" "Including 10 minute breaks, this session should take about 3 hours and 20 " "minutes. It contains:" msgstr "" "Contando con los descansos de 10 minutos, la duración prevista de la sesión " -"es de unas 2 horas y 20 minutos." +"es de unas 3 horas y 20 minutos. Contiene:" #: src/concurrency/welcome.md msgid "" "Rust lets us access OS concurrency toolkit: threads, sync. primitives, etc." msgstr "" +"Rust nos permite acceder al conjunto de herramientas de concurrencia del " +"sistema operativo: hilos, primitivas de sincronización, etc." #: src/concurrency/welcome.md msgid "" "The type system gives us safety for concurrency without any special features." msgstr "" +"El sistema de tipos nos brinda seguridad para la concurrencia sin necesidad " +"de características especiales." #: src/concurrency/welcome.md msgid "" @@ -20648,12 +20770,15 @@ msgid "" "g., a called function that might mutate an argument or save references to it " "to read later) save us from multi-threading issues." msgstr "" +"Las mismas herramientas que ayudan con el acceso \"concurrente\" en un solo " +"hilo (por ejemplo, una función llamada que podría mutar un argumento o " +"guardar referencias para leer más tarde) nos protegen de los problemas de " +"multihilo." #: src/concurrency/threads.md src/concurrency/shared-state.md #: src/concurrency/async.md -#, fuzzy msgid "This segment should take about 30 minutes. It contains:" -msgstr "Esta sección tiene una duración aproximada de 20 minutos." +msgstr "Esta sección tiene una duración aproximada de 20 minutos. Contiene:" #: src/concurrency/threads/plain.md msgid "Rust threads work similarly to threads in other languages:" @@ -20668,9 +20793,12 @@ msgid "\"Main thread: {i}\"" msgstr "\"Hilo principal: {i}\"" #: src/concurrency/threads/plain.md -msgid "Threads are all daemon threads, the main thread does not wait for them." +msgid "" +"Spawning new threads does not automatically delay program termination at the " +"end of `main`." msgstr "" -"Los hilos son todos hilos daemon, y el hilo principal no espera por ellos." +"Crear nuevos hilos no retrasa automáticamente la terminación del programa al " +"final de `main`." #: src/concurrency/threads/plain.md msgid "Thread panics are independent of each other." @@ -20685,145 +20813,153 @@ msgstr "" #: src/concurrency/threads/plain.md msgid "Rust thread APIs look not too different from e.g. C++ ones." msgstr "" +"Las APIs de hilos de Rust no son muy diferentes de las de C++, por ejemplo." #: src/concurrency/threads/plain.md -#, fuzzy msgid "Run the example." -msgstr "Ejecuta el ejemplo con:" +msgstr "Ejecuta el ejemplo:" #: src/concurrency/threads/plain.md msgid "" "5ms timing is loose enough that main and spawned threads stay mostly in " "lockstep." msgstr "" +"Un temporizador de 5 ms es lo suficientemente flexible como para que el hilo " +"principal y los hilos creados se mantengan mayormente sincronizados." #: src/concurrency/threads/plain.md msgid "Notice that the program ends before the spawned thread reaches 10!" msgstr "" +"Observa que el programa termina antes de que el hilo creado alcance el 10." #: src/concurrency/threads/plain.md msgid "" "This is because main ends the program and spawned threads do not make it " "persist." msgstr "" +"Esto se debe a que el hilo principal finaliza el programa y los hilos " +"creados no lo mantienen activo." #: src/concurrency/threads/plain.md msgid "Compare to pthreads/C++ std::thread/boost::thread if desired." -msgstr "" +msgstr "Compara con pthreads/std::thread de C++/boost::thread si lo deseas." #: src/concurrency/threads/plain.md msgid "How do we wait around for the spawned thread to complete?" -msgstr "" +msgstr "¿Cómo esperamos a que el hilo creado finalice?" #: src/concurrency/threads/plain.md -#, fuzzy msgid "" "[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html) " "returns a `JoinHandle`. Look at the docs." msgstr "" -"[`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) se usa " -"para construir una instancia predeterminada de un tipo." +"[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html) " +"devuelve un `JoinHandle`. Mira la documentación." #: src/concurrency/threads/plain.md msgid "" "`JoinHandle` has a [`.join()`](https://doc.rust-lang.org/std/thread/struct." "JoinHandle.html#method.join) method that blocks." msgstr "" +"`JoinHandle` tiene un método [`.join()`](https://doc.rust-lang.org/std/" +"thread/struct.JoinHandle.html#method.join) que bloquea." #: src/concurrency/threads/plain.md -#, fuzzy msgid "" "Use `let handle = thread::spawn(...)` and later `handle.join()` to wait for " "the thread to finish and have the program count all the way to 10." msgstr "" "Utiliza `let handle = thread::spawn(...)` y, después, `handle.join()` para " -"esperar a que el hilo termine." +"esperar a que el hilo termine y hacer que el programa cuente hasta 10." #: src/concurrency/threads/plain.md msgid "Now what if we want to return a value?" -msgstr "" +msgstr "¿Y si queremos devolver un valor?" #: src/concurrency/threads/plain.md msgid "Look at docs again:" -msgstr "" +msgstr "Mira la documentación nuevamente:" #: src/concurrency/threads/plain.md -#, fuzzy msgid "" "[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html)'s " "closure returns `T`" msgstr "" -"Sin embargo, puedes usar un [hilo con ámbito](https://doc.rust-lang.org/std/" -"thread/fn.scope.html) para lo siguiente:" +"La closure de [`thread::spawn`](https://doc.rust-lang.org/std/thread/fn." +"spawn.html) devuelve `T`." #: src/concurrency/threads/plain.md msgid "" "`JoinHandle` [`.join()`](https://doc.rust-lang.org/std/thread/struct." "JoinHandle.html#method.join) returns `thread::Result`" msgstr "" +"`JoinHandle` [`.join()`](https://doc.rust-lang.org/std/thread/struct." +"JoinHandle.html#method.join) devuelve `thread::Result`." #: src/concurrency/threads/plain.md -#, fuzzy msgid "" "Use the `Result` return value from `handle.join()` to get access to the " "returned value." msgstr "" -"Usa el valor devuelto `Result` de `handle.join.()` para acceder a la carga " -"útil del pánico. Este es un buen momento para hablar sobre [`Any`](https://" -"doc.rust-lang.org/std/any/index.html)." +"Utiliza el valor de retorno `Result` de `handle.join()` para acceder al " +"valor devuelto." #: src/concurrency/threads/plain.md msgid "Ok, what about the other case?" -msgstr "" +msgstr "Bien, ¿qué pasa con el otro caso?" #: src/concurrency/threads/plain.md -#, fuzzy msgid "Trigger a panic in the thread. Note that this doesn't panic `main`." msgstr "Activa un pánico en el hilo y observa cómo esto no afecta a `main`." #: src/concurrency/threads/plain.md -#, fuzzy msgid "" "Access the panic payload. This is a good time to talk about [`Any`](https://" "doc.rust-lang.org/std/any/index.html)." msgstr "" -"Usa el valor devuelto `Result` de `handle.join.()` para acceder a la carga " -"útil del pánico. Este es un buen momento para hablar sobre [`Any`](https://" -"doc.rust-lang.org/std/any/index.html)." +"Accede a la carga útil del pánico. Este es un buen momento para hablar sobre " +"[`Any`](https://doc.rust-lang.org/std/any/index.html)." #: src/concurrency/threads/plain.md msgid "Now we can return values from threads! What about taking inputs?" msgstr "" +"¡Ahora podemos devolver valores de los hilos! ¿Qué pasa con las entradas?" #: src/concurrency/threads/plain.md msgid "Capture something by reference in the thread closure." -msgstr "" +msgstr "Captura algo por referencia en el cierre del hilo." #: src/concurrency/threads/plain.md msgid "An error message indicates we must move it." -msgstr "" +msgstr "Un mensaje de error indica que debemos moverlo." #: src/concurrency/threads/plain.md msgid "Move it in, see we can compute and then return a derived value." msgstr "" +"Muévelo dentro, y veremos que podemos calcular y luego devolver un valor " +"derivado." #: src/concurrency/threads/plain.md msgid "If we want to borrow?" -msgstr "" +msgstr "¿Y si queremos hacer un préstamo?" #: src/concurrency/threads/plain.md msgid "" "Main kills child threads when it returns, but another function would just " "return and leave them running." msgstr "" +"El hilo principal finaliza los hilos secundarios cuando retorna, pero otra " +"función simplemente regresaría y los dejaría en ejecución." #: src/concurrency/threads/plain.md msgid "That would be stack use-after-return, which violates memory safety!" msgstr "" +"Eso sería un uso del stack después de retornar, lo cual viola la seguridad " +"de la memoria." #: src/concurrency/threads/plain.md msgid "How do we avoid this? see next slide." -msgstr "" +msgstr "¿Cómo evitamos esto? Mira la siguiente diapositiva." #: src/concurrency/threads/scoped.md msgid "Normal threads cannot borrow from their environment:" @@ -20855,9 +20991,8 @@ msgstr "" "datos prestados de manera inmutable." #: src/concurrency/channels.md src/concurrency/async-control-flow.md -#, fuzzy msgid "This segment should take about 20 minutes. It contains:" -msgstr "Esta sección tiene una duración aproximada de 20 minutos." +msgstr "Esta sección tiene una duración aproximada de 20 minutos. Contiene:" #: src/concurrency/channels/senders-receivers.md msgid "" @@ -20935,13 +21070,12 @@ msgstr "" "receptor." #: src/concurrency/channels/bounded.md -#, fuzzy msgid "" "A bounded channel with a size of zero is called a \"rendezvous channel\". " "Every send will block the current thread until another thread calls `recv`." msgstr "" "Un canal delimitado con un tamaño de cero se denomina \"canal rendezvous\". " -"Cada envío bloqueará el hilo actual hasta que otro hilo llame a `read`." +"Cada envío bloqueará el hilo actual hasta que otro hilo llame a `recv`." #: src/concurrency/send-sync.md msgid "Send" @@ -20952,7 +21086,6 @@ msgid "Sync" msgstr "Sync" #: src/concurrency/send-sync/marker-traits.md -#, fuzzy msgid "" "How does Rust know to forbid shared access across threads? The answer is in " "two traits:" @@ -20977,15 +21110,14 @@ msgstr "" "es `Sync` si es seguro mover un `&T` entre los límites de un hilo." #: src/concurrency/send-sync/marker-traits.md -#, fuzzy msgid "" "`Send` and `Sync` are [unsafe traits](../../unsafe-rust/unsafe-traits.md). " "The compiler will automatically derive them for your types as long as they " "only contain `Send` and `Sync` types. You can also implement them manually " "when you know it is valid." msgstr "" -"`Send` y `Sync` son [traits inseguros](../unsafe/unsafe-traits.md). El " -"compilador los derivará automáticamente a tus tipos siempre que solo " +"`Send` y `Sync` son [traits inseguros](../../unsafe-rust/unsafe-traits.md). " +"El compilador los derivará automáticamente a tus tipos siempre que solo " "contengan los tipos `Send` y `Sync`. También puedes implementarlos de forma " "manual cuando sepas que es válido." @@ -21101,9 +21233,8 @@ msgstr "" "`Mutex`: explícitamente seguro para los hilos mediante bloqueo interno." #: src/concurrency/send-sync/examples.md -#, fuzzy msgid "`mpsc::Sender`: As of 1.72.0." -msgstr "`mpsc::Sender`" +msgstr "`mpsc::Sender`: A partir de la versión 1.72.0." #: src/concurrency/send-sync/examples.md msgid "`AtomicBool`, `AtomicU8`, ...: Uses special atomic instructions." @@ -21148,19 +21279,22 @@ msgstr "`!Send + Sync`" #: src/concurrency/send-sync/examples.md msgid "" -"These types are thread-safe, but they cannot be moved to another thread:" +"These types are safe to access (via shared references) from multiple " +"threads, but they cannot be moved to another thread:" msgstr "" -"Estos tipos son seguros para los hilos _(thread safe)_, pero no se pueden " -"mover a otro hilo:" +"Estos tipos son seguros para acceder (mediante referencias compartidas) " +"desde múltiples hilos, pero no pueden ser movidos a otro hilo:" #: src/concurrency/send-sync/examples.md -#, fuzzy msgid "" "`MutexGuard`: Uses OS level primitives which must be deallocated on " -"the thread which created them." +"the thread which created them. However, an already-locked mutex can have its " +"guarded variable read by any thread with which the guard is shared." msgstr "" -"`MutexGuard`: utiliza primitivos de nivel SO que se deben desasignar en " -"el hilo que los creó." +"`MutexGuard`: Utiliza primitivas a nivel de sistema operativo que " +"se deben desasignar en el hilo que los creó. Sin embargo, una mutex que ya " +"este bloqueada puede permitir que su variable protegida sea leída por " +"cualquier hilo que comparta el guard." #: src/concurrency/send-sync/examples.md msgid "`!Send + !Sync`" @@ -21249,16 +21383,16 @@ msgid "`std::sync::Weak` can help." msgstr "`std::sync::Weak` puede resultar útil." #: src/concurrency/shared-state/mutex.md -#, fuzzy msgid "" "[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) ensures " "mutual exclusion _and_ allows mutable access to `T` behind a read-only " "interface (another form of [interior mutability](../../borrowing/interior-" -"mutability)):" +"mutability.md)):" msgstr "" "[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) asegura " "la exclusión mutua _y_ permite un acceso mutable a `T` a través de una " -"interfaz de solo lectura:" +"interfaz de solo lectura (otra forma de [mutabilidad interior](../../" +"borrowing/interior-mutability.md)):" #: src/concurrency/shared-state/mutex.md msgid "\"v: {:?}\"" @@ -21275,7 +21409,6 @@ msgstr "" "Sync-for-Mutex%3CT%3E)." #: src/concurrency/shared-state/mutex.md -#, fuzzy msgid "" "`Mutex` in Rust looks like a collection with just one element --- the " "protected data." @@ -21309,12 +21442,10 @@ msgstr "" "`Send`." #: src/concurrency/shared-state/mutex.md -#, fuzzy msgid "A read-write lock counterpart: `RwLock`." msgstr "Un equivalente de bloqueo de lectura y escritura: `RwLock`." #: src/concurrency/shared-state/mutex.md -#, fuzzy msgid "Why does `lock()` return a `Result`?" msgstr "¿Por qué `lock()` devuelve un `Result`? " @@ -21451,9 +21582,8 @@ msgstr "\"{} está comiendo...\"" #: src/concurrency/sync-exercises/solutions.md #: src/concurrency/async-exercises/dining-philosophers.md #: src/concurrency/async-exercises/solutions.md -#, fuzzy msgid "\"Socrates\"" -msgstr "Crates HAL" +msgstr "\"Socrates\"" #: src/concurrency/sync-exercises/dining-philosophers.md #: src/concurrency/sync-exercises/solutions.md @@ -21544,11 +21674,14 @@ msgid "" "(https://docs.rs/scraper/). Finally, we'll need some way of handling errors, " "we will use [`thiserror`](https://docs.rs/thiserror/)." msgstr "" +"Para esto, necesitarás un cliente HTTP como [`reqwest`](https://docs.rs/" +"reqwest/). También necesitarás una forma de encontrar enlaces; podemos usar " +"[`scraper`](https://docs.rs/scraper/). Finalmente, necesitaremos una forma " +"de manejar errores, utilizaremos [`thiserror`](https://docs.rs/thiserror/)." #: src/concurrency/sync-exercises/link-checker.md -#, fuzzy msgid "Create a new Cargo project and `reqwest` it as a dependency with:" -msgstr "Crea un proyecto de Cargo y añade las siguientes dependencias:" +msgstr "Crea un nuevo proyecto de Cargo y agrega reqwest como dependencia con:" #: src/concurrency/sync-exercises/link-checker.md msgid "" @@ -21804,13 +21937,12 @@ msgid "Use `let future: () = async_main(10);` in `main` to see the type." msgstr "Consulta el tipo con `let future: () = async_main(10);` en `main` ." #: src/concurrency/async/async-await.md -#, fuzzy msgid "" "The \"async\" keyword is syntactic sugar. The compiler replaces the return " "type with a future." msgstr "" "La palabra clave \"async\" es azúcar sintáctico. El compilador sustituye el " -"tipo de resultado devuelto por un futuro. " +"tipo de resultado devuelto por un Future. " #: src/concurrency/async/async-await.md msgid "" @@ -21821,13 +21953,12 @@ msgstr "" "al compilador sobre cómo usar el futuro devuelto." #: src/concurrency/async/async-await.md -#, fuzzy msgid "" "You need an executor to run async code. `block_on` blocks the current thread " "until the provided future has run to completion." msgstr "" "Se necesita un ejecutor para ejecutar el código asíncrono. `block_on` " -"bloquea el hilo hasta que se complete el futuro proporcionado. " +"bloquea el hilo hasta que se complete el Future proporcionado. " #: src/concurrency/async/async-await.md msgid "" @@ -21838,13 +21969,12 @@ msgstr "" "diferencia de `block_on`, `.await` no bloquea el hilo." #: src/concurrency/async/async-await.md -#, fuzzy msgid "" "`.await` can only be used inside an `async` function (or block; these are " "introduced later)." msgstr "" -"`.await` solo se puede usar dentro de una función `async` (o bloqueo; estos " -"se verán más tarde). " +"`.await` solo se puede usar dentro de una función `async` (o un bloque; " +"estos se verán más tarde). " #: src/concurrency/async/futures.md msgid "" @@ -21980,7 +22110,6 @@ msgstr "" "hasta su finalización, aunque nunca se utilicen." #: src/concurrency/async/runtimes/tokio.md -#, fuzzy msgid "Tokio provides:" msgstr "Tokio ofrece lo siguiente: " @@ -22108,15 +22237,14 @@ msgstr "" "algunos clientes conectados. ¿Qué tareas hay? ¿Cuáles son sus futuros?" #: src/concurrency/async/tasks.md -#, fuzzy msgid "" "This is the first time we've seen an `async` block. This is similar to a " "closure, but does not take any arguments. Its return value is a Future, " "similar to an `async fn`." msgstr "" -"Esta es la primera vez que vemos un bloque `async`. Es similar a un cierre, " -"pero no acepta argumentos. Su valor devuelto es un futuro, similar a `async " -"fn`. " +"Esta es la primera vez que vemos un bloque `async`. Es similar a una " +"closure, pero no acepta argumentos. Su valor devuelto es un Future, similar " +"a `async fn`. " #: src/concurrency/async/tasks.md msgid "" @@ -22157,13 +22285,12 @@ msgstr "" "Cambia el tamaño del canal a `3` y comprueba cómo afecta a la ejecución." #: src/concurrency/async-control-flow/channels.md -#, fuzzy msgid "" "Overall, the interface is similar to the `sync` channels as seen in the " "[morning class](../channels.md)." msgstr "" "En general, la interfaz es similar a los canales `sync`, tal como se ha " -"visto ver en la [clase de la mañana](concurrency/channels.md)." +"visto en la [clase de la mañana](../channels.md)." #: src/concurrency/async-control-flow/channels.md msgid "Try removing the `std::mem::drop` call. What happens? Why?" @@ -22227,7 +22354,6 @@ msgstr "" "se estabilizará en `std::future`." #: src/concurrency/async-control-flow/join.md -#, fuzzy msgid "" "The risk of `join` is that one of the futures may never resolve, this would " "cause your program to stall." @@ -22262,7 +22388,6 @@ msgstr "" "return_when=asyncio.FIRST_COMPLETED)`." #: src/concurrency/async-control-flow/select.md -#, fuzzy msgid "" "Similar to a match statement, the body of `select!` has a number of arms, " "each of the form `pattern = future => statement`. When a `future` is ready, " @@ -22272,76 +22397,48 @@ msgid "" msgstr "" "Al igual que en el caso de una instrucción _match_, el cuerpo de `select!` " "tiene una serie de brazos, cada uno de los cuales tiene la forma `pattern = " -"future => statement`. Cuando `future` está listo, la instrucción se ejecuta " -"con las variables de `pattern` vinculadas al resultado de `future`." - -#: src/concurrency/async-control-flow/select.md -msgid "\"Felix\"" -msgstr "\"Felix\"" - -#: src/concurrency/async-control-flow/select.md -msgid "\"Failed to send cat.\"" -msgstr "\"No se ha podido enviar el gato.\"" - -#: src/concurrency/async-control-flow/select.md -msgid "\"Failed to send dog.\"" -msgstr "\"No se ha podido enviar el perro.\"" +"future => statement`. Cuando un `future` está listo, su valor de retorno es " +"desestructurado por el `pattern`. Luego, se ejecuta el `statement` con las " +"variables resultantes. El resultado del `statement` se convierte en el " +"resultado del macro `select!`." #: src/concurrency/async-control-flow/select.md -msgid "\"Failed to receive winner\"" -msgstr "\"No se ha podido recibir el ganador\"" +msgid "\"got: {msg}\"" +msgstr "\"Ha recibido {msg}\"" #: src/concurrency/async-control-flow/select.md -msgid "\"Winner is {winner:?}\"" -msgstr "\"El ganador es {winner:?}\"" +msgid "\"timeout\"" +msgstr "\"timeout\"" #: src/concurrency/async-control-flow/select.md -msgid "" -"In this example, we have a race between a cat and a dog. " -"`first_animal_to_finish_race` listens to both channels and will pick " -"whichever arrives first. Since the dog takes 50ms, it wins against the cat " -"that take 500ms." -msgstr "" -"En este ejemplo, tenemos una carrera entre un gato y un perro. " -"`first_animal_to_finish_race` escucha a ambos canales y elige el que llegue " -"primero. Como el perro tarda 50 ms, gana al gato, que tarda 500 ms." +msgid "\"Failed to send greeting\"" +msgstr "\"Error al enviar el saludo\"" #: src/concurrency/async-control-flow/select.md -msgid "" -"You can use `oneshot` channels in this example as the channels are supposed " -"to receive only one `send`." -msgstr "" -"En este ejemplo, puedes usar canales `oneshot`, ya que se supone que solo " -"recibirán un `send`." +msgid "\"Listener failed\"" +msgstr "\"Listener failed\"" #: src/concurrency/async-control-flow/select.md msgid "" -"Try adding a deadline to the race, demonstrating selecting different sorts " -"of futures." +"The `listener` async block here is a common form: wait for some async event, " +"or for a timeout. Change the `sleep` to sleep longer to see it fail. Why " +"does the `send` also fail in this situation?" msgstr "" -"Prueba a añadir un límite a la carrera y demuestra cómo se seleccionan " -"distintos tipos de futuros." +"El bloque asíncrono `listener` aquí es una forma común: esperar algún evento " +"asíncrono o un tiempo de espera. Cambia el `sleep` para que duerma más " +"tiempo y verás que falla. ¿Por qué también falla el `send` en esta situación?" #: src/concurrency/async-control-flow/select.md msgid "" -"Note that `select!` drops unmatched branches, which cancels their futures. " -"It is easiest to use when every execution of `select!` creates new futures." +"`select!` is also often used in a loop in \"actor\" architectures, where a " +"task reacts to events in a loop. That has some pitfalls, which will be " +"discussed in the next segment." msgstr "" -"Ten en cuenta que `select!` elimina las ramas sin coincidencias, cancelando " -"así sus futuros. Es más fácil de usar cuando cada ejecución de `select!` " -"crea futuros." - -#: src/concurrency/async-control-flow/select.md -msgid "" -"An alternative is to pass `&mut future` instead of the future itself, but " -"this can lead to issues, further discussed in the pinning slide." -msgstr "" -"También puedes enviar `&mut future` en lugar del futuro en sí, pero esto " -"podría provocar problemas, como se explica más adelante en la diapositiva " -"sobre pines." +"`select!` también se utiliza a menudo en un bucle en arquitecturas de " +"\"actores\", donde una tarea reacciona a eventos en un ciclo. Esto tiene " +"algunas trampas, que se discutirán en el próximo segmento." #: src/concurrency/async-pitfalls.md -#, fuzzy msgid "" "Async / await provides convenient and efficient abstraction for concurrent " "asynchronous programming. However, the async/await model in Rust also comes " @@ -22556,7 +22653,6 @@ msgstr "" "usa `Box::pin`:" #: src/concurrency/async-pitfalls/pin.md -#, fuzzy msgid "" "This compiles, but once the timeout expires it is `Poll::Ready` on every " "iteration (a fused future would help with this). Update to reset " @@ -22564,7 +22660,7 @@ msgid "" msgstr "" "Se puede compilar, pero una vez que vence el tiempo de espera, aparece " "`Poll::Ready` en cada iteración (un futuro fusionado podría resultar útil). " -"Actualiza para restablecer `timeout_fut` cada vez que expire." +"Actualiza para restablecer `timeout_fut` cada vez que expire:" #: src/concurrency/async-pitfalls/pin.md msgid "" @@ -22627,34 +22723,44 @@ msgid "" "in traits, as the desugaring for `async fn` includes `-> impl Future`." msgstr "" +"Los métodos asíncronos en traits se estabilizaron solo recientemente, en la " +"versión 1.75. Esto requirió soporte para usar `impl Trait` en la posición de " +"retorno (RPIT) en traits, ya que remover el azúcar sintáctico de `async fn` " +"incluye `-> impl Future`." #: src/concurrency/async-pitfalls/async-traits.md msgid "" "However, even with the native support today there are some pitfalls around " "`async fn` and RPIT in traits:" msgstr "" +"Sin embargo, incluso con el soporte nativo actual, hay algunas trampas " +"relacionadas con `async fn` y RPIT en traits:" #: src/concurrency/async-pitfalls/async-traits.md msgid "" "Return-position impl Trait captures all in-scope lifetimes (so some patterns " "of borrowing cannot be expressed)" msgstr "" +"`impl Trait` en la posición de retorno captura todos los tiempos de vida en " +"el ámbito (por lo que algunos patrones de préstamo no pueden ser expresados)." #: src/concurrency/async-pitfalls/async-traits.md msgid "" "Traits whose methods use return-position `impl trait` or `async` are not " "`dyn` compatible." msgstr "" +"Los traits cuyos métodos utilizan `impl Trait` en la posición de retorno o " +"`async` no son compatibles con `dyn`." #: src/concurrency/async-pitfalls/async-traits.md -#, fuzzy msgid "" "If we do need `dyn` support, the crate [async_trait](https://docs.rs/async-" "trait/latest/async_trait/) provides a workaround through a macro, with some " "caveats:" msgstr "" -"El crate [async_trait](https://docs.rs/async-trait/latest/async_trait/) " -"proporciona una solución mediante una macro:" +"Si necesitamos soporte para `dyn`, el crate [async_trait](https://docs.rs/" +"async-trait/latest/async_trait/) proporciona una solución mediante una " +"macro, con algunas advertencias:" #: src/concurrency/async-pitfalls/async-traits.md msgid "\"running all sleepers..\"" @@ -22709,9 +22815,8 @@ msgstr "" "interbloqueos o perder datos." #: src/concurrency/async-pitfalls/cancellation.md -#, fuzzy msgid "\"not UTF-8\"" -msgstr "UTF-8" +msgstr "\"not UTF-8\"" #: src/concurrency/async-pitfalls/cancellation.md msgid "\"hi\\nthere\\n\"" @@ -22797,13 +22902,12 @@ msgid "Dining Philosophers --- Async" msgstr "La Cena de Filósofos --- Async" #: src/concurrency/async-exercises/dining-philosophers.md -#, fuzzy msgid "" -"See [dining philosophers](concurrency/sync-exercises/dining-philosophers.md) " -"for a description of the problem." +"See [dining philosophers](../sync-exercises/dining-philosophers.md) for a " +"description of the problem." msgstr "" "Consulta la descripción del problema en la sección sobre [la cena de " -"filósofos](dining-philosophers.md)." +"filósofos](../sync-exercises/dining-philosophers.md)." #: src/concurrency/async-exercises/dining-philosophers.md msgid "" @@ -22819,7 +22923,7 @@ msgstr "" #: src/concurrency/async-exercises/dining-philosophers.md #: src/concurrency/async-exercises/solutions.md msgid "// Keep trying until we have both forks\n" -msgstr "" +msgstr "// Sigue intentando hasta que tengamos ambas bifurcaciones.\n" #: src/concurrency/async-exercises/dining-philosophers.md #: src/concurrency/async-exercises/solutions.md @@ -22891,8 +22995,8 @@ msgid "" "(https://docs.rs/tokio-websockets/) for the communication between the client " "and the server." msgstr "" -"Para ello, usaremos \\[un canal en abierto](https://docs.rs/tokio/latest/" -"tokio/sync/broadcast/fn.channel.html) en el servidor y [`tokio_websockets`]" +"Para ello, usaremos [un canal en abierto](https://docs.rs/tokio/latest/tokio/" +"sync/broadcast/fn.channel.html) en el servidor y [`tokio_websockets`]" "(https://docs.rs/tokio-websockets/) para la comunicación entre el cliente y " "el servidor." @@ -22905,7 +23009,6 @@ msgid "_Cargo.toml_:" msgstr "_Cargo.toml_:" #: src/concurrency/async-exercises/chat-app.md -#, fuzzy msgid "" "```toml\n" "[package]\n" @@ -22916,8 +23019,8 @@ msgid "" "[dependencies]\n" "futures-util = { version = \"0.3.30\", features = [\"sink\"] }\n" "http = \"1.1.0\"\n" -"tokio = { version = \"1.38.0\", features = [\"full\"] }\n" -"tokio-websockets = { version = \"0.8.3\", features = [\"client\", " +"tokio = { version = \"1.40.0\", features = [\"full\"] }\n" +"tokio-websockets = { version = \"0.9.0\", features = [\"client\", " "\"fastrand\", \"server\", \"sha1_smol\"] }\n" "```" msgstr "" @@ -22929,9 +23032,9 @@ msgstr "" "\n" "[dependencies]\n" "futures-util = { version = \"0.3.30\", features = [\"sink\"] }\n" -"http = \"1.0.0\"\n" -"tokio = { version = \"1.28.1\", features = [\"full\"] }\n" -"tokio-websockets = { version = \"0.5.1\", features = [\"client\", " +"http = \"1.1.0\"\n" +"tokio = { version = \"1.40.0\", features = [\"full\"] }\n" +"tokio-websockets = { version = \"0.9.0\", features = [\"client\", " "\"fastrand\", \"server\", \"sha1_smol\"] }\n" "```" @@ -23021,9 +23124,8 @@ msgstr "" #: src/concurrency/async-exercises/chat-app.md #: src/concurrency/async-exercises/solutions.md -#, fuzzy msgid "_src/bin/server.rs_:" -msgstr "`src/bin/server.rs`:" +msgstr "_src/bin/server.rs_:" #: src/concurrency/async-exercises/chat-app.md msgid "// TODO: For a hint, see the description of the task below.\n" @@ -23116,12 +23218,18 @@ msgid "" "// If we didn't get the left fork, drop the right fork if we\n" " // have it and let other tasks make progress.\n" msgstr "" +"// Si no conseguimos la bifurcación izquierda, liberamos la bifurcación " +"derecha si lo tenemos \n" +" // y dejamos que otras tareas avancen.\n" #: src/concurrency/async-exercises/solutions.md msgid "" "// If we didn't get the right fork, drop the left fork and let\n" " // other tasks make progress.\n" msgstr "" +"// Si no conseguimos la bifurcación derecha, liberamos la bifurcación " +"izquierda \n" +" // y dejamos que otras tareas avancen.\n" #: src/concurrency/async-exercises/solutions.md msgid "// The locks are dropped here\n" @@ -23142,16 +23250,15 @@ msgid "\"Welcome to chat! Type a message\"" msgstr "\"Te damos la bienvenida al chat. Escribe un mensaje\"" #: src/concurrency/async-exercises/solutions.md -#, fuzzy msgid "" "// A continuous loop for concurrently performing two tasks: (1) receiving\n" " // messages from `ws_stream` and broadcasting them, and (2) receiving\n" " // messages on `bcast_rx` and sending them to the client.\n" msgstr "" -"Sugerencia: al igual que antes, usa `tokio::select!` en un bucle continuo " -"para realizar dos tareas simultáneamente: (1) leer los mensajes del usuario " -"desde la entrada estándar y enviarlos al servidor, y (2) recibir mensajes " -"del servidor y mostrárselos al usuario." +"// Un bucle continuo para realizar dos tareas de manera concurrente: (1) " +"recibir\n" +" // mensajes de `ws_stream` y retransmitirlos, y (2) recibir\n" +" // mensajes en `bcast_rx` y enviarlos al cliente.\n" #: src/concurrency/async-exercises/solutions.md msgid "\"From client {addr:?} {text:?}\"" @@ -23199,11 +23306,10 @@ msgstr "" #: src/glossary.md msgid "" "allocate: \n" -"Dynamic memory allocation on [the heap](memory-management/stack-vs-heap.md)." +"Dynamic memory allocation on [the heap](memory-management/review.md)." msgstr "" "asignar: \n" -"Asignación dinámica de memoria en [el montículo](Memory-management/stack-vs-" -"heap.md)." +"Asignación dinámica de memoria en [el heap](memory-management/review.md)." #: src/glossary.md msgid "" @@ -23213,6 +23319,16 @@ msgstr "" "argumento: \n" "Información que se transmite a una función o método." +#: src/glossary.md +msgid "" +"associated type: \n" +"A type associated with a specific trait. Useful for defining the " +"relationship between types." +msgstr "" +"tipo asociado: \n" +"Un tipo asociado a un trait específico. Útil para definir la relación entre " +"tipos." + #: src/glossary.md msgid "" "Bare-metal Rust: \n" @@ -23226,18 +23342,18 @@ msgstr "" #: src/glossary.md msgid "" "block: \n" -"See [Blocks](control-flow/blocks.md) and _scope_." +"See [Blocks](control-flow-basics/blocks-and-scopes.md) and _scope_." msgstr "" "bloque: \n" -"Consulta [bloques](control-flow/blocks.md) y _ámbito_." +"Consulta [bloques](control-flow-basics/blocks-and-scopes.md) y _ámbito_." #: src/glossary.md msgid "" "borrow: \n" -"See [Borrowing](ownership/borrowing.md)." +"See [Borrowing](borrowing/shared.md)." msgstr "" -"borrow (_omar prestado_): \n" -"Consulta [Borrowing (Préstamos)](ownership/borrowing.md)." +"borrow (_tomar prestado_): \n" +"Consulta [Borrowing (Préstamos)](borrowing/shared.md)." #: src/glossary.md msgid "" @@ -23303,10 +23419,10 @@ msgstr "" #: src/glossary.md msgid "" "Concurrency in Rust: \n" -"See [Concurrency in Rust](concurrency.md)." +"See [Concurrency in Rust](concurrency/welcome.md)." msgstr "" "Simultaneidad en Rust: \n" -"consulta [Simultaneidad en Rust](concurrency.md)." +"Consulta [Simultaneidad en Rust](concurrency/welcome.md)." #: src/glossary.md msgid "" @@ -23618,13 +23734,12 @@ msgstr "" "rendimiento y la simultaneidad." #: src/glossary.md -#, fuzzy msgid "" "Rust Fundamentals: \n" "Days 1 to 4 of this course." msgstr "" "Aspectos básicos de Rust: \n" -"contenido del día 1 al día 3 de este curso." +"Contenido del día 1 al día 4 de este curso." #: src/glossary.md msgid "" @@ -23680,15 +23795,14 @@ msgstr "" "estáticos con un tiempo de vida `'static`." #: src/glossary.md -#, fuzzy msgid "" "string: \n" "A data type storing textual data. See [Strings](references/strings.html) for " "more." msgstr "" -"String o cadena: \n" -"tipo de datos que almacena datos de texto. Consulta [`String` vs `str`]" -"(basic-syntax/string-slices.html) para obtener más información." +"string: \n" +"Un tipo de dato que almacena datos textuales. Consulta [Strings](references/" +"strings.html) para más información." #: src/glossary.md msgid "" @@ -23822,11 +23936,11 @@ msgstr "" msgid "" "unsafe: \n" "The subset of Rust which allows you to trigger _undefined behavior_. See " -"[Unsafe Rust](unsafe.html)." +"[Unsafe Rust](unsafe-rust/unsafe.md)." msgstr "" -"Inseguro: \n" +"unsafe: \n" "el subconjunto de Rust que te permite activar un _comportamiento " -"indefinido_. Consulta [Rust inseguro](unsafe.html)." +"indefinido_. Consulta [Rust inseguro](unsafe-rust/unsafe.md)." #: src/glossary.md msgid "" @@ -23949,9 +24063,9 @@ msgstr "" #: src/other-resources.md msgid "" -"[Rust for Embedded C Programmers](https://docs.opentitan.org/doc/ug/" -"rust_for_c/): covers Rust from the perspective of developers who write " -"firmware in C." +"[Rust for Embedded C Programmers](https://opentitan.org/book/doc/" +"rust_for_c_devs.html): covers Rust from the perspective of developers who " +"write firmware in C." msgstr "" "[Rust for Embedded C Programmers](https://docs.opentitan.org/doc/ug/" "rust_for_c/): explica Rust desde la perspectiva de los desarrolladores que " @@ -23989,11 +24103,16 @@ msgstr "" #: src/other-resources.md msgid "" -"[Advanced testing for Rust applications](https://github.com/mainmatter/rust-" -"advanced-testing-workshop): a self-paced workshop that goes beyond Rust's " -"built-in testing framework. It covers `googletest`, snapshot testing, " -"mocking as well as how to write your own custom test harness." +"[Advanced testing for Rust applications](https://rust-exercises.com/advanced-" +"testing/): a self-paced workshop that goes beyond Rust's built-in testing " +"framework. It covers `googletest`, snapshot testing, mocking as well as how " +"to write your own custom test harness." msgstr "" +"[Pruebas avanzadas para aplicaciones en Rust](https://rust-exercises.com/" +"advanced-testing/): un taller autodirigido que va más allá del marco de " +"pruebas integrado de Rust. Cubre `googletest`, pruebas de instantáneas, " +"simulaciones, así como cómo escribir tu propio arnés de pruebas " +"personalizado." #: src/other-resources.md msgid "" @@ -24090,9 +24209,120 @@ msgid "" "uses an image from [CXX](https://cxx.rs/). Please see the `third_party/cxx/` " "directory for details, including the license terms." msgstr "" -"En la sección [Interoperabilidad con C++](android/Interop/cpp.md) se usa una " -"imagen de [CXX](https://cxx.rs/). Consulta el directorio `third_party/cxx/` " -"para obtener más información, incluidos los términos de la licencia." +"En la sección [Interoperabilidad con C++](android/interoperability/cpp.md) " +"se usa una imagen de [CXX](https://cxx.rs/). Consulta el directorio " +"`third_party/cxx/` para obtener más información, incluidos los términos de " +"la licencia." + +#~ msgid "Slices: `&[T]`" +#~ msgstr "Slices: `&[T]`" + +#~ msgid "Slices: &\\[T\\]" +#~ msgstr "Slices: &\\[T\\]" + +#~ msgid "" +#~ "By default, closures will capture by reference if they can. The `move` " +#~ "keyword makes them capture by value." +#~ msgstr "" +#~ "De forma predeterminada, los cierres capturan, si pueden, por referencia. " +#~ "La palabra clave `move` hace que capturen por valor." + +#~ msgid "\"Expected `i32` to be an `I32` field\"" +#~ msgstr "\"`i32` era esperado ser un campo `I32`\"" + +#~ msgid "// Unwrap error because `value` is definitely 4 bytes long.\n" +#~ msgstr "// Desenvuelve el error porque `value` tiene 4 bytes.\n" + +#~ msgid "" +#~ "Make sure to implement the `std::error::Error` trait when defining a " +#~ "custom error type so it can be boxed. But if you need to support the " +#~ "`no_std` attribute, keep in mind that the `std::error::Error` trait is " +#~ "currently compatible with `no_std` in [nightly](https://github.com/rust-" +#~ "lang/rust/issues/103765) only." +#~ msgstr "" +#~ "Asegúrate de implementar el trait `std::error::Error` al definir un tipo " +#~ "de error personalizado para que pueda tener una estructura box. Sin " +#~ "embargo, si necesitas el atributo `no_std`, ten en cuenta que el trait " +#~ "`std::error::Error` de momento solo es compatible con `no_std` en " +#~ "[nightly](https://github.com/rust-lang/rust/issues/103765)." + +#~ msgid "" +#~ "There is a plan to transition [Android](https://source.android.com/docs/" +#~ "setup/build/bazel/introduction), [ChromeOS](https://chromium.googlesource." +#~ "com/chromiumos/bazel/), and [Fuchsia](https://source.android.com/docs/" +#~ "setup/build/bazel/introduction) to Bazel." +#~ msgstr "" +#~ "Está previsto hacer la transición de [Android](https://source.android.com/" +#~ "docs/setup/build/bazel/introduction), [ChromeOS](https://chromium." +#~ "googlesource.com/chromiumos/bazel/) y [Fuchsia](https://source.android." +#~ "com/docs/setup/build/bazel/introduction) a Bazel." + +#~ msgid "" +#~ "Learning Bazel-like build rules is useful for all Rust OS developers." +#~ msgstr "" +#~ "Aprender reglas de compilación similares a Bazel es útil para todos los " +#~ "desarrolladores del SO de Rust." + +#~ msgid "" +#~ "Threads are all daemon threads, the main thread does not wait for them." +#~ msgstr "" +#~ "Los hilos son todos hilos daemon, y el hilo principal no espera por ellos." + +#~ msgid "\"Felix\"" +#~ msgstr "\"Felix\"" + +#~ msgid "\"Failed to send cat.\"" +#~ msgstr "\"No se ha podido enviar el gato.\"" + +#~ msgid "\"Failed to send dog.\"" +#~ msgstr "\"No se ha podido enviar el perro.\"" + +#~ msgid "\"Failed to receive winner\"" +#~ msgstr "\"No se ha podido recibir el ganador\"" + +#~ msgid "\"Winner is {winner:?}\"" +#~ msgstr "\"El ganador es {winner:?}\"" + +#~ msgid "" +#~ "In this example, we have a race between a cat and a dog. " +#~ "`first_animal_to_finish_race` listens to both channels and will pick " +#~ "whichever arrives first. Since the dog takes 50ms, it wins against the " +#~ "cat that take 500ms." +#~ msgstr "" +#~ "En este ejemplo, tenemos una carrera entre un gato y un perro. " +#~ "`first_animal_to_finish_race` escucha a ambos canales y elige el que " +#~ "llegue primero. Como el perro tarda 50 ms, gana al gato, que tarda 500 ms." + +#~ msgid "" +#~ "You can use `oneshot` channels in this example as the channels are " +#~ "supposed to receive only one `send`." +#~ msgstr "" +#~ "En este ejemplo, puedes usar canales `oneshot`, ya que se supone que solo " +#~ "recibirán un `send`." + +#~ msgid "" +#~ "Try adding a deadline to the race, demonstrating selecting different " +#~ "sorts of futures." +#~ msgstr "" +#~ "Prueba a añadir un límite a la carrera y demuestra cómo se seleccionan " +#~ "distintos tipos de futuros." + +#~ msgid "" +#~ "Note that `select!` drops unmatched branches, which cancels their " +#~ "futures. It is easiest to use when every execution of `select!` creates " +#~ "new futures." +#~ msgstr "" +#~ "Ten en cuenta que `select!` elimina las ramas sin coincidencias, " +#~ "cancelando así sus futuros. Es más fácil de usar cuando cada ejecución de " +#~ "`select!` crea futuros." + +#~ msgid "" +#~ "An alternative is to pass `&mut future` instead of the future itself, but " +#~ "this can lead to issues, further discussed in the pinning slide." +#~ msgstr "" +#~ "También puedes enviar `&mut future` en lugar del futuro en sí, pero esto " +#~ "podría provocar problemas, como se explica más adelante en la diapositiva " +#~ "sobre pines." #~ msgid "Conditionals" #~ msgstr "Condicionales"