From fa29bcf662a11f395adaf4999a5b9a2f7b753df6 Mon Sep 17 00:00:00 2001 From: Abhik Banerjee <38981107+abhik-99@users.noreply.github.com> Date: Fri, 8 Mar 2024 00:44:49 +0530 Subject: [PATCH] Refreshed Bengali Translations and Added New Translations to Bengali (#1876) This PR aims to do the following: 1. Refresh the Bengali Translations 2. Add new translations in line with #653 to complete up to 10%. 3. Corrections to existing translations. Edit: Recent commits bump up the % completed to 12. --------- Co-authored-by: abhik-bits <127435906+abhik-bits@users.noreply.github.com> Co-authored-by: Mir Wasi Ahmed <1697945+mirwasi@users.noreply.github.com> --- po/bn.po | 3904 +++++++++++++++++++++++++++--------------------------- 1 file changed, 1934 insertions(+), 1970 deletions(-) diff --git a/po/bn.po b/po/bn.po index 9675dc4f..b9e62d14 100644 --- a/po/bn.po +++ b/po/bn.po @@ -1,16 +1,16 @@ msgid "" msgstr "" "Project-Id-Version: Comprehensive Rust đŸĻ€\n" -"POT-Creation-Date: 2024-01-24T13:24:49+01:00\n" +"POT-Creation-Date: 2024-03-03T20:37:57+05:30\n" "PO-Revision-Date: \n" -"Last-Translator: Md. Rasel Mandol \n" -"Language-Team: noob_rasel\n" +"Last-Translator: Abhik Banerjee \n" +"Language-Team: abhik-99, noob_rasel\n" "Language: bn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n==0 || n==1);\n" -"X-Generator: Poedit 3.3.1\n" +"X-Generator: Poedit 3.4.2\n" #: src/SUMMARY.md src/index.md msgid "Welcome to Comprehensive Rust đŸĻ€" @@ -56,26 +56,25 @@ msgstr "āĻĒā§āĻ°āĻĨāĻŽ āĻĻāĻŋāĻ¨āĻƒ āĻ¸āĻ•āĻžāĻ˛" msgid "Welcome" msgstr "āĻ¸ā§āĻŦāĻžāĻ—āĻ¤āĻŽ" -#: src/SUMMARY.md src/hello-world.md src/hello-world/hello-world.md -#, fuzzy +#: src/SUMMARY.md src/hello-world.md src/types-and-values/hello-world.md msgid "Hello, World" -msgstr "Hello World!" +msgstr "āĻšā§āĻ¯āĻžāĻ˛ā§‹ āĻ“ā§ŸāĻžāĻ°ā§āĻ˛ā§āĻĄ" #: src/SUMMARY.md src/hello-world/what-is-rust.md msgid "What is Rust?" -msgstr "Rust āĻ•āĻŋ?" +msgstr "āĻ°āĻžāĻ¸ā§āĻŸ āĻ•āĻŋ?" #: src/SUMMARY.md src/hello-world/benefits.md msgid "Benefits of Rust" -msgstr "" +msgstr "āĻ°āĻžāĻ¸ā§āĻŸ āĻāĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻž" #: src/SUMMARY.md src/hello-world/playground.md msgid "Playground" -msgstr "" +msgstr "āĻĒā§āĻ˛ā§‡āĻ—ā§āĻ°āĻžāĻ‰āĻ¨ā§āĻĄ" #: src/SUMMARY.md src/types-and-values.md msgid "Types and Values" -msgstr "" +msgstr "āĻŸāĻžāĻ‡āĻĒ āĻāĻŦāĻ‚ āĻŽāĻžāĻ¨" #: src/SUMMARY.md src/types-and-values/variables.md msgid "Variables" @@ -83,11 +82,11 @@ msgstr "āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛" #: src/SUMMARY.md src/types-and-values/values.md msgid "Values" -msgstr "" +msgstr "āĻŽāĻžāĻ¨" #: src/SUMMARY.md src/types-and-values/arithmetic.md msgid "Arithmetic" -msgstr "" +msgstr "āĻ…āĻ™ā§āĻ•āĻļāĻžāĻ¸ā§āĻ¤ā§āĻ°" #: src/SUMMARY.md src/types-and-values/strings.md msgid "Strings" @@ -99,7 +98,7 @@ msgstr "āĻŸāĻžāĻ‡āĻĒ āĻ…āĻ¨ā§āĻŽāĻžāĻ¨" #: src/SUMMARY.md src/types-and-values/exercise.md msgid "Exercise: Fibonacci" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻĢāĻŋāĻŦā§‹āĻ¨āĻžāĻšā§āĻšāĻŋ" #: src/SUMMARY.md src/types-and-values/solution.md #: src/control-flow-basics/solution.md src/tuples-and-arrays/solution.md @@ -111,30 +110,44 @@ msgstr "" #: src/slices-and-lifetimes/solution.md src/iterators/solution.md #: src/modules/solution.md src/testing/solution.md #: src/error-handling/solution.md src/unsafe-rust/solution.md -#, fuzzy msgid "Solution" -msgstr "āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĻ¸āĻŽā§‚āĻš" +msgstr "āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨" #: src/SUMMARY.md src/control-flow-basics.md -#, fuzzy msgid "Control Flow Basics" -msgstr "āĻĒā§āĻ°āĻŦāĻžāĻš āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ" +msgstr "āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡āĻ° āĻĒā§āĻ°āĻŦāĻžāĻš āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖā§‡āĻ° āĻŽā§ŒāĻ˛āĻŋāĻ• āĻŦāĻŋāĻˇāĻ¯āĻŧ" -#: src/SUMMARY.md src/control-flow-basics/conditionals.md -msgid "Conditionals" -msgstr "" +#: src/SUMMARY.md +msgid "`if` Expressions" +msgstr "if āĻ…āĻ­āĻŋāĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ" #: src/SUMMARY.md src/control-flow-basics/loops.md msgid "Loops" -msgstr "" +msgstr "āĻ˛ā§āĻĒā§āĻ¸" + +#: src/SUMMARY.md src/control-flow-basics/loops/for.md +msgid "`for`" +msgstr "`for`" + +#: src/SUMMARY.md src/control-flow-basics/loops/loop.md +msgid "`loop`" +msgstr "`loop`" #: src/SUMMARY.md src/control-flow-basics/break-continue.md msgid "`break` and `continue`" -msgstr "" +msgstr "`break` āĻāĻŦāĻ‚ `continue`" + +#: src/SUMMARY.md src/control-flow-basics/break-continue/labels.md +msgid "Labels" +msgstr "āĻ˛ā§‡āĻŦā§‡āĻ˛" #: src/SUMMARY.md src/control-flow-basics/blocks-and-scopes.md msgid "Blocks and Scopes" -msgstr "" +msgstr "āĻŦā§āĻ˛āĻ• āĻāĻŦāĻ‚ āĻ¸ā§āĻ•ā§‹āĻĒ" + +#: src/SUMMARY.md src/control-flow-basics/blocks-and-scopes/scopes.md +msgid "Scopes and Shadowing" +msgstr "āĻĒā§āĻ°āĻ¸āĻžāĻ° āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¤āĻŋāĻšā§āĻ›āĻžāĻ¯āĻŧāĻž āĻ•āĻ°āĻž" #: src/SUMMARY.md src/control-flow-basics/functions.md msgid "Functions" @@ -142,11 +155,11 @@ msgstr "āĻĢāĻžāĻ‚āĻļāĻ¨" #: src/SUMMARY.md src/control-flow-basics/macros.md msgid "Macros" -msgstr "" +msgstr "āĻŽā§āĻ¯āĻžāĻ•ā§āĻ°ā§‹" #: src/SUMMARY.md src/control-flow-basics/exercise.md msgid "Exercise: Collatz Sequence" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻ•āĻ˛ā§āĻ¯āĻžāĻŸāĻœ āĻāĻ° āĻ•ā§āĻ°āĻŽ" #: src/SUMMARY.md msgid "Day 1: Afternoon" @@ -155,53 +168,43 @@ msgstr "āĻĒā§āĻ°āĻĨāĻŽ āĻĻāĻŋāĻ¨āĻƒ āĻŦāĻŋāĻ•āĻžāĻ˛" #: src/SUMMARY.md src/tuples-and-arrays.md #: src/tuples-and-arrays/tuples-and-arrays.md msgid "Tuples and Arrays" -msgstr "" +msgstr "āĻŸāĻŋāĻ‰āĻĒāĻ˛ āĻāĻŦāĻ‚ āĻ…ā§āĻ¯āĻžāĻ°ā§‡" #: src/SUMMARY.md src/tuples-and-arrays/iteration.md -#, fuzzy msgid "Array Iteration" -msgstr "Iterator" - -#: src/SUMMARY.md src/tuples-and-arrays/match.md src/pattern-matching.md -msgid "Pattern Matching" -msgstr "āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻŽāĻŋāĻ˛āĻžāĻ¨ā§‹" +msgstr "āĻ…ā§āĻ¯āĻžāĻ°ā§‡ āĻāĻ° āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ" #: src/SUMMARY.md src/tuples-and-arrays/destructuring.md -#: src/pattern-matching/destructuring.md -#, fuzzy -msgid "Destructuring" -msgstr "Enums āĻĄāĻŋāĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻšāĻžāĻ°" +msgid "Patterns and Destructuring" +msgstr "āĻĸāĻ•-āĻ āĻĢā§‡āĻ˛āĻž āĻāĻŦāĻ‚ āĻĄāĻŋāĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻšāĻžāĻ° āĻ•āĻ°āĻž" #: src/SUMMARY.md src/tuples-and-arrays/exercise.md msgid "Exercise: Nested Arrays" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ…ā§āĻ¯āĻžāĻ°ā§‡" #: src/SUMMARY.md src/references.md msgid "References" msgstr "āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸" #: src/SUMMARY.md src/references/shared.md -#, fuzzy msgid "Shared References" -msgstr "āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸" +msgstr "āĻ­āĻžāĻ— āĻ•āĻ°āĻž āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸" #: src/SUMMARY.md src/references/exclusive.md -#, fuzzy msgid "Exclusive References" -msgstr "āĻĄā§āĻ¯āĻžāĻ™ā§āĻ—āĻ˛āĻŋāĻ‚ āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸" +msgstr "āĻāĻ•āĻšā§‡āĻŸāĻŋāĻ¯āĻŧāĻž āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸" #: src/SUMMARY.md src/references/exercise.md msgid "Exercise: Geometry" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻœā§āĻ¯āĻžāĻŽāĻŋāĻ¤āĻŋ" #: src/SUMMARY.md src/user-defined-types.md msgid "User-Defined Types" -msgstr "" +msgstr "āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻŸāĻžāĻ‡āĻĒ" #: src/SUMMARY.md src/user-defined-types/named-structs.md -#, fuzzy msgid "Named Structs" -msgstr "Structs" +msgstr "āĻ…āĻ­āĻŋāĻšāĻŋāĻ¤ Structs (āĻ—āĻ āĻ¨)" #: src/SUMMARY.md src/user-defined-types/tuple-structs.md msgid "Tuple Structs" @@ -213,35 +216,44 @@ msgid "Enums" msgstr "Enums" #: src/SUMMARY.md src/user-defined-types/static-and-const.md -#, fuzzy msgid "Static and Const" -msgstr "static & const" +msgstr "Static āĻāĻŦāĻ‚ Const" #: src/SUMMARY.md src/user-defined-types/aliases.md msgid "Type Aliases" -msgstr "" +msgstr "āĻŸāĻžāĻ‡āĻĒ āĻāĻ° āĻ‰āĻĒāĻ¨āĻžāĻŽ" #: src/SUMMARY.md src/user-defined-types/exercise.md msgid "Exercise: Elevator Events" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻ˛āĻŋāĻĢāĻŸ āĻāĻ° āĻ˜āĻŸāĻ¨āĻžāĻŦāĻ˛ā§€" #: src/SUMMARY.md msgid "Day 2: Morning" msgstr "āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻĻāĻŋāĻ¨āĻƒ āĻ¸āĻ•āĻžāĻ˛" +#: src/SUMMARY.md src/pattern-matching.md +msgid "Pattern Matching" +msgstr "āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻŽāĻŋāĻ˛āĻžāĻ¨ā§‹" + +#: src/SUMMARY.md src/pattern-matching/match.md +msgid "Matching Values" +msgstr "āĻŽāĻžāĻ¨ āĻŽā§‡āĻ˛āĻžāĻ¨ā§‹" + +#: src/SUMMARY.md src/pattern-matching/destructuring.md +msgid "Destructuring" +msgstr "āĻĄāĻŋāĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻšāĻžāĻ° āĻ•āĻ°āĻž" + #: src/SUMMARY.md src/pattern-matching/let-control-flow.md -#, fuzzy msgid "Let Control Flow" -msgstr "āĻĒā§āĻ°āĻŦāĻžāĻš āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ" +msgstr "Let āĻāĻ° āĻĒā§āĻ°āĻŦāĻžāĻš āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ" #: src/SUMMARY.md src/pattern-matching/exercise.md msgid "Exercise: Expression Evaluation" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻ…āĻ­āĻŋāĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨" #: src/SUMMARY.md src/methods-and-traits.md -#, fuzzy msgid "Methods and Traits" -msgstr "Read āĻāĻŦāĻ‚ Write" +msgstr "āĻŽā§‡āĻĨāĻĄ āĻāĻŦāĻ‚ āĻŸā§āĻ°ā§‡āĻ‡āĻŸ" #: src/SUMMARY.md src/methods-and-traits/methods.md msgid "Methods" @@ -249,29 +261,31 @@ msgstr "āĻŽā§‡āĻĨāĻĄāĻ¸" #: src/SUMMARY.md src/methods-and-traits/traits.md msgid "Traits" -msgstr "Traits" +msgstr "āĻŸā§āĻ°ā§‡āĻ‡āĻŸ" + +#: src/SUMMARY.md +msgid "Implmementing Traits" +msgstr "āĻŸā§āĻ°ā§‡āĻ‡āĻŸ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž" + +#: src/SUMMARY.md src/methods-and-traits/traits/associated-types.md +msgid "Associated Types" +msgstr "āĻ¯ā§āĻ•ā§āĻ¤ āĻŸāĻžāĻ‡āĻĒ" #: src/SUMMARY.md src/methods-and-traits/deriving.md -#, fuzzy msgid "Deriving" -msgstr "Deriving Traits" - -#: src/SUMMARY.md src/methods-and-traits/trait-objects.md -msgid "Trait Objects" -msgstr "Trait Objects" +msgstr "āĻ†āĻšāĻ°āĻŖ āĻ•āĻ°āĻž" #: src/SUMMARY.md src/methods-and-traits/exercise.md msgid "Exercise: Generic Logger" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ• āĻ¤āĻĨā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻ¤āĻž" #: src/SUMMARY.md src/generics.md msgid "Generics" msgstr "āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ•āĻ¸" #: src/SUMMARY.md src/generics/generic-functions.md -#, fuzzy msgid "Generic Functions" -msgstr "āĻŦāĻšāĻŋāĻ°āĻžāĻ—āĻ¤ āĻĢāĻžāĻ‚āĻļāĻ¨" +msgstr "āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ• āĻĒāĻĻā§āĻ§āĻ¤āĻŋ" #: src/SUMMARY.md src/generics/generic-data.md msgid "Generic Data Types" @@ -279,99 +293,92 @@ msgstr "āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ• āĻĄā§‡āĻŸāĻž āĻŸāĻžāĻ‡āĻĒ" #: src/SUMMARY.md src/generics/trait-bounds.md msgid "Trait Bounds" -msgstr "Trait Bounds" +msgstr "āĻŸā§āĻ°ā§‡āĻ‡āĻŸ āĻāĻ° āĻ¸ā§€āĻŽāĻžāĻ¨āĻž" #: src/SUMMARY.md src/generics/impl-trait.md msgid "`impl Trait`" -msgstr "" +msgstr "`impl Trait`" #: src/SUMMARY.md src/generics/exercise.md msgid "Exercise: Generic `min`" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ• `min`" #: src/SUMMARY.md msgid "Day 2: Afternoon" msgstr "āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻĻāĻŋāĻ¨āĻƒ āĻŦāĻŋāĻ•āĻžāĻ˛" #: src/SUMMARY.md src/std-types.md -#, fuzzy msgid "Standard Library Types" -msgstr "āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ" +msgstr "āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ° āĻŸāĻžāĻ‡āĻĒ" #: src/SUMMARY.md src/std-types/std.md msgid "Standard Library" msgstr "āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ" #: src/SUMMARY.md src/std-types/docs.md -#, fuzzy msgid "Documentation" -msgstr "āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨ āĻŸā§‡āĻ¸ā§āĻŸ" +msgstr "āĻĻāĻ˛āĻŋāĻ˛" #: src/SUMMARY.md msgid "`Option`" -msgstr "" +msgstr "`Option`" #: src/SUMMARY.md msgid "`Result`" -msgstr "" +msgstr "`Result`" -#: src/SUMMARY.md src/android/interoperability/cpp/type-mapping.md -#, fuzzy +#: src/SUMMARY.md src/android/aidl/types/primitives.md +#: src/android/interoperability/cpp/type-mapping.md msgid "`String`" -msgstr "String" +msgstr "`String`" #: src/SUMMARY.md src/std-types/vec.md msgid "`Vec`" -msgstr "" +msgstr "`Vec`" #: src/SUMMARY.md src/std-types/hashmap.md src/bare-metal/no_std.md msgid "`HashMap`" -msgstr "" +msgstr "`HashMap`" #: src/SUMMARY.md src/std-types/exercise.md -#, fuzzy msgid "Exercise: Counter" -msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨: āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžā§ŸāĻ•" #: src/SUMMARY.md src/std-traits.md -#, fuzzy msgid "Standard Library Traits" -msgstr "āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ" +msgstr "āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ° āĻŸā§āĻ°ā§‡āĻ‡āĻŸ" #: src/SUMMARY.md src/std-traits/comparisons.md src/async.md msgid "Comparisons" msgstr "āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¸āĻŽā§‚āĻš" #: src/SUMMARY.md src/std-traits/operators.md -#, fuzzy msgid "Operators" -msgstr "Iterator" +msgstr "āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻ•" #: src/SUMMARY.md src/std-traits/from-and-into.md msgid "`From` and `Into`" -msgstr "" +msgstr "`From` āĻāĻŦāĻ‚ `Into`" #: src/SUMMARY.md src/std-traits/casting.md -#, fuzzy msgid "Casting" -msgstr "āĻŸā§‡āĻ¸ā§āĻŸāĻŋāĻ‚" +msgstr "āĻ¨āĻŋāĻ•ā§āĻˇā§‡āĻĒāĻŖ āĻ•āĻ°āĻž" #: src/SUMMARY.md src/std-traits/read-and-write.md msgid "`Read` and `Write`" -msgstr "" +msgstr "`Read` āĻāĻŦāĻ‚ `Write`" #: src/SUMMARY.md msgid "`Default`, struct update syntax" -msgstr "" +msgstr "`Default`, āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸā§‡āĻ° āĻšāĻžāĻ˛āĻ¨āĻžāĻ—āĻžāĻĻ āĻ•āĻ°āĻŦāĻžāĻ° āĻŦāĻžāĻ•ā§āĻ¯ āĻ—āĻ āĻ¨" #: src/SUMMARY.md src/std-traits/closures.md msgid "Closures" -msgstr "" +msgstr "āĻ•ā§āĻ˛ā§‹āĻœāĻžāĻ°ā§‡āĻ¸ (Closures)" #: src/SUMMARY.md src/std-traits/exercise.md -#, fuzzy msgid "Exercise: ROT13" -msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻ°ā§‹.āĻ“.t ā§§ā§Š (ROT 13)" #: src/SUMMARY.md msgid "Day 3: Morning" @@ -383,12 +390,11 @@ msgstr "āĻŽā§‡āĻŽā§‹āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž" #: src/SUMMARY.md src/memory-management/review.md msgid "Review of Program Memory" -msgstr "" +msgstr "āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡āĻ° āĻ¸ā§āĻŽā§ƒāĻ¤āĻŋāĻ° (Memory) āĻŦā§āĻ¯āĻžāĻĒāĻžāĻ°ā§‡ āĻĒāĻ°ā§āĻ¯āĻžāĻ˛ā§‹āĻšāĻ¨āĻž" #: src/SUMMARY.md src/memory-management/approaches.md -#, fuzzy msgid "Approaches to Memory Management" -msgstr "Rust āĻŽā§‡āĻŽā§‹āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž" +msgstr "āĻŽā§‡āĻŽāĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻžāĻ° āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ" #: src/SUMMARY.md src/memory-management/ownership.md msgid "Ownership" @@ -396,42 +402,44 @@ msgstr "āĻŽāĻžāĻ˛āĻŋāĻ•āĻžāĻ¨āĻž" #: src/SUMMARY.md src/memory-management/move.md msgid "Move Semantics" -msgstr "" +msgstr "āĻŽā§āĻ­ āĻāĻ° āĻļāĻŦā§āĻĻāĻžāĻ°ā§āĻĨāĻŦāĻŋāĻĻā§āĻ¯āĻž" #: src/SUMMARY.md msgid "`Clone`" -msgstr "" +msgstr "`Clone`" #: src/SUMMARY.md src/memory-management/copy-types.md -#, fuzzy msgid "Copy Types" -msgstr "āĻ•āĻŽā§āĻĒāĻžāĻ‰āĻ¨ā§āĻĄ āĻŸāĻžāĻ‡āĻĒ" +msgstr "āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻŸāĻžāĻ‡āĻĒāĻ—ā§āĻ˛āĻŋ" #: src/SUMMARY.md -#, fuzzy msgid "`Drop`" -msgstr "Drop" +msgstr "`Drop`" #: src/SUMMARY.md src/memory-management/exercise.md msgid "Exercise: Builder Type" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻ°āĻšāĻ¨āĻžāĻ•āĻžāĻ°ā§€ āĻŸāĻžāĻ‡āĻĒ" #: src/SUMMARY.md src/smart-pointers.md msgid "Smart Pointers" -msgstr "" +msgstr "āĻŦā§āĻĻā§āĻ§āĻŋāĻŽāĻžāĻ¨ āĻ‡āĻ™ā§āĻ—āĻŋāĻ¤āĻ•āĻžāĻ°ā§€ (āĻ¸ā§āĻŽāĻžāĻ°ā§āĻŸ āĻĒā§Ÿā§‡āĻ¨ā§āĻŸāĻžāĻ°)" #: src/SUMMARY.md src/smart-pointers/box.md #: src/android/interoperability/cpp/type-mapping.md msgid "`Box`" -msgstr "" +msgstr "`Box`" #: src/SUMMARY.md src/smart-pointers/rc.md msgid "`Rc`" -msgstr "" +msgstr "`Rc`" + +#: src/SUMMARY.md src/smart-pointers/trait-objects.md +msgid "Trait Objects" +msgstr "Trait Objects" #: src/SUMMARY.md src/smart-pointers/exercise.md msgid "Exercise: Binary Tree" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻĻā§āĻ‡ āĻšāĻ˛āĻŦāĻŋāĻļāĻŋāĻˇā§āĻŸ āĻ¤āĻ°ā§‚" #: src/SUMMARY.md msgid "Day 3: Afternoon" @@ -442,84 +450,72 @@ msgid "Borrowing" msgstr "āĻ§āĻžāĻ° āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž" #: src/SUMMARY.md src/borrowing/shared.md -#, fuzzy msgid "Borrowing a Value" -msgstr "āĻ§āĻžāĻ° āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž" +msgstr "āĻāĻ•āĻŸāĻŋ āĻŽā§āĻ¯āĻžāĻ¨ āĻ§āĻžāĻ° āĻ¨ā§‡āĻ“ā§ŸāĻž" #: src/SUMMARY.md src/borrowing/borrowck.md -#, fuzzy msgid "Borrow Checking" -msgstr "āĻ§āĻžāĻ° āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž" +msgstr "āĻ§āĻžāĻ° āĻ¨ā§‡āĻ“ā§ŸāĻž āĻŽā§āĻ¯āĻžāĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž" #: src/SUMMARY.md src/borrowing/interior-mutability.md -#, fuzzy msgid "Interior Mutability" msgstr "āĻ†āĻ¨ā§āĻ¤āĻƒāĻ•āĻžāĻ°ā§āĻ¯āĻ•ā§āĻˇāĻŽāĻ¤āĻž" #: src/SUMMARY.md src/borrowing/exercise.md -#, fuzzy msgid "Exercise: Health Statistics" -msgstr "āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āĻ¯ āĻĒāĻ°āĻŋāĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ¨" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āĻ¯ āĻĒāĻ°āĻŋāĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ¨" #: src/SUMMARY.md src/slices-and-lifetimes.md -#, fuzzy msgid "Slices and Lifetimes" -msgstr "āĻœā§€āĻŦāĻ¨āĻ•āĻžāĻ˛" +msgstr "āĻŸā§āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻœā§€āĻŦāĻ¨āĻ•āĻžāĻ˛" #: src/SUMMARY.md -#, fuzzy msgid "Slices: `&[T]`" -msgstr "Slices" +msgstr "āĻŸā§āĻ•āĻ°āĻž: `&[T]`" #: src/SUMMARY.md src/slices-and-lifetimes/str.md -#, fuzzy msgid "String References" -msgstr "āĻĄā§āĻ¯āĻžāĻ™ā§āĻ—āĻ˛āĻŋāĻ‚ āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸" +msgstr "āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸" #: src/SUMMARY.md src/slices-and-lifetimes/lifetime-annotations.md -#, fuzzy msgid "Lifetime Annotations" -msgstr "āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ•āĻ˛ āĻ āĻœā§€āĻŦāĻ¨āĻ•āĻžāĻ˛" +msgstr "āĻœā§€āĻŦāĻ¨āĻ•āĻžāĻ˛ā§‡āĻ° āĻŸā§€āĻ•āĻž" #: src/SUMMARY.md -#, fuzzy msgid "Lifetime Elision" -msgstr "āĻœā§€āĻŦāĻ¨āĻ•āĻžāĻ˛" +msgstr "āĻœā§€āĻŦāĻ¨āĻ•āĻžāĻ˛ā§‡āĻ° āĻ˛ā§‡āĻžāĻĒ" #: src/SUMMARY.md -#, fuzzy msgid "Struct Lifetimes" -msgstr "āĻœā§€āĻŦāĻ¨āĻ•āĻžāĻ˛" +msgstr "āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸā§‡āĻ° āĻœā§€āĻŦāĻ¨āĻ•āĻžāĻ˛" #: src/SUMMARY.md src/slices-and-lifetimes/exercise.md msgid "Exercise: Protobuf Parsing" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻĒā§āĻ°ā§‹āĻŸā§‹āĻŦāĻžāĻĢ āĻĒāĻĻāĻžāĻ¨ā§āĻŦāĻ¯āĻŧ āĻ•āĻ°āĻž" #: src/SUMMARY.md -#, fuzzy msgid "Day 4: Morning" -msgstr "āĻĒā§āĻ°āĻĨāĻŽ āĻĻāĻŋāĻ¨āĻƒ āĻ¸āĻ•āĻžāĻ˛" +msgstr "āĻšāĻĨā§āĻ°ā§āĻ¤ āĻĻāĻŋāĻ¨: āĻ¸āĻ•āĻžāĻ˛āĻŦā§‡āĻ˛āĻž" #: src/SUMMARY.md src/iterators.md msgid "Iterators" -msgstr "" +msgstr "āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋāĻ•āĻžāĻ°ā§€" #: src/SUMMARY.md src/iterators/iterator.md src/bare-metal/no_std.md msgid "`Iterator`" -msgstr "" +msgstr "`Iterator`" #: src/SUMMARY.md src/iterators/intoiterator.md msgid "`IntoIterator`" -msgstr "" +msgstr "`IntoIterator`" #: src/SUMMARY.md -#, fuzzy msgid "`FromIterator`" -msgstr "FromIterator" +msgstr "`FromIterator`" #: src/SUMMARY.md src/iterators/exercise.md msgid "Exercise: Iterator Method Chaining" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋāĻ•āĻžāĻ°ā§€ āĻŽāĻžāĻ˛āĻžāĻŦāĻ¨ā§āĻ§āĻ¨" #: src/SUMMARY.md src/modules.md src/modules/modules.md msgid "Modules" @@ -535,11 +531,11 @@ msgstr "āĻĻā§ƒāĻļā§āĻ¯āĻŽāĻžāĻ¨āĻ¤āĻž" #: src/SUMMARY.md msgid "`use`, `super`, `self`" -msgstr "" +msgstr "`use`, `super`, `self`" #: src/SUMMARY.md src/modules/exercise.md msgid "Exercise: Modules for a GUI Library" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻāĻ•āĻŸāĻŋ āĻœāĻŋ.āĻ‡āĻ‰.āĻ†āĻ‡ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻŦāĻžāĻ¨āĻžāĻŦāĻžāĻ° āĻŽāĻĄāĻŋāĻ‰āĻ˛" #: src/SUMMARY.md src/testing.md src/chromium/testing.md msgid "Testing" @@ -550,9 +546,8 @@ msgid "Test Modules" msgstr "āĻŸā§‡āĻ¸ā§āĻŸ āĻŽāĻĄāĻŋāĻ‰āĻ˛" #: src/SUMMARY.md src/testing/other.md -#, fuzzy msgid "Other Types of Tests" -msgstr "āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ‰ā§ŽāĻ¸āĻ¸āĻŽā§‚āĻš" +msgstr "āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻŸāĻžāĻ‡āĻĒā§‡āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž" #: src/SUMMARY.md src/testing/useful-crates.md msgid "Useful Crates" @@ -560,25 +555,23 @@ msgstr "āĻ‰āĻĒāĻ•āĻžāĻ°ā§€ āĻ•ā§āĻ°ā§‡āĻŸāĻ¸āĻŽā§‚āĻš" #: src/SUMMARY.md src/testing/googletest.md msgid "GoogleTest" -msgstr "" +msgstr "GoogleTest" #: src/SUMMARY.md src/testing/mocking.md msgid "Mocking" -msgstr "" +msgstr "āĻ‰āĻĒāĻšāĻžāĻ¸ āĻ•āĻ°āĻž" #: src/SUMMARY.md src/testing/lints.md msgid "Compiler Lints and Clippy" -msgstr "" +msgstr "āĻ¸āĻ‚āĻ•āĻ˛āĻ¨āĻ•āĻžāĻ°ā§€ (āĻ•āĻŽā§āĻĒāĻžāĻ‡āĻ˛āĻžāĻ°) āĻāĻ° āĻ˛āĻŋāĻ¨ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻāĻŦāĻ‚ āĻ•ā§āĻ˛āĻŋāĻĒāĻŋ" #: src/SUMMARY.md src/testing/exercise.md -#, fuzzy msgid "Exercise: Luhn Algorithm" -msgstr "āĻ˛ā§āĻ¨ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻ˛ā§āĻ¨ āĻāĻ° āĻ—āĻžāĻŖāĻŋāĻ¤āĻŋāĻ• āĻĒāĻ°āĻŋāĻ­āĻžāĻˇāĻž" #: src/SUMMARY.md -#, fuzzy msgid "Day 4: Afternoon" -msgstr "āĻĒā§āĻ°āĻĨāĻŽ āĻĻāĻŋāĻ¨āĻƒ āĻŦāĻŋāĻ•āĻžāĻ˛" +msgstr "āĻšāĻ¤ā§āĻ°ā§āĻĨ āĻĻāĻŋāĻ¨: āĻĻā§āĻĒā§āĻ°āĻŦā§‡āĻ˛āĻž" #: src/SUMMARY.md src/error-handling.md msgid "Error Handling" @@ -589,36 +582,32 @@ msgid "Panics" msgstr "Panics-āĻĒā§āĻ¯āĻžāĻ¨āĻŋāĻ•" #: src/SUMMARY.md src/error-handling/try.md -#, fuzzy msgid "Try Operator" -msgstr "Iterator" +msgstr "Try āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻ•" #: src/SUMMARY.md src/error-handling/try-conversions.md -#, fuzzy msgid "Try Conversions" -msgstr "āĻ‡āĻŽāĻĒā§āĻ˛āĻŋāĻ¸āĻŋāĻŸ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ°" +msgstr "Try āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ°" #: src/SUMMARY.md -#, fuzzy msgid "`Error` Trait" -msgstr "āĻ†āĻ°āĻ“ Traits" +msgstr "`Error` āĻŸā§āĻ°ā§‡āĻ‡āĻŸ" #: src/SUMMARY.md src/error-handling/thiserror-and-anyhow.md msgid "`thiserror` and `anyhow`" -msgstr "" +msgstr "`thiserror` āĻāĻŦāĻ‚ `anyhow`" #: src/SUMMARY.md msgid "Exercise: Rewriting with `Result`" -msgstr "" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: `Result` āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ†āĻŦāĻžāĻ° āĻ˛ā§‡āĻ–āĻž" #: src/SUMMARY.md src/unsafe-rust.md src/unsafe-rust/unsafe.md msgid "Unsafe Rust" msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻ°āĻžāĻ¸ā§āĻŸ" #: src/SUMMARY.md -#, fuzzy msgid "Unsafe" -msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻ°āĻžāĻ¸ā§āĻŸ" +msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ" #: src/SUMMARY.md src/unsafe-rust/dereferencing.md msgid "Dereferencing Raw Pointers" @@ -633,19 +622,16 @@ msgid "Unions" msgstr "Unions" #: src/SUMMARY.md src/unsafe-rust/unsafe-functions.md -#, fuzzy msgid "Unsafe Functions" -msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻĄāĻžāĻ•āĻž" +msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻ•āĻžāĻœāĻ•āĻ°ā§āĻŽ" #: src/SUMMARY.md -#, fuzzy msgid "Unsafe Traits" -msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ Traits āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨" +msgstr "āĻ¨āĻžāĻ¨āĻžāĻ¨ āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻŸā§āĻ°ā§‡āĻ‡āĻŸ" #: src/SUMMARY.md -#, fuzzy msgid "Exercise: FFI Wrapper" -msgstr "āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ FFI āĻŽā§‹āĻĄāĻŧāĻ•" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€: āĻāĻĢ . āĻāĻĢ . āĻ†āĻ‡ āĻŽā§‹āĻĄāĻŧāĻ•" #: src/SUMMARY.md src/bare-metal/android.md msgid "Android" @@ -671,19 +657,27 @@ msgstr "āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ" msgid "AIDL" msgstr "AIDL" +#: src/SUMMARY.md src/android/aidl/birthday-service.md +msgid "Birthday Service Tutorial" +msgstr "āĻœāĻ¨ā§āĻŽāĻĻāĻŋāĻ¨ā§‡āĻ° āĻ¸ā§‡āĻŦāĻžāĻ° āĻŸāĻŋāĻ‰āĻŸā§‹āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛" + #: src/SUMMARY.md msgid "Interface" msgstr "āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸" #: src/SUMMARY.md -msgid "Implementation" -msgstr "āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨" +msgid "Service API" +msgstr "āĻ¸āĻžāĻ°ā§āĻ­āĻŋāĻ¸ āĻ . āĻĒāĻŋ . āĻ†āĻ‡" + +#: src/SUMMARY.md +msgid "Service" +msgstr "āĻ¸āĻžāĻ°ā§āĻ­āĻŋāĻ¸" #: src/SUMMARY.md msgid "Server" msgstr "āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°" -#: src/SUMMARY.md src/android/aidl/deploy.md +#: src/SUMMARY.md src/android/aidl/example-service/deploy.md msgid "Deploy" msgstr "āĻ¸ā§āĻĨāĻžāĻĒāĻ¨" @@ -691,10 +685,38 @@ msgstr "āĻ¸ā§āĻĨāĻžāĻĒāĻ¨" msgid "Client" msgstr "āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ" -#: src/SUMMARY.md src/android/aidl/changing.md +#: src/SUMMARY.md src/android/aidl/example-service/changing-definition.md msgid "Changing API" msgstr "API āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨" +#: src/SUMMARY.md +msgid "Updating Implementations" +msgstr "āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻšāĻžāĻ˛ āĻ¨āĻžāĻ—āĻžāĻĻ āĻ•āĻ°āĻž" + +#: src/SUMMARY.md +msgid "AIDL Types" +msgstr "āĻ.āĻ†āĻ‡.āĻĻāĻŋ.āĻāĻ˛ āĻŸāĻžāĻ‡āĻĒ" + +#: src/SUMMARY.md src/android/aidl/types/primitives.md +msgid "Primitive Types" +msgstr "āĻŦāĻ¨āĻŋāĻ¯āĻŧāĻžāĻĻāĻŋ āĻŸāĻžāĻ‡āĻĒ" + +#: src/SUMMARY.md src/android/aidl/types/arrays.md +msgid "Array Types" +msgstr "āĻ…ā§āĻ¯āĻžāĻ°ā§‡ āĻāĻ° āĻŸāĻžāĻ‡āĻĒ" + +#: src/SUMMARY.md src/android/aidl/types/objects.md +msgid "Sending Objects" +msgstr "āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻĒāĻžāĻ āĻžāĻ¨ā§‹" + +#: src/SUMMARY.md src/android/aidl/types/parcelables.md +msgid "Parcelables" +msgstr "āĻĒāĻžāĻ°ā§āĻ¸ā§‡āĻ˛āĻŦāĻ˛ā§‡āĻ¸ (āĻĒā§āĻ˛āĻŋāĻ¨ā§āĻĻāĻž āĻŦāĻžāĻ¨āĻžāĻ¨ā§‹ āĻ¯āĻžā§Ÿ āĻ¯āĻžāĻ•ā§‡)" + +#: src/SUMMARY.md src/android/aidl/types/file-descriptor.md +msgid "Sending Files" +msgstr "āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻĢāĻžāĻ‡āĻ˛ āĻĒāĻžāĻ āĻžāĻ¨ā§‹" + #: src/SUMMARY.md src/android/logging.md src/bare-metal/aps/logging.md msgid "Logging" msgstr "Logging" @@ -713,64 +735,59 @@ msgstr "Bindgen āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ C āĻ•ā§‡ āĻĄāĻžāĻ•āĻž" #: src/SUMMARY.md msgid "Calling Rust from C" -msgstr "C āĻĨā§‡āĻ•ā§‡ Rust āĻ•ā§‡ āĻĄāĻžāĻ•āĻž " +msgstr "C āĻĨā§‡āĻ•ā§‡ āĻ°āĻžāĻ¸ā§āĻŸ āĻ•ā§‡ āĻĄāĻžāĻ•āĻž" #: src/SUMMARY.md src/android/interoperability/cpp.md msgid "With C++" msgstr "C++āĻāĻ° āĻ¸āĻžāĻĨā§‡" #: src/SUMMARY.md src/android/interoperability/cpp/bridge.md -#, fuzzy msgid "The Bridge Module" -msgstr "āĻŸā§‡āĻ¸ā§āĻŸ āĻŽāĻĄāĻŋāĻ‰āĻ˛" +msgstr "Bridge āĻŽāĻĄāĻŋāĻ‰āĻ˛" #: src/SUMMARY.md -#, fuzzy msgid "Rust Bridge" -msgstr "āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻĄā§āĻ°āĻ¯āĻŧā§‡āĻĄā§‡ āĻ°āĻžāĻ¸ā§āĻŸ" +msgstr "āĻ°āĻžāĻ¸ā§āĻŸ Bridge" #: src/SUMMARY.md src/android/interoperability/cpp/generated-cpp.md msgid "Generated C++" -msgstr "" +msgstr "āĻ‰āĻ¤ā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ“ā§ŸāĻž C++ āĻ•ā§‹āĻĄ" #: src/SUMMARY.md msgid "C++ Bridge" -msgstr "" +msgstr "C++ Bridge" #: src/SUMMARY.md src/android/interoperability/cpp/shared-types.md -#, fuzzy msgid "Shared Types" -msgstr "āĻ¸ā§āĻ•ā§‡āĻ˛āĻžāĻ° āĻŸāĻžāĻ‡āĻĒ" +msgstr "āĻ…āĻ‚āĻļā§‡ āĻŽāĻžāĻ˛āĻŋāĻ•āĻžāĻ¨āĻžāĻ§ā§€āĻ¨ āĻŸāĻžāĻ‡āĻĒāĻ—ā§āĻ˛āĻŋ" #: src/SUMMARY.md src/android/interoperability/cpp/shared-enums.md msgid "Shared Enums" -msgstr "" +msgstr "āĻ…āĻ‚āĻļā§‡ āĻŽāĻžāĻ˛āĻŋāĻ•āĻžāĻ¨āĻžāĻ§ā§€āĻ¨ āĻ—āĻŖāĻ¨āĻžāĻ•āĻžāĻ°ā§€ (āĻļā§‡ā§ŸāĻžāĻ°ā§āĻĄ āĻ‡āĻ¨ā§āĻŽā§āĻ¸)" #: src/SUMMARY.md src/android/interoperability/cpp/rust-result.md -#, fuzzy msgid "Rust Error Handling" -msgstr "āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¸āĻžāĻŽāĻ˛āĻžāĻ¨ā§‹" +msgstr "āĻ°āĻžāĻ¸ā§āĻŸ āĻāĻ° āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž" #: src/SUMMARY.md src/android/interoperability/cpp/cpp-exception.md -#, fuzzy msgid "C++ Error Handling" -msgstr "āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¸āĻžāĻŽāĻ˛āĻžāĻ¨ā§‹" +msgstr "C++ āĻāĻ° āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž" #: src/SUMMARY.md src/android/interoperability/cpp/type-mapping.md msgid "Additional Types" -msgstr "" +msgstr "āĻ†āĻ°ā§‹ āĻ•āĻŋāĻ›ā§ āĻŸāĻžāĻ‡āĻĒ" #: src/SUMMARY.md msgid "Building for Android: C++" -msgstr "" +msgstr "āĻāĻ¨ā§āĻĄā§āĻ°ā§‹āĻ‡āĻĄ āĻāĻ° āĻœāĻ¨ā§āĻ¯ā§‡ āĻŦāĻžāĻ¨āĻžāĻ¨ā§‹: C++" #: src/SUMMARY.md msgid "Building for Android: Genrules" -msgstr "" +msgstr "āĻāĻ¨ā§āĻĄā§āĻ°ā§‹āĻ‡āĻĄ āĻāĻ° āĻœāĻ¨ā§āĻ¯ā§‡ āĻŦāĻžāĻ¨āĻžāĻ¨ā§‹: Genrules" #: src/SUMMARY.md msgid "Building for Android: Rust" -msgstr "" +msgstr "āĻāĻ¨ā§āĻĄā§āĻ°ā§‹āĻ‡āĻĄ āĻāĻ° āĻœāĻ¨ā§āĻ¯ā§‡ āĻŦāĻžāĻ¨āĻžāĻ¨ā§‹: āĻ°āĻžāĻ¸ā§āĻŸ" #: src/SUMMARY.md msgid "With Java" @@ -784,41 +801,39 @@ msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨" #: src/SUMMARY.md msgid "Chromium" -msgstr "" +msgstr "Chromium" #: src/SUMMARY.md src/chromium/cargo.md msgid "Comparing Chromium and Cargo Ecosystems" -msgstr "" +msgstr "Chromium āĻāĻŦāĻ‚ Cargo āĻāĻ° āĻŦāĻžāĻ¸ā§āĻ¤ā§āĻ¤āĻ¨ā§āĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¤ā§āĻ˛āĻ¨āĻž" #: src/SUMMARY.md msgid "Policy" -msgstr "" +msgstr "āĻ•āĻ°ā§āĻŽāĻĒāĻ¨ā§āĻĨāĻž" #: src/SUMMARY.md -#, fuzzy msgid "Unsafe Code" -msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻ°āĻžāĻ¸ā§āĻŸ" +msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻ•ā§‹āĻĄ" #: src/SUMMARY.md src/chromium/build-rules/depending.md msgid "Depending on Rust Code from Chromium C++" -msgstr "" +msgstr "āĻ•ā§āĻ°ā§‹āĻŽāĻŋā§ŸāĻŽ C++ āĻāĻ° āĻĨā§‡āĻ•ā§‡ āĻ†āĻ¸āĻž āĻ°āĻžāĻ¸ā§āĻŸ āĻ•ā§‹āĻĄ āĻāĻ° āĻ“āĻĒāĻ°ā§‡ āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°āĻ›ā§‡" #: src/SUMMARY.md src/chromium/build-rules/vscode.md msgid "Visual Studio Code" -msgstr "" +msgstr "Visual Studio Code" #: src/SUMMARY.md src/exercises/chromium/third-party.md -#, fuzzy msgid "Exercise" -msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€" #: src/SUMMARY.md src/chromium/testing/rust-gtest-interop.md msgid "`rust_gtest_interop` Library" -msgstr "" +msgstr "`rust_gtest_interop` āĻ•ā§‹āĻĄ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻŦāĻž āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ" #: src/SUMMARY.md src/chromium/testing/build-gn.md msgid "GN Rules for Rust Tests" -msgstr "" +msgstr "āĻ°āĻžāĻ¸ā§āĻŸ āĻ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž-āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŦāĻžāĻ° āĻœāĻ¨ā§āĻ¯ā§‡ āĻœāĻŋ . āĻāĻ¨ āĻ¨āĻŋā§ŸāĻŽāĻžāĻŦāĻ˛ā§€ " #: src/SUMMARY.md src/chromium/testing/chromium-import-macro.md msgid "`chromium::import!` Macro" @@ -855,69 +870,68 @@ msgstr "āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¸āĻžāĻŽāĻ˛āĻžāĻ¨ā§‹" #: src/SUMMARY.md msgid "Using CXX in Chromium" -msgstr "" +msgstr "Chromium āĻ CXX āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž " #: src/SUMMARY.md src/chromium/adding-third-party-crates.md msgid "Adding Third Party Crates" -msgstr "" +msgstr "āĻ¤ā§ƒāĻ¤ā§€ā§Ÿ āĻĒāĻ•ā§āĻˇā§‡āĻ° āĻ•ā§āĻ°ā§‡āĻŸ āĻœā§‹ā§œāĻž" #: src/SUMMARY.md msgid "Configuring Cargo.toml" -msgstr "" +msgstr "Cargo.toml āĻ¸āĻœā§āĻœāĻŋāĻ¤ āĻ•āĻ°āĻž" #: src/SUMMARY.md #: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md msgid "Configuring `gnrt_config.toml`" -msgstr "" +msgstr "`gnrt_config.toml` āĻ¸āĻœā§āĻœāĻŋāĻ¤ āĻ•āĻ°āĻž" #: src/SUMMARY.md src/chromium/adding-third-party-crates/downloading-crates.md msgid "Downloading Crates" -msgstr "" +msgstr "āĻ•ā§āĻ°ā§‡āĻŸ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž" #: src/SUMMARY.md #: src/chromium/adding-third-party-crates/generating-gn-build-rules.md msgid "Generating `gn` Build Rules" -msgstr "" +msgstr "`gn` āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻ¨āĻŋā§ŸāĻŽāĻžāĻŦāĻ˛ā§€ āĻ‰āĻ¤ā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°āĻž" #: src/SUMMARY.md src/chromium/adding-third-party-crates/resolving-problems.md msgid "Resolving Problems" -msgstr "" +msgstr "āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻž" #: src/SUMMARY.md #: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md msgid "Build Scripts Which Generate Code" -msgstr "" +msgstr "āĻ•ā§‹āĻĄ āĻ‰ā§ŽāĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°ā§‡ āĻāĻŽāĻ¨ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻ¨āĻŋā§ŸāĻŽāĻ¸āĻŽā§‚āĻš" #: src/SUMMARY.md #: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md msgid "Build Scripts Which Build C++ or Take Arbitrary Actions" -msgstr "" +msgstr "āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻ¨āĻŋā§ŸāĻŽāĻ¸āĻŽā§‚āĻš āĻ¯āĻž C++ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻ•āĻ°ā§‡ āĻŦāĻž āĻ•ā§‹āĻ¨ā§‹ āĻ‡āĻšā§āĻ›āĻžāĻŽāĻ¤ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡" #: src/SUMMARY.md #: src/chromium/adding-third-party-crates/depending-on-a-crate.md msgid "Depending on a Crate" -msgstr "" +msgstr "āĻ•ā§āĻ°ā§‡āĻŸ āĻāĻ° āĻ“āĻĒāĻ°ā§‡ āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡ āĻ¯ā§‡" #: src/SUMMARY.md msgid "Reviews and Audits" -msgstr "" +msgstr "āĻĒāĻ°ā§āĻ¯āĻžāĻ˛ā§‹āĻšāĻ¨āĻž āĻāĻŦāĻ‚ āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻž" #: src/SUMMARY.md msgid "Checking into Chromium Source Code" -msgstr "" +msgstr "Chromium āĻāĻ° āĻŽā§‚āĻ˛ āĻ•ā§‹āĻĄ āĻ āĻĸā§‹āĻ•āĻž" #: src/SUMMARY.md src/chromium/adding-third-party-crates/keeping-up-to-date.md msgid "Keeping Crates Up to Date" -msgstr "" +msgstr "āĻ•ā§āĻ°ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻ…āĻŦāĻžāĻ§ āĻ°āĻžāĻ–āĻž" #: src/SUMMARY.md msgid "Bringing It Together - Exercise" -msgstr "" +msgstr "āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻāĻ•āĻ¸āĻžāĻĨā§‡ āĻāĻ¨ā§‡ āĻ•āĻŋāĻ›ā§ āĻŦāĻžāĻ¨āĻžāĻ¨ā§‹ - āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€" #: src/SUMMARY.md src/exercises/chromium/solutions.md -#, fuzzy msgid "Exercise Solutions" -msgstr "āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĻ¸āĻŽā§‚āĻš" +msgstr "āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€āĻ° āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĻ¸āĻŽā§‚āĻš" #: src/SUMMARY.md msgid "Bare Metal: Morning" @@ -925,7 +939,7 @@ msgstr "Bare Metal: āĻ¸āĻ•āĻžāĻ˛" #: src/SUMMARY.md src/bare-metal/no_std.md msgid "`no_std`" -msgstr "" +msgstr "`no_std`" #: src/SUMMARY.md msgid "A Minimal Example" @@ -933,7 +947,7 @@ msgstr "āĻāĻ•āĻŸāĻŋ āĻ¨ā§āĻ¯ā§‚āĻ¨āĻ¤āĻŽ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ" #: src/SUMMARY.md src/bare-metal/no_std.md src/bare-metal/alloc.md msgid "`alloc`" -msgstr "" +msgstr "`alloc`" #: src/SUMMARY.md src/bare-metal/microcontrollers.md msgid "Microcontrollers" @@ -941,11 +955,11 @@ msgstr "āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛āĻžāĻ°" #: src/SUMMARY.md src/bare-metal/microcontrollers/mmio.md msgid "Raw MMIO" -msgstr "" +msgstr "āĻ…āĻĒāĻ•ā§āĻŦ āĻāĻŽ . āĻāĻŽ . āĻ†āĻ‡ . āĻ“" #: src/SUMMARY.md msgid "PACs" -msgstr "" +msgstr "āĻĒāĻŋ . āĻ . āĻ¸āĻŋ" #: src/SUMMARY.md msgid "HAL Crates" @@ -957,15 +971,15 @@ msgstr "Board Support Crates" #: src/SUMMARY.md msgid "The Type State Pattern" -msgstr "" +msgstr "āĻŸāĻžāĻ‡āĻĒ āĻāĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°ā§‡ āĻāĻŽāĻ¨ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨" #: src/SUMMARY.md src/bare-metal/microcontrollers/embedded-hal.md msgid "`embedded-hal`" -msgstr "" +msgstr "`embedded-hal`" #: src/SUMMARY.md src/bare-metal/microcontrollers/probe-rs.md msgid "`probe-rs` and `cargo-embed`" -msgstr "" +msgstr "`probe-rs` āĻāĻŦāĻ‚ `cargo-embed`" #: src/SUMMARY.md src/bare-metal/microcontrollers/debugging.md msgid "Debugging" @@ -973,12 +987,12 @@ msgstr "āĻĄāĻŋāĻŦāĻžāĻ—āĻŋāĻ‚" #: src/SUMMARY.md msgid "Other Projects" -msgstr "" +msgstr "āĻ†āĻ°āĻ“ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋ" #: src/SUMMARY.md src/exercises/bare-metal/compass.md #: src/exercises/bare-metal/solutions-morning.md msgid "Compass" -msgstr "" +msgstr "āĻ•āĻŽā§āĻĒāĻžāĻ¸" #: src/SUMMARY.md msgid "Solutions" @@ -986,7 +1000,7 @@ msgstr "āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĻ¸āĻŽā§‚āĻš" #: src/SUMMARY.md msgid "Bare Metal: Afternoon" -msgstr "" +msgstr "āĻŦā§‡ā§ŸāĻžāĻ° āĻŽā§‡āĻŸāĻžāĻ˛: āĻĻā§āĻĒā§āĻ°āĻŦā§‡āĻ˛āĻž" #: src/SUMMARY.md msgid "Application Processors" @@ -1038,28 +1052,27 @@ msgstr "āĻŦā§āĻ¯āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ" #: src/SUMMARY.md src/bare-metal/useful-crates/zerocopy.md msgid "`zerocopy`" -msgstr "" +msgstr "`zerocopy`" #: src/SUMMARY.md src/bare-metal/useful-crates/aarch64-paging.md msgid "`aarch64-paging`" -msgstr "" +msgstr "`aarch64-paging`" #: src/SUMMARY.md src/bare-metal/useful-crates/buddy_system_allocator.md msgid "`buddy_system_allocator`" -msgstr "" +msgstr "`buddy_system_allocator`" #: src/SUMMARY.md src/bare-metal/useful-crates/tinyvec.md msgid "`tinyvec`" -msgstr "" +msgstr "`tinyvec`" #: src/SUMMARY.md src/bare-metal/useful-crates/spin.md msgid "`spin`" -msgstr "" +msgstr "`spin`" #: src/SUMMARY.md -#, fuzzy msgid "`vmbase`" -msgstr "vmbase" +msgstr "`vmbase`" #: src/SUMMARY.md msgid "RTC Driver" @@ -1071,7 +1084,7 @@ msgstr "Concurrency: āĻ¸āĻ•āĻžāĻ˛" #: src/SUMMARY.md src/concurrency/threads.md msgid "Threads" -msgstr "" +msgstr "āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨āĻžāĻ° āĻ¸ā§āĻ¤ā§‹" #: src/SUMMARY.md src/concurrency/scoped-threads.md msgid "Scoped Threads" @@ -1079,27 +1092,27 @@ msgstr "āĻ¸ā§āĻ•ā§‹āĻĒāĻĄ Threads" #: src/SUMMARY.md src/concurrency/channels.md msgid "Channels" -msgstr "" +msgstr "āĻ¨āĻžāĻ˛āĻž āĻŦāĻž āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛" #: src/SUMMARY.md src/concurrency/channels/unbounded.md msgid "Unbounded Channels" -msgstr "" +msgstr "āĻ¸ā§€āĻŽāĻžāĻšā§€āĻ¨ āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛" #: src/SUMMARY.md src/concurrency/channels/bounded.md msgid "Bounded Channels" -msgstr "" +msgstr "āĻ†āĻŦāĻĻā§āĻ§ āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛" #: src/SUMMARY.md src/concurrency/send-sync.md msgid "`Send` and `Sync`" -msgstr "" +msgstr "`Send` āĻāĻŦāĻ‚ `Sync`" #: src/SUMMARY.md src/concurrency/send-sync/send.md msgid "`Send`" -msgstr "" +msgstr "`Send`" #: src/SUMMARY.md src/concurrency/send-sync/sync.md msgid "`Sync`" -msgstr "" +msgstr "`Sync`" #: src/SUMMARY.md src/concurrency/send-sync/examples.md msgid "Examples" @@ -1107,15 +1120,15 @@ msgstr "āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸āĻŽā§‚āĻš" #: src/SUMMARY.md src/concurrency/shared_state.md msgid "Shared State" -msgstr "" +msgstr "āĻ…āĻ‚āĻļāĻŋāĻĻāĻžāĻ°ā§€ āĻŽāĻžāĻ˛āĻŋāĻ•āĻžāĻ¨āĻž āĻŦāĻŋāĻ­āĻžāĻœāĻŋāĻ¤ āĻ…āĻŦāĻ¸ā§āĻĨāĻž " #: src/SUMMARY.md src/concurrency/shared_state/arc.md msgid "`Arc`" -msgstr "" +msgstr "`Arc`" #: src/SUMMARY.md src/concurrency/shared_state/mutex.md msgid "`Mutex`" -msgstr "" +msgstr "`Mutex`" #: src/SUMMARY.md src/memory-management/review.md #: src/error-handling/try-conversions.md @@ -1134,7 +1147,7 @@ msgstr "āĻŽāĻžāĻ˛ā§āĻŸāĻŋ āĻĨā§āĻ°ā§‡āĻĄā§‡āĻĄ āĻ˛āĻŋāĻ™ā§āĻ• āĻšā§‡āĻ•āĻžāĻ° #: src/SUMMARY.md msgid "Concurrency: Afternoon" -msgstr "" +msgstr "āĻ¸āĻŽāĻŦāĻ°ā§āĻ¤ā§€āĻļā§€āĻ˛āĻ¤āĻž: āĻĻā§āĻĒā§āĻ°āĻŦā§‡āĻ˛āĻž" #: src/SUMMARY.md msgid "Async Basics" @@ -1142,7 +1155,7 @@ msgstr "Async Basics" #: src/SUMMARY.md src/async/async-await.md msgid "`async`/`await`" -msgstr "" +msgstr "`async`/`await`" #: src/SUMMARY.md src/async/futures.md msgid "Futures" @@ -1150,7 +1163,7 @@ msgstr "āĻ­āĻŦāĻŋāĻˇā§āĻ¯ā§Ž" #: src/SUMMARY.md src/async/runtimes.md msgid "Runtimes" -msgstr "" +msgstr "āĻ°āĻžāĻ¨āĻŸāĻžāĻ‡āĻŽ" #: src/SUMMARY.md src/async/runtimes/tokio.md msgid "Tokio" @@ -1163,7 +1176,7 @@ msgstr "Tasks-āĻ•āĻ°ā§āĻŽ" #: src/SUMMARY.md src/async/channels.md msgid "Async Channels" -msgstr "" +msgstr "āĻ…āĻ¸āĻŽāĻ¨āĻŋāĻ¯āĻŧāĻ¤ āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛" #: src/SUMMARY.md msgid "Control Flow" @@ -1171,11 +1184,11 @@ msgstr "āĻĒā§āĻ°āĻŦāĻžāĻš āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ" #: src/SUMMARY.md src/async/control-flow/join.md msgid "Join" -msgstr "" +msgstr "āĻœā§‹ā§œāĻž" #: src/SUMMARY.md src/async/control-flow/select.md msgid "Select" -msgstr "" +msgstr "āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻž" #: src/SUMMARY.md msgid "Pitfalls" @@ -1187,21 +1200,20 @@ msgstr "āĻāĻ•ā§āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻŸāĻ° āĻŦā§āĻ˛āĻ• āĻ•āĻ°āĻž" #: src/SUMMARY.md src/async/pitfalls/pin.md msgid "`Pin`" -msgstr "" +msgstr "`Pin`" #: src/SUMMARY.md src/async/pitfalls/async-traits.md msgid "Async Traits" msgstr "Async Traits" #: src/SUMMARY.md src/async/pitfalls/cancellation.md -#, fuzzy msgid "Cancellation" -msgstr "Installation" +msgstr "āĻŦāĻžāĻ¤āĻŋāĻ˛āĻ•āĻ°āĻŖ" #: src/SUMMARY.md src/exercises/concurrency/chat-app.md #: src/exercises/concurrency/solutions-afternoon.md msgid "Broadcast Chat Application" -msgstr "" +msgstr "āĻ¸āĻŽā§āĻĒā§āĻ°āĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāĻ¨ āĻ•āĻ°āĻžāĻ° āĻāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨" #: src/SUMMARY.md msgid "Final Words" @@ -1213,7 +1225,7 @@ msgstr "āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ!" #: src/SUMMARY.md src/glossary.md msgid "Glossary" -msgstr "" +msgstr "āĻļāĻŦā§āĻĻāĻ•ā§‹āĻˇ" #: src/SUMMARY.md msgid "Other Resources" @@ -1249,9 +1261,9 @@ msgid "" "course covers the full spectrum of Rust, from basic syntax to advanced " "topics like generics and error handling." msgstr "" -"āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¤āĻŋāĻ¨ āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ°āĻžāĻ¸ā§āĻŸ āĻ•ā§‹āĻ°ā§āĻ¸ āĻ¯āĻž āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻĄā§āĻ°āĻ¯āĻŧā§‡āĻĄ āĻŸāĻŋāĻŽ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ā§ˇ āĻ•ā§‹āĻ°ā§āĻ¸ " -"āĻ•āĻ­āĻžāĻ° āĻ•āĻ°ā§‡ Rust-āĻāĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§āĻĒā§‡āĻ•āĻŸā§āĻ°āĻžāĻŽ, āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•ā§āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ•ā§‡ āĻāĻŦāĻ‚ āĻāĻ°āĻ° " -"āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻŋāĻ‚ āĻāĻ° āĻŽāĻ¤ā§‹ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤āĨ¤" +"āĻāĻŸāĻŋ Google āĻāĻ° āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻĄā§āĻ°āĻ¯āĻŧā§‡āĻĄ āĻŸāĻŋāĻŽ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¤ā§ˆāĻ°āĻŋ āĻāĻ•āĻŸāĻŋ āĻšāĻžāĻ° āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ°āĻžāĻ¸ā§āĻŸāĻļāĻŋāĻ–āĻŦāĻžāĻ° āĻ•ā§‹āĻ°ā§āĻ¸ āĻ¯āĻž " +"āĻ°āĻžāĻ¸ā§āĻŸ-āĻāĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§āĻĒā§‡āĻ•āĻŸā§āĻ°āĻžāĻŽ, āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•ā§āĻ¸ āĻĨā§‡āĻ•ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡ āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ• āĻāĻŦāĻ‚ āĻ¤ā§āĻ°ā§āĻŸāĻŋ " +"āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻžāĻ° āĻŽāĻ¤ā§‹ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻŦāĻŋāĻˇā§Ÿ āĻļāĻŋāĻ–āĻ¤ā§‡ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĨ¤" #: src/index.md msgid "" @@ -1259,6 +1271,13 @@ msgid "" "comprehensive-rust/>. If you are reading somewhere else, please check there " "for updates." msgstr "" +"āĻāĻ‡ āĻ•ā§‹āĻ°ā§āĻ¸ āĻāĻ° āĻ¸āĻŦāĻšā§‡ā§Ÿā§‡ āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ " +"- āĻāĻ–āĻžāĻ¨ā§‡ āĻĒāĻžāĻ“ā§ŸāĻž āĻ¯āĻžāĻŦā§‡ | āĻ¯āĻĻāĻŋ āĻ…āĻ¨ā§āĻ¯ āĻ•ā§‹āĻĨāĻžāĻ“ āĻĨā§‡āĻ•ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻĒā§œāĻ›ā§‡āĻ¨ āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻ‡āĻ–āĻžāĻ¨ā§‡ āĻāĻ•āĻŦāĻžāĻ° āĻĻā§‡āĻ–ā§‡ " +"āĻ¨ā§‡ā§ŸāĻž āĻ­āĻžāĻ˛ā§‹ |" + +#: src/index.md +msgid "The course is also available [as a PDF](comprehensive-rust.pdf)." +msgstr "āĻāĻ‡ āĻ•ā§‹āĻ°ā§āĻ¸āĻŸāĻŋ āĻĒāĻŋ.āĻĄāĻŋ.āĻāĻĢ āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡āĻ“ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ†āĻ›ā§‡ (comprehensive-rust.pdf) |" #: src/index.md msgid "" @@ -1282,9 +1301,8 @@ msgid "Show you common Rust idioms." msgstr "āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ°āĻžāĻ¸ā§āĻŸ āĻ‡āĻĄāĻŋāĻ¯āĻŧāĻŽāĻ¸ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧāĨ¤" #: src/index.md -#, fuzzy msgid "We call the first four course days Rust Fundamentals." -msgstr "āĻ†āĻŽāĻ°āĻž āĻ•ā§‹āĻ°ā§āĻ¸ā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻĻāĻŋāĻ¨āĻ•ā§‡ āĻ°āĻžāĻ¸ā§āĻŸ āĻĢāĻžāĻ¨ā§āĻĄāĻžāĻŽā§‡āĻ¨ā§āĻŸāĻžāĻ˛ āĻŦāĻ˛āĻŋāĨ¤" +msgstr "āĻ†āĻŽāĻ°āĻž āĻ•ā§‹āĻ°ā§āĻ¸ā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻšāĻžāĻ°āĻŸāĻŋ āĻĻāĻŋāĻ¨āĻ•ā§‡ āĻ°āĻžāĻ¸ā§āĻŸ āĻĢāĻžāĻ¨ā§āĻĄāĻžāĻŽā§‡āĻ¨ā§āĻŸāĻžāĻ˛ āĻŦāĻ˛āĻŋāĨ¤" #: src/index.md msgid "" @@ -1298,20 +1316,19 @@ msgid "" "[Android](android.md): a half-day course on using Rust for Android platform " "development (AOSP). This includes interoperability with C, C++, and Java." msgstr "" -"[Android](android.md): āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻĄā§āĻ°āĻ¯āĻŧā§‡āĻĄ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻŸāĻĢāĻ°ā§āĻŽā§‡āĻ° āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸ (AOSP) āĻāĻ° āĻœāĻ¨ā§āĻ¯ Rust " +"[Android](android.md): āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻĄā§āĻ°āĻ¯āĻŧā§‡āĻĄ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻŸāĻĢāĻ°ā§āĻŽā§‡āĻ° āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸ (AOSP) āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ°āĻžāĻ¸ā§āĻŸ " "āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ°ā§āĻ§-āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ•ā§‹āĻ°ā§āĻ¸āĨ¤ āĻāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ C, C++ āĻāĻŦāĻ‚ Java āĻ¸āĻš āĻ†āĻ¨ā§āĻ¤āĻƒāĻ•āĻžāĻ°ā§āĻ¯āĻ¯ā§‹āĻ—ā§āĻ¯āĻ¤āĻž " "āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤" #: src/index.md -#, fuzzy msgid "" "[Chromium](chromium.md): a half-day course on using Rust within Chromium " "based browsers. This includes interoperability with C++ and how to include " "third-party crates in Chromium." msgstr "" -"[Android](android.md): āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻĄā§āĻ°āĻ¯āĻŧā§‡āĻĄ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻŸāĻĢāĻ°ā§āĻŽā§‡āĻ° āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸ (AOSP) āĻāĻ° āĻœāĻ¨ā§āĻ¯ Rust " -"āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ°ā§āĻ§-āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ•ā§‹āĻ°ā§āĻ¸āĨ¤ āĻāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ C, C++ āĻāĻŦāĻ‚ Java āĻ¸āĻš āĻ†āĻ¨ā§āĻ¤āĻƒāĻ•āĻžāĻ°ā§āĻ¯āĻ¯ā§‹āĻ—ā§āĻ¯āĻ¤āĻž " -"āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤" +"[Chromium][chromium.md): āĻāĻ•āĻŸāĻŋ āĻ†āĻ§āĻž āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ•ā§‹āĻ°ā§āĻ¸ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ Chromium āĻ¯ā§āĻ•ā§āĻ¤ " +"āĻŦā§āĻ°āĻžāĻ‰āĻ¸āĻžāĻ° āĻ āĻ°āĻžāĻ¸ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻŸāĻž āĻļā§‡āĻ–āĻžāĻ¨ā§‹ āĻšā§Ÿā§‡āĻ›ā§‡ | āĻāĻ¤ā§‡ C++ āĻ†āĻ¨ā§āĻ¤āĻƒāĻ•āĻžāĻ°ā§āĻ¯āĻ•ā§āĻˇāĻŽāĻ¤āĻž " +"āĻ¸āĻš āĻ¤ā§ƒāĻ¤ā§€ā§Ÿ āĻĒāĻ•ā§āĻˇā§‡āĻ° āĻ•ā§āĻ°ā§‡āĻŸ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ Chromium āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻŸāĻžāĻ“ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻšā§Ÿā§‡āĻ›ā§‡ |" #: src/index.md msgid "" @@ -1319,6 +1336,9 @@ msgid "" "(embedded) development. Both microcontrollers and application processors are " "covered." msgstr "" +"[āĻŦā§‡ā§ŸāĻžāĻ°-āĻŽā§‡āĻŸāĻžāĻ˛](bare-metal.md): āĻ°āĻžāĻ¸ā§āĻŸ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻŽāĻŦā§‡āĻĄā§‡āĻĄ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸ āĻ āĻ˛āĻžāĻ—āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻ‡ " +"āĻŦāĻŋāĻˇā§Ÿā§‡āĻ° āĻ“āĻĒāĻ°ā§‡ āĻāĻ•āĻŸāĻž āĻĒā§āĻ°ā§‹ āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ•ā§āĻ˛āĻžāĻ¸ | āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛ā§‡āĻ°āĻ¸ āĻāĻŦāĻ‚ āĻāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻ¸āĻ°ā§āĻ¸ āĻāĻ‡ " +"āĻĻā§āĻŸā§‹ āĻŦāĻŋāĻˇā§ŸāĻ—ā§āĻ˛āĻŋāĻ° āĻšāĻ°ā§āĻšāĻž āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ |" #: src/index.md msgid "" @@ -1327,10 +1347,14 @@ msgid "" "mutexes) and async/await concurrency (cooperative multitasking using " "futures)." msgstr "" +"[āĻ¸āĻŽāĻŦāĻ°ā§āĻ¤ā§€ āĻ—āĻŖāĻ¨āĻž](concurrency.md): āĻ°āĻžāĻ¸ā§āĻŸ āĻ āĻ¸āĻŽāĻŦāĻ°ā§āĻ¤ā§€ āĻ—āĻŖāĻ¨āĻžāĻ° āĻ“āĻĒāĻ°ā§‡ āĻāĻ•āĻŸāĻž āĻĒā§āĻ°ā§‹ āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ•ā§āĻ˛āĻžāĻ¸ " +"| āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸āĻŋāĻ•āĻžāĻ˛ āĻ¸āĻŽāĻŦāĻ°ā§āĻ¤ā§€ (āĻĨā§āĻ°ā§‡āĻĄ āĻāĻŦāĻ‚ mutexes āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ…āĻ—ā§āĻ°āĻ•ā§āĻ°ā§ŸāĻžāĻ§āĻŋāĻ•āĻžāĻ°-āĻ¸āĻ‚āĻ•ā§āĻ°āĻžāĻ¨ā§āĻ¤ " +"āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€ āĻŦāĻžāĻ¨āĻžāĻ¨ā§‹) āĻ—āĻŖāĻ¨āĻž āĻāĻŦāĻ‚ async/await āĻ¸āĻŽāĻŦāĻ°ā§āĻ¤ā§€ āĻ—āĻŖāĻ¨āĻž (āĻĢāĻŋāĻ‰āĻšāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¸āĻŽāĻŦāĻžāĻ¯āĻŧ " +"āĻŽāĻžāĻ˛ā§āĻŸāĻŋāĻŸāĻžāĻ¸ā§āĻ•āĻŋāĻ‚)-āĻāĻ‡ āĻĻā§āĻ‡ āĻ§āĻ°āĻŖā§‡āĻ° āĻ¨āĻŋā§Ÿā§‡ āĻšāĻ°ā§āĻšāĻž āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡ |" #: src/index.md msgid "Non-Goals" -msgstr "" +msgstr "āĻ¯āĻž āĻ˛āĻ•ā§āĻˇā§āĻ¯ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĒāĻĄāĻŧā§‡ āĻ¨āĻž" #: src/index.md msgid "" @@ -1346,6 +1370,9 @@ msgid "" "(https://doc.rust-lang.org/book/ch19-06-macros.html) and [Rust by Example]" "(https://doc.rust-lang.org/rust-by-example/macros.html) instead." msgstr "" +"āĻŽā§āĻ¯āĻžāĻ•ā§āĻ°ā§‹ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻŦāĻžāĻ¨āĻžāĻ¨ā§‹ āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡: āĻāĻ° āĻœāĻ¨ā§āĻ¯ā§‡ [āĻ°āĻžāĻ¸ā§āĻŸ āĻŦāĻ‡ āĻāĻ° āĻ…āĻ§ā§āĻ¯āĻžāĻ¯āĻŧ ā§§ā§¯.ā§Ģ](https://doc." +"rust-lang.org/book/ch19-06-macros.html) āĻāĻŦāĻ‚ [āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĻā§āĻŦāĻžāĻ°āĻž Rust](https://doc." +"rust-lang.org/rust-by-example/macros.html) āĻĻā§‡āĻ–ā§āĻ¨|" #: src/index.md msgid "Assumptions" @@ -1367,7 +1394,7 @@ msgid "" "JavaScript, then you will be able to follow along just fine too." msgstr "" "āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻœāĻžāĻ¨ā§‡āĻ¨ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻ‡āĻ¨āĻžāĻŽāĻŋāĻ•ā§āĻ¯āĻžāĻ˛āĻŋ āĻŸāĻžāĻ‡āĻĒāĻĄ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¯ā§‡āĻŽāĻ¨ " -"āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻŦāĻž āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ–ā§āĻŦ āĻ­āĻžāĻ˛ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡āĻ¨āĨ¤ " +"āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻŦāĻž āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ–ā§āĻŦ āĻ­āĻžāĻ˛ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡āĻ¨āĨ¤" #: src/index.md msgid "" @@ -1398,6 +1425,9 @@ msgid "" "afternoon class. Both sessions contain multiple breaks and time for students " "to work on exercises." msgstr "" +"āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻ†āĻŽāĻ°āĻž āĻ¸āĻ•āĻžāĻ˛ ā§¯.ā§Ļā§Ļ āĻĨā§‡āĻ•ā§‡ āĻŦāĻŋāĻ•ā§‡āĻ˛ ā§Ē.ā§Ļā§Ļ (āĻŽāĻžāĻā§‡ ā§§ āĻ˜āĻ¨ā§āĻŸāĻžāĻ° āĻŦāĻŋāĻ°āĻ¤āĻŋāĻ¸āĻš) āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ•ā§āĻ˛āĻžāĻ¸ āĻ•āĻ°ā§‡ " +"āĻĨāĻžāĻ•āĻŋāĨ¤ āĻāĻ‡ āĻœāĻ¨ā§āĻ¯ā§‡ āĻ¸āĻ•āĻžāĻ˛ā§‡ ā§Š āĻ˜āĻ¨ā§āĻŸāĻž āĻāĻŦāĻ‚ āĻĻā§āĻĒā§āĻ°ā§‡ ā§Š āĻ˜āĻ¨ā§āĻŸāĻž āĻ¸āĻŽā§Ÿā§‡ āĻĨāĻžāĻ•ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸ āĻāĻ° āĻœāĻ¨ā§āĻ¯ā§‡āĨ¤ āĻĻā§āĻŸāĻŋ āĻ­āĻžāĻ—ā§‡āĻ‡ " +"āĻļāĻŋāĻ•ā§āĻˇāĻžāĻ°ā§āĻĨā§€ āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ā§‡ āĻŦāĻŋāĻ°āĻ¤āĻŋ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§€āĻ° āĻ•āĻžāĻœā§‡āĻ° āĻ¸āĻŽā§Ÿā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻĨāĻžāĻ•ā§‡āĨ¤" #: src/running-the-course.md msgid "Before you run the course, you will want to:" @@ -1418,17 +1448,16 @@ msgstr "" "āĻ•ā§āĻ˛āĻžāĻ¸ā§‡ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻĒāĻ°ā§āĻĻāĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤" #: src/running-the-course.md -#, fuzzy msgid "" "Decide on the dates. Since the course takes four days, we recommend that you " "schedule the days over two weeks. Course participants have said that they " "find it helpful to have a gap in the course since it helps them process all " "the information we give them." msgstr "" -"āĻ¤āĻžāĻ°āĻŋāĻ–ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤āĨ¤āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ•ā§‹āĻ°ā§āĻ¸āĻŸāĻŋ āĻ•āĻŽāĻĒāĻ•ā§āĻˇā§‡ āĻ¤āĻŋāĻ¨ āĻĒā§‚āĻ°ā§āĻŖ āĻĻāĻŋāĻ¨ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨ā§‡āĻ¯āĻŧ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ " -"āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻ•āĻ°āĻ›āĻŋ āĻĻā§āĻ‡ āĻ¸āĻĒā§āĻ¤āĻžāĻš āĻ‰āĻĒāĻ° āĻĻāĻŋāĻ¨ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§āĻ¨āĨ¤ āĻāĻŽāĻ¨āĻŸāĻžāĻ‡ āĻœāĻžāĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›ā§‡āĻ¨ āĻ•ā§‹āĻ°ā§āĻ¸ā§‡ " -"āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻ°āĻž āĻ¯ā§‡ āĻ¤āĻžāĻ°āĻž āĻ•ā§‹āĻ°ā§āĻ¸ā§‡ āĻĢāĻžāĻāĻ• āĻĨāĻžāĻ•āĻž āĻ¸āĻšāĻžāĻ¯āĻŧāĻ• āĻŦāĻ˛ā§‡ āĻŽāĻ¨ā§‡ āĻ•āĻ°ā§‡ āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻ¤āĻžāĻĻā§‡āĻ° " -"āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ¤āĻž āĻ•āĻ°ā§‡ āĻ¯ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¤āĻĨā§āĻ¯ āĻ¤āĻžāĻĻā§‡āĻ° āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤" +"āĻ¤āĻŋāĻĨāĻŋāĻ° āĻ“āĻĒāĻ°ā§‡ āĻ†āĻ—ā§‡ āĻĨā§‡āĻ•ā§‡ āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋā§Ÿā§‡ āĻ¨ā§‡ā§ŸāĻž āĻ­āĻžāĻ˛ā§‹āĨ¤ āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻ‡ āĻ•ā§‹āĻ°ā§āĻ¸āĻŸāĻŋ ā§Ē-āĻĻāĻŋāĻ¨ āĻāĻ° āĻ¸ā§‡āĻšā§‡āĻ¤ā§ " +"āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¤āĻ°āĻĢ āĻĨā§‡āĻ•ā§‡ āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĨāĻžāĻ•āĻŦā§‡ āĻ¯ā§‡ āĻ¤āĻŋāĻĨāĻŋāĻ—ā§āĻ˛āĻŋ āĻĻā§āĻ‡ āĻ¸āĻĒā§āĻ¤āĻž āĻ§āĻ°ā§‡ āĻ›ā§œāĻŋā§Ÿā§‡ āĻ°āĻžāĻ–āĻŦāĻžāĨ¤ āĻ†āĻ—ā§‡āĻ° " +"āĻ…āĻ‚āĻļāĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĨā§‡āĻ•ā§‡ āĻāĻ‡ āĻĒāĻžāĻ“ā§ŸāĻž āĻ—ā§‡āĻ›ā§‡ āĻ¯ā§‡ āĻāĻ°āĻŽ āĻ•āĻ°ā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ¸āĻĒā§āĻ¤āĻž āĻ§āĻ°ā§‡ " +"āĻ•ā§‹āĻ°ā§āĻ¸āĻŸāĻŋ āĻ•āĻ°āĻžāĻ˛ā§‡ āĻ¤āĻžāĻ°āĻž āĻ†āĻ°āĻ“ āĻ­āĻžāĻ˛ā§‹ āĻŦā§‹āĻā§‡āĨ¤" #: src/running-the-course.md msgid "" @@ -1504,89 +1533,90 @@ msgstr "" #: src/running-the-course/course-structure.md msgid "Rust Fundamentals" -msgstr "" +msgstr "āĻ°āĻžāĻ¸ā§āĻŸ āĻāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻœā§āĻžāĻžāĻ¨ " #: src/running-the-course/course-structure.md msgid "" "The first four days make up [Rust Fundamentals](../welcome-day-1.md). The " "days are fast paced and we cover a lot of ground!" msgstr "" +"āĻĒā§āĻ°āĻĨāĻŽ āĻšāĻžāĻ° āĻĻāĻŋāĻ¨ āĻ§āĻ°ā§‡ [āĻ°āĻžāĻ¸ā§āĻŸ āĻāĻ° āĻŽā§‚āĻ˛āĻ¸ā§‚āĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋ](../welcome-day-1.md) āĻ¸ā§‡āĻ–āĻžāĻ¨ āĻšāĻŦā§‡| āĻāĻ‡ " +"āĻ…āĻ§ā§āĻ¯āĻžāĻ¯āĻŧāĻ—ā§āĻ˛āĻŋ āĻĻā§āĻ°ā§āĻ¤ āĻ—āĻ¤āĻŋāĻ° āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ†āĻŽāĻ°āĻž āĻ…āĻ¨ā§‡āĻ•āĻŸāĻž āĻāĻ•āĻ¸āĻžāĻĨā§‡ āĻļāĻŋāĻ–āĻŦāĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻžāĻŦā§‹|" #: src/running-the-course/course-structure.md -#, fuzzy msgid "Course schedule:" -msgstr "āĻ•ā§‹āĻ°ā§āĻ¸ āĻāĻ° āĻ—āĻ āĻ¨" +msgstr "āĻ•ā§‹āĻ°ā§āĻ¸ āĻāĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€" #: src/running-the-course/course-structure.md -msgid "Day 1 Morning (3 hours, including breaks)" -msgstr "" +msgid "Day 1 Morning (2 hours and 10 minutes, including breaks)" +msgstr "āĻĒā§āĻ°āĻĨāĻŽ āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ¸āĻ•āĻžāĻ˛ (āĻŦāĻŋāĻ°āĻ¤āĻŋāĻ¸āĻš ā§¨ āĻ˜āĻ¨ā§āĻŸāĻž ā§§ā§Ļ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md msgid "[Welcome](../welcome-day-1.md) (5 minutes)" -msgstr "" +msgstr "[āĻ¸ā§āĻŦāĻžāĻ—āĻ¤](../welcome-day-1.md) (ā§Ģ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "[Hello, World](../hello-world.md) (20 minutes)" -msgstr "" +msgid "[Hello, World](../hello-world.md) (15 minutes)" +msgstr "[āĻšā§āĻ¯āĻžāĻ˛ā§‹, āĻ“ā§ŸāĻžāĻ°ā§āĻ˛ā§āĻĄ](../hello-world.md) (ā§§ā§Ģ āĻŽāĻŋāĻ¨āĻŋāĻŸ )" #: src/running-the-course/course-structure.md -msgid "[Types and Values](../types-and-values.md) (1 hour and 5 minutes)" -msgstr "" +msgid "[Types and Values](../types-and-values.md) (45 minutes)" +msgstr "[āĻŸāĻžāĻ‡āĻĒ āĻāĻŦāĻ‚ āĻŽāĻžāĻ¨](../types-and-values.md) (ā§Ēā§Ģ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "[Control Flow Basics](../control-flow-basics.md) (1 hour)" -msgstr "" +msgid "[Control Flow Basics](../control-flow-basics.md) (40 minutes)" +msgstr "[āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻĒā§āĻ°āĻŦāĻžāĻšāĻ° āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻœā§āĻžāĻžāĻ¨](../control-flow-basics.md) (ā§Ēā§Ļ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "Day 1 Afternoon (2 hours and 55 minutes, including breaks)" -msgstr "" +msgid "Day 1 Afternoon (2 hours and 15 minutes, including breaks)" +msgstr "āĻĒā§āĻ°āĻĨāĻŽ āĻĻāĻŋāĻ¨ā§‡āĻ° āĻĻā§āĻĒā§āĻ° (āĻŦāĻŋāĻ°āĻ¤āĻŋāĻ¸āĻš ā§¨ āĻ˜āĻ¨ā§āĻŸāĻž ā§§ā§Ļ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "[Tuples and Arrays](../tuples-and-arrays.md) (1 hour)" -msgstr "" +msgid "[Tuples and Arrays](../tuples-and-arrays.md) (35 minutes)" +msgstr "[āĻŸāĻŋāĻ‰āĻĒāĻ˛ āĻāĻŦāĻ‚ āĻ…ā§āĻ¯āĻžāĻ°ā§‡](../tuples-and-arrays.md) (ā§Šā§Ģ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "[References](../references.md) (50 minutes)" -msgstr "" +msgid "[References](../references.md) (35 minutes)" +msgstr "[āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸](../references.md) (ā§Šā§Ģ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md msgid "[User-Defined Types](../user-defined-types.md) (50 minutes)" -msgstr "" +msgstr "[āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻŸāĻžāĻ‡āĻĒ](../user-defined-types.md) (ā§Ģā§Ļ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "Day 2 Morning (3 hours and 5 minutes, including breaks)" -msgstr "" +msgid "Day 2 Morning (2 hours and 50 minutes, including breaks)" +msgstr "āĻĻā§āĻŦāĻŋāĻ¤ā§€ā§Ÿ āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ¸āĻ•āĻžāĻ˛ (āĻŦāĻŋāĻ°āĻ¤āĻŋāĻ¸āĻš ā§¨ āĻ˜āĻ¨ā§āĻŸāĻž ā§Ģā§Ļ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md msgid "[Welcome](../welcome-day-2.md) (3 minutes)" -msgstr "" +msgstr "[āĻ¸ā§āĻŦāĻžāĻ—āĻ¤āĻŽ](../welcome-day-2.md) (ā§Š āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "[Pattern Matching](../pattern-matching.md) (50 minutes)" -msgstr "" +msgid "[Pattern Matching](../pattern-matching.md) (1 hour)" +msgstr "[āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻŽā§āĻ¯āĻžāĻšāĻŋāĻ‚](../pattern-matching.md) (ā§§ āĻ˜āĻ¨ā§āĻŸāĻž)" #: src/running-the-course/course-structure.md -msgid "[Methods and Traits](../methods-and-traits.md) (55 minutes)" -msgstr "" +msgid "[Methods and Traits](../methods-and-traits.md) (45 minutes)" +msgstr "[āĻĒā§āĻ°āĻŖāĻžāĻ˛ā§€ āĻāĻŦāĻ‚ āĻŸā§āĻ°ā§‡āĻ‡āĻŸ](../methods-and-traits.md) (ā§Ēā§Ģ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "[Generics](../generics.md) (45 minutes)" -msgstr "" +msgid "[Generics](../generics.md) (40 minutes)" +msgstr "[āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ•ā§āĻ¸\\](../generics.md) (ā§Ēā§Ļ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "Day 2 Afternoon (3 hours, including breaks)" -msgstr "" +msgid "Day 2 Afternoon (3 hours and 10 minutes, including breaks)" +msgstr "āĻĻā§āĻŦāĻŋāĻ¤ā§€ā§Ÿ āĻĻāĻŋāĻ¨ā§‡āĻ° āĻĻā§āĻĒā§āĻ°āĻŦā§‡āĻ˛āĻž (āĻŦāĻŋāĻ°āĻ¤āĻŋāĻ¸āĻš ā§Š āĻ˜āĻ¨ā§āĻŸāĻž ā§§ā§Ļ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "[Standard Library Types](../std-types.md) (1 hour and 10 minutes)" -msgstr "" +msgid "[Standard Library Types](../std-types.md) (1 hour and 20 minutes)" +msgstr "[āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ° āĻŸāĻžāĻ‡āĻĒāĻ—ā§āĻ˛āĻŋ](../std-types.md) (ā§§ āĻ˜āĻ¨ā§āĻŸāĻž āĻŸā§‹ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md msgid "[Standard Library Traits](../std-traits.md) (1 hour and 40 minutes)" -msgstr "" +msgstr "[āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ° āĻŸā§āĻ°ā§‡āĻ‡āĻŸ](../std-traits.md) (ā§§ āĻ˜āĻ¨ā§āĻŸāĻž āĻŸā§‹ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/running-the-course/course-structure.md -msgid "Day 3 Morning (2 hours and 15 minutes, including breaks)" +msgid "Day 3 Morning (2 hours and 20 minutes, including breaks)" msgstr "" #: src/running-the-course/course-structure.md @@ -1594,19 +1624,19 @@ msgid "[Welcome](../welcome-day-3.md) (3 minutes)" msgstr "" #: src/running-the-course/course-structure.md -msgid "[Memory Management](../memory-management.md) (1 hour and 10 minutes)" +msgid "[Memory Management](../memory-management.md) (1 hour)" msgstr "" #: src/running-the-course/course-structure.md -msgid "[Smart Pointers](../smart-pointers.md) (45 minutes)" +msgid "[Smart Pointers](../smart-pointers.md) (55 minutes)" msgstr "" #: src/running-the-course/course-structure.md -msgid "Day 3 Afternoon (2 hours and 20 minutes, including breaks)" +msgid "Day 3 Afternoon (2 hours and 10 minutes, including breaks)" msgstr "" #: src/running-the-course/course-structure.md -msgid "[Borrowing](../borrowing.md) (1 hour)" +msgid "[Borrowing](../borrowing.md) (50 minutes)" msgstr "" #: src/running-the-course/course-structure.md @@ -1615,7 +1645,7 @@ msgid "" msgstr "" #: src/running-the-course/course-structure.md -msgid "Day 4 Morning (3 hours and 5 minutes, including breaks)" +msgid "Day 4 Morning (2 hours and 50 minutes, including breaks)" msgstr "" #: src/running-the-course/course-structure.md @@ -1631,15 +1661,15 @@ msgid "[Modules](../modules.md) (40 minutes)" msgstr "" #: src/running-the-course/course-structure.md -msgid "[Testing](../testing.md) (1 hour and 5 minutes)" +msgid "[Testing](../testing.md) (1 hour)" msgstr "" #: src/running-the-course/course-structure.md -msgid "Day 4 Afternoon (2 hours, including breaks)" +msgid "Day 4 Afternoon (2 hours and 10 minutes, including breaks)" msgstr "" #: src/running-the-course/course-structure.md -msgid "[Error Handling](../error-handling.md) (45 minutes)" +msgid "[Error Handling](../error-handling.md) (55 minutes)" msgstr "" #: src/running-the-course/course-structure.md @@ -1669,7 +1699,7 @@ msgid "" "C, C++, and Java." msgstr "" "[āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻĄā§āĻ°āĻ¯āĻŧā§‡āĻĄā§‡ āĻ°āĻžāĻ¸ā§āĻŸ](../android.md) āĻšāĻ˛ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻĄā§āĻ°āĻ¯āĻŧā§‡āĻĄ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻŸāĻĢāĻ°ā§āĻŽ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸ āĻāĻ° āĻœāĻ¨ā§āĻ¯ " -"Rust āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ°ā§āĻ§-āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ•ā§‹āĻ°ā§āĻ¸āĨ¤ āĻāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ C, C++, āĻāĻŦāĻ‚ Java āĻāĻ° āĻ¸āĻžāĻĨā§‡ " +"āĻ°āĻžāĻ¸ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ°ā§āĻ§-āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ•ā§‹āĻ°ā§āĻ¸āĨ¤ āĻāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ C, C++, āĻāĻŦāĻ‚ Java āĻāĻ° āĻ¸āĻžāĻĨā§‡ " "āĻ†āĻ¨ā§āĻ¤āĻƒāĻ•āĻžāĻ°ā§āĻ¯āĻ¯ā§‹āĻ—ā§āĻ¯āĻ¤āĻžāĨ¤" #: src/running-the-course/course-structure.md @@ -1709,6 +1739,11 @@ msgid "" "Chromium's `gn` build system, bringing in third-party libraries (\"crates\") " "and C++ interoperability." msgstr "" +"āĻ•ā§āĻ°ā§‹āĻŽāĻŋā§ŸāĻŽ āĻŦā§āĻ°āĻžāĻ‰āĻ¸āĻžāĻ° āĻāĻ° āĻœāĻ¨ā§āĻ¯ā§‡ āĻ°āĻžāĻ¸ā§āĻŸ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯āĻžā§Ÿ āĻāĻ° āĻ“āĻĒāĻ°ā§‡ āĻ…āĻ°ā§āĻ§ā§‡āĻ• āĻĻāĻŋāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ā§‡ " +"āĻ—āĻ­ā§€āĻ° āĻ­āĻžāĻŦā§‡ āĻšāĻ°ā§āĻšāĻž āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡ āĻāĻ–āĻžāĻ¨ā§‡ - [āĻ•ā§āĻ°ā§‹āĻŽāĻŋā§ŸāĻŽ āĻāĻ° āĻœāĻ¨ā§āĻ¯ā§‡ āĻ°āĻžāĻ¸ā§āĻŸ](../chromium.md)| " +"āĻ•ā§āĻ°ā§‹āĻŽāĻŋā§ŸāĻŽ āĻāĻ° `gn` āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¤ā§ƒāĻ¤ā§€āĻ¯āĻŧ āĻĒāĻ•ā§āĻˇā§‡āĻ° " +"āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ (āĻ¯āĻžāĻ•ā§‡ āĻ•ā§āĻ°ā§‡āĻŸ āĻŦāĻ˛āĻž āĻšā§Ÿā§‡ Rust āĻ) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻāĻŦāĻ‚ C++ āĻ†āĻ¨ā§āĻ¤āĻƒ-āĻ•āĻžāĻ°ā§āĻ¯āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻāĻ‡ " +"āĻŦāĻŋāĻˇā§Ÿā§‡ āĻ—ā§āĻ˛āĻŋāĻ° āĻ—āĻ­ā§€āĻ° āĻšāĻ°ā§āĻšāĻž āĻ•āĻ°āĻž āĻšā§Ÿā§‡āĻ›ā§‡|" #: src/running-the-course/course-structure.md msgid "" @@ -1719,7 +1754,7 @@ msgstr "" #: src/running-the-course/course-structure.md msgid "Bare-Metal Rust" -msgstr "Bare-Metal Rust" +msgstr "Bare-Metal āĻ°āĻžāĻ¸ā§āĻŸ" #: src/running-the-course/course-structure.md msgid "" @@ -1727,7 +1762,7 @@ msgid "" "using Rust for bare-metal (embedded) development. Both microcontrollers and " "application processors are covered." msgstr "" -"[Bare-Metal Rust](../bare-metal.md): Rust āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ bare-metal (embedded) " +"[Bare-Metal āĻ°āĻžāĻ¸ā§āĻŸ](../bare-metal.md): āĻ°āĻžāĻ¸ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ bare-metal (embedded) " "āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻŽā§‡āĻ¨ā§āĻŸ āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°ā§‹ āĻĻāĻŋāĻ¨ā§‡āĻ° āĻ•ā§āĻ˛āĻžāĻ¸āĨ¤ āĻŽāĻžāĻ‡āĻ•ā§āĻ°ā§‹āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛āĻžāĻ° āĻāĻŦāĻ‚ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻ° " "āĻ‰āĻ­āĻ¯āĻŧāĻ‡ āĻ•āĻ­āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤" @@ -1744,7 +1779,7 @@ msgstr "" #: src/running-the-course/course-structure.md msgid "Concurrency in Rust" -msgstr "Concurrency in Rust" +msgstr "Concurrency in āĻ°āĻžāĻ¸ā§āĻŸ" #: src/running-the-course/course-structure.md msgid "" @@ -1859,8 +1894,9 @@ msgstr "" #, fuzzy msgid "" "[Korean](https://google.github.io/comprehensive-rust/ko/) by [@keispace]" -"(https://github.com/keispace), [@jiyongp](https://github.com/jiyongp), and " -"[@jooyunghan](https://github.com/jooyunghan)." +"(https://github.com/keispace), [@jiyongp](https://github.com/jiyongp), " +"[@jooyunghan](https://github.com/jooyunghan), and [@namhyung](https://github." +"com/namhyung)." msgstr "" "[Korean](https://google.github.io/comprehensive-rust/ko/) by [@keispace]" "(https://github.com/keispace), [@jiyongp](https://github.com/jiyongp) and " @@ -1925,6 +1961,16 @@ msgstr "" "(https://github.com/CoinEZ) and [@momotaro1105](https://github.com/" "momotaro1105)." +#: src/running-the-course/translations.md +#, fuzzy +msgid "" +"[Italian](https://google.github.io/comprehensive-rust/it/) by " +"[@henrythebuilder](https://github.com/henrythebuilder) and [@detro](https://" +"github.com/detro)." +msgstr "" +"[German](https://google.github.io/comprehensive-rust/de/) by [@Throvn]" +"(https://github.com/Throvn) and [@ronaldfw](https://github.com/ronaldfw)." + #: src/running-the-course/translations.md msgid "" "If you want to help with this effort, please see [our instructions](https://" @@ -1943,7 +1989,7 @@ msgid "" "Cargo is and how it fits into the wider ecosystem and how it fits into this " "training." msgstr "" -"āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻ–āĻ¨ Rust āĻ¸āĻŽā§āĻŦāĻ¨ā§āĻ§ā§‡ āĻĒāĻĄāĻŧāĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻŦā§‡āĻ¨, āĻ†āĻĒāĻ¨āĻŋ āĻļā§€āĻ˜ā§āĻ°āĻ‡ [āĻ•āĻžāĻ°ā§āĻ—ā§‹](https://doc.rust-lang." +"āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻ–āĻ¨ āĻ°āĻžāĻ¸ā§āĻŸ āĻ¸āĻŽā§āĻŦāĻ¨ā§āĻ§ā§‡ āĻĒāĻĄāĻŧāĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻŦā§‡āĻ¨, āĻ†āĻĒāĻ¨āĻŋ āĻļā§€āĻ˜ā§āĻ°āĻ‡ [āĻ•āĻžāĻ°ā§āĻ—ā§‹](https://doc.rust-lang." "org/cargo/) āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻĻā§‡āĻ–āĻž āĻ•āĻ°āĻŦā§‡āĻ¨, āĻāĻ•āĻŸāĻŋ āĻ†āĻĻāĻ°ā§āĻļ āĻŸā§āĻ˛ āĻ¯āĻž Rust āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻāĻŦāĻ‚ " "āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Rust āĻ‡āĻ•ā§‹āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻšāĻžāĻ‡ āĻ•āĻžāĻ°ā§āĻ—ā§‹ āĻ•ā§€ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ " "āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻŦā§ƒāĻšāĻ¤ā§āĻ¤āĻ° āĻ‡āĻ•ā§‹āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻĢāĻŋāĻŸ āĻ•āĻ°ā§‡ āĻ¤āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ•ā§āĻˇāĻŋāĻĒā§āĻ¤ āĻŦāĻŋāĻŦāĻ°āĻŖ āĻĻāĻŋāĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻŸāĻŋ " @@ -2028,7 +2074,7 @@ msgstr "" "āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻāĻŦāĻ‚ `āĻ°āĻ¸ā§āĻŸāĻ†āĻĒ` āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ " "āĻ¸ā§āĻ¯ā§āĻ‡āĻš āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻŦā§‡āĨ¤" -#: src/cargo/rust-ecosystem.md src/hello-world/hello-world.md +#: src/cargo/rust-ecosystem.md src/types-and-values/hello-world.md #: src/tuples-and-arrays/tuples-and-arrays.md src/references/exclusive.md #: src/pattern-matching/destructuring.md src/memory-management/move.md #: src/error-handling/try.md src/android/setup.md src/concurrency/threads.md @@ -2316,19 +2362,22 @@ msgid "[Welcome](./welcome-day-1.md) (5 minutes)" msgstr "" #: src/welcome-day-1.md -msgid "[Hello, World](./hello-world.md) (20 minutes)" +msgid "[Hello, World](./hello-world.md) (15 minutes)" msgstr "" #: src/welcome-day-1.md -msgid "[Types and Values](./types-and-values.md) (1 hour and 5 minutes)" +msgid "[Types and Values](./types-and-values.md) (45 minutes)" msgstr "" #: src/welcome-day-1.md -msgid "[Control Flow Basics](./control-flow-basics.md) (1 hour)" +msgid "[Control Flow Basics](./control-flow-basics.md) (40 minutes)" msgstr "" -#: src/welcome-day-1.md src/welcome-day-2-afternoon.md -msgid "Including 10 minute breaks, this session should take about 3 hours" +#: src/welcome-day-1.md src/welcome-day-3-afternoon.md +#: src/welcome-day-4-afternoon.md +msgid "" +"Including 10 minute breaks, this session should take about 2 hours and 10 " +"minutes" msgstr "" #: src/welcome-day-1.md @@ -2396,10 +2445,6 @@ msgstr "" msgid "[What is Rust?](./hello-world/what-is-rust.md) (10 minutes)" msgstr "" -#: src/hello-world.md -msgid "[Hello, World](./hello-world/hello-world.md) (5 minutes)" -msgstr "" - #: src/hello-world.md msgid "[Benefits of Rust](./hello-world/benefits.md) (3 minutes)" msgstr "" @@ -2409,7 +2454,7 @@ msgid "[Playground](./hello-world/playground.md) (2 minutes)" msgstr "" #: src/hello-world.md -msgid "This segment should take about 20 minutes" +msgid "This segment should take about 15 minutes" msgstr "" #: src/hello-world/what-is-rust.md @@ -2491,79 +2536,6 @@ msgstr "" msgid "Focuses on reliability and safety without sacrificing performance." msgstr "" -#: src/hello-world/hello-world.md -msgid "" -"Let us jump into the simplest possible Rust program, a classic Hello World " -"program:" -msgstr "" - -#: src/hello-world/hello-world.md -msgid "\"Hello 🌍!\"" -msgstr "" - -#: src/hello-world/hello-world.md -msgid "What you see:" -msgstr "āĻ¯āĻž āĻ¤ā§āĻŽāĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ“āĻƒ" - -#: src/hello-world/hello-world.md -msgid "Functions are introduced with `fn`." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "Blocks are delimited by curly braces like in C and C++." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "The `main` function is the entry point of the program." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "Rust has hygienic macros, `println!` is an example of this." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "Rust strings are UTF-8 encoded and can contain any Unicode character." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "" -"This slide tries to make the students comfortable with Rust code. They will " -"see a ton of it over the next four days so we start small with something " -"familiar." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "" -"Rust is very much like other languages in the C/C++/Java tradition. It is " -"imperative and it doesn't try to reinvent things unless absolutely necessary." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "Rust is modern with full support for things like Unicode." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "" -"Rust uses macros for situations where you want to have a variable number of " -"arguments (no function [overloading](../control-flow-basics/functions.md))." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "" -"Macros being 'hygienic' means they don't accidentally capture identifiers " -"from the scope they are used in. Rust macros are actually only [partially " -"hygienic](https://veykril.github.io/tlborm/decl-macros/minutiae/hygiene." -"html)." -msgstr "" - -#: src/hello-world/hello-world.md -msgid "" -"Rust is multi-paradigm. For example, it has powerful [object-oriented " -"programming features](https://doc.rust-lang.org/book/ch17-00-oop.html), and, " -"while it is not a functional language, it includes a range of [functional " -"concepts](https://doc.rust-lang.org/book/ch13-00-functional-features.html)." -msgstr "" - #: src/hello-world/benefits.md msgid "Some unique selling points of Rust:" msgstr "RustāĻāĻ° āĻ•āĻŋāĻ›ā§ āĻ…āĻ¨āĻ¨ā§āĻ¯ āĻŦāĻŋāĻ•ā§āĻ°āĻ¯āĻŧ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ:" @@ -2629,7 +2601,7 @@ msgstr "Enums and pattern matching." #: src/hello-world/benefits.md msgid "Generics." -msgstr "Generics." +msgstr "āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ•ā§āĻ¸|" #: src/hello-world/benefits.md msgid "No overhead FFI." @@ -2719,32 +2691,109 @@ msgid "" "assembly." msgstr "" +#: src/types-and-values.md +msgid "[Hello, World](./types-and-values/hello-world.md) (5 minutes)" +msgstr "" + #: src/types-and-values.md msgid "[Variables](./types-and-values/variables.md) (5 minutes)" msgstr "" #: src/types-and-values.md -msgid "[Values](./types-and-values/values.md) (10 minutes)" +msgid "[Values](./types-and-values/values.md) (5 minutes)" msgstr "" #: src/types-and-values.md -msgid "[Arithmetic](./types-and-values/arithmetic.md) (5 minutes)" +msgid "[Arithmetic](./types-and-values/arithmetic.md) (3 minutes)" msgstr "" #: src/types-and-values.md -msgid "[Strings](./types-and-values/strings.md) (10 minutes)" +msgid "[Strings](./types-and-values/strings.md) (5 minutes)" msgstr "" #: src/types-and-values.md -msgid "[Type Inference](./types-and-values/inference.md) (5 minutes)" +msgid "[Type Inference](./types-and-values/inference.md) (3 minutes)" msgstr "" #: src/types-and-values.md -msgid "[Exercise: Fibonacci](./types-and-values/exercise.md) (30 minutes)" +msgid "[Exercise: Fibonacci](./types-and-values/exercise.md) (15 minutes)" msgstr "" -#: src/types-and-values.md src/testing.md src/unsafe-rust.md -msgid "This segment should take about 1 hour and 5 minutes" +#: src/types-and-values.md src/methods-and-traits.md src/iterators.md +msgid "This segment should take about 45 minutes" +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "" +"Let us jump into the simplest possible Rust program, a classic Hello World " +"program:" +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "\"Hello 🌍!\"" +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "What you see:" +msgstr "āĻ¯āĻž āĻ¤ā§āĻŽāĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ“āĻƒ" + +#: src/types-and-values/hello-world.md +msgid "Functions are introduced with `fn`." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "Blocks are delimited by curly braces like in C and C++." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "The `main` function is the entry point of the program." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "Rust has hygienic macros, `println!` is an example of this." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "Rust strings are UTF-8 encoded and can contain any Unicode character." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "" +"This slide tries to make the students comfortable with Rust code. They will " +"see a ton of it over the next four days so we start small with something " +"familiar." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "" +"Rust is very much like other languages in the C/C++/Java tradition. It is " +"imperative and it doesn't try to reinvent things unless absolutely necessary." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "Rust is modern with full support for things like Unicode." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "" +"Rust uses macros for situations where you want to have a variable number of " +"arguments (no function [overloading](../control-flow-basics/functions.md))." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "" +"Macros being 'hygienic' means they don't accidentally capture identifiers " +"from the scope they are used in. Rust macros are actually only [partially " +"hygienic](https://veykril.github.io/tlborm/decl-macros/minutiae/hygiene." +"html)." +msgstr "" + +#: src/types-and-values/hello-world.md +msgid "" +"Rust is multi-paradigm. For example, it has powerful [object-oriented " +"programming features](https://doc.rust-lang.org/book/ch17-00-oop.html), and, " +"while it is not a functional language, it includes a range of [functional " +"concepts](https://doc.rust-lang.org/book/ch13-00-functional-features.html)." msgstr "" #: src/types-and-values/variables.md @@ -2753,16 +2802,17 @@ msgid "" "`let`:" msgstr "" -#: src/types-and-values/variables.md src/control-flow-basics/loops.md -#: src/control-flow-basics/break-continue.md +#: src/types-and-values/variables.md src/control-flow-basics/loops/for.md #: src/control-flow-basics/blocks-and-scopes.md msgid "\"x: {x}\"" msgstr "" #: src/types-and-values/variables.md -msgid "" -"// x = 20;\n" -" // println!(\"x: {x}\");\n" +msgid "// x = 20;" +msgstr "" + +#: src/types-and-values/variables.md +msgid "// println!(\"x: {x}\");" msgstr "" #: src/types-and-values/variables.md @@ -2836,7 +2886,7 @@ msgstr "`3.14`, `-10.0e20`, `2f32`" msgid "Unicode scalar values" msgstr "Unicode scalar values" -#: src/types-and-values/values.md +#: src/types-and-values/values.md src/android/aidl/types/primitives.md msgid "`char`" msgstr "`char`" @@ -2848,7 +2898,7 @@ msgstr "`'a'`, `'Îą'`, `'∞'`" msgid "Booleans" msgstr "Booleans" -#: src/types-and-values/values.md +#: src/types-and-values/values.md src/android/aidl/types/primitives.md msgid "`bool`" msgstr "`bool`" @@ -2956,12 +3006,14 @@ msgstr "" msgid "\"final sentence: {}\"" msgstr "" -#: src/types-and-values/strings.md src/async/control-flow/join.md +#: src/types-and-values/strings.md +#: src/methods-and-traits/traits/associated-types.md +#: src/async/control-flow/join.md msgid "\"{:?}\"" msgstr "" #: src/types-and-values/strings.md -msgid "//println!(\"{:?}\", &sentence[12..13]);\n" +msgid "//println!(\"{:?}\", &sentence[12..13]);" msgstr "" #: src/types-and-values/strings.md @@ -3004,6 +3056,12 @@ msgstr "" "`r\"\\n\" == \"\\\\n\"`. You can embed double-quotes by using an equal " "amount of `#` on either side of the quotes:" +#: src/types-and-values/strings.md +msgid "" +"Using `{:?}` is a convenient way to print array/vector/struct of values for " +"debugging purposes, and it's commonly used in code." +msgstr "" + #: src/types-and-values/inference.md msgid "Rust will look at how the variable is _used_ to determine the type:" msgstr "" @@ -3031,7 +3089,7 @@ msgid "" msgstr "" #: src/types-and-values/inference.md -msgid "// ERROR: no implementation for `{float} == {integer}`\n" +msgid "// ERROR: no implementation for `{float} == {integer}`" msgstr "" #: src/types-and-values/exercise.md @@ -3048,7 +3106,7 @@ msgid "" msgstr "" #: src/types-and-values/exercise.md -msgid "// The base case.\n" +msgid "// The base case." msgstr "" #: src/types-and-values/exercise.md src/control-flow-basics/exercise.md @@ -3057,7 +3115,7 @@ msgid "\"Implement this\"" msgstr "āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨" #: src/types-and-values/exercise.md -msgid "// The recursive case.\n" +msgid "// The recursive case." msgstr "" #: src/types-and-values/exercise.md src/types-and-values/solution.md @@ -3065,7 +3123,7 @@ msgid "\"fib(n) = {}\"" msgstr "" #: src/control-flow-basics.md -msgid "[Conditionals](./control-flow-basics/conditionals.md) (5 minutes)" +msgid "[if Expressions](./control-flow-basics/if.md) (4 minutes)" msgstr "" #: src/control-flow-basics.md @@ -3074,12 +3132,12 @@ msgstr "" #: src/control-flow-basics.md msgid "" -"[break and continue](./control-flow-basics/break-continue.md) (5 minutes)" +"[break and continue](./control-flow-basics/break-continue.md) (4 minutes)" msgstr "" #: src/control-flow-basics.md msgid "" -"[Blocks and Scopes](./control-flow-basics/blocks-and-scopes.md) (10 minutes)" +"[Blocks and Scopes](./control-flow-basics/blocks-and-scopes.md) (5 minutes)" msgstr "" #: src/control-flow-basics.md @@ -3092,79 +3150,61 @@ msgstr "" #: src/control-flow-basics.md msgid "" -"[Exercise: Collatz Sequence](./control-flow-basics/exercise.md) (30 minutes)" +"[Exercise: Collatz Sequence](./control-flow-basics/exercise.md) (15 minutes)" msgstr "" -#: src/control-flow-basics.md src/tuples-and-arrays.md src/borrowing.md -msgid "This segment should take about 1 hour" +#: src/control-flow-basics.md src/generics.md src/modules.md +msgid "This segment should take about 40 minutes" msgstr "" -#: src/control-flow-basics/conditionals.md -msgid "Much of the Rust syntax will be familiar to you from C, C++ or Java:" -msgstr "C, C++ or Java āĻĨā§‡āĻ•ā§‡ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ°āĻžāĻ¸ā§āĻŸ āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•ā§āĻ¸ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻŽāĻ¨ā§‡ āĻšāĻŦā§‡āĻƒ" - -#: src/control-flow-basics/conditionals.md -msgid "Blocks are delimited by curly braces." -msgstr "" - -#: src/control-flow-basics/conditionals.md -msgid "" -"Line comments are started with `//`, block comments are delimited by `/* ... " -"*/`." -msgstr "" - -#: src/control-flow-basics/conditionals.md -msgid "Keywords like `if` and `while` work the same." -msgstr "" - -#: src/control-flow-basics/conditionals.md -msgid "Variable assignment is done with `=`, comparison is done with `==`." -msgstr "" - -#: src/control-flow-basics/conditionals.md +#: src/control-flow-basics/if.md msgid "`if` expressions" msgstr "" -#: src/control-flow-basics/conditionals.md +#: src/control-flow-basics/if.md msgid "" "You use [`if` expressions](https://doc.rust-lang.org/reference/expressions/" "if-expr.html#if-expressions) exactly like `if` statements in other languages:" msgstr "" -#: src/control-flow-basics/conditionals.md -msgid "\"small\"" +#: src/control-flow-basics/if.md +msgid "\"zero!\"" msgstr "" -#: src/control-flow-basics/conditionals.md +#: src/control-flow-basics/if.md msgid "\"biggish\"" msgstr "" -#: src/control-flow-basics/conditionals.md +#: src/control-flow-basics/if.md msgid "\"huge\"" msgstr "" -#: src/control-flow-basics/conditionals.md +#: src/control-flow-basics/if.md msgid "" "In addition, you can use `if` as an expression. The last expression of each " "block becomes the value of the `if` expression:" msgstr "" -#: src/control-flow-basics/conditionals.md +#: src/control-flow-basics/if.md +msgid "\"small\"" +msgstr "" + +#: src/control-flow-basics/if.md msgid "\"large\"" msgstr "" -#: src/control-flow-basics/conditionals.md +#: src/control-flow-basics/if.md msgid "\"number size: {}\"" msgstr "" -#: src/control-flow-basics/conditionals.md +#: src/control-flow-basics/if.md msgid "" "Because `if` is an expression and must have a particular type, both of its " "branch blocks must have the same type. Show what happens if you add `;` " "after `\"small\"` in the second example." msgstr "" -#: src/control-flow-basics/conditionals.md +#: 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 " @@ -3190,39 +3230,43 @@ msgstr "" msgid "\"Final x: {x}\"" msgstr "" -#: src/control-flow-basics/loops.md -msgid "`for`" -msgstr "" - -#: src/control-flow-basics/loops.md +#: src/control-flow-basics/loops/for.md msgid "" "The [`for` loop](https://doc.rust-lang.org/std/keyword.for.html) iterates " -"over ranges of values:" +"over ranges of values or the items in a collection:" msgstr "" -#: src/control-flow-basics/loops.md -msgid "`loop`" +#: src/control-flow-basics/loops/for.md +msgid "\"elem: {elem}\"" msgstr "" -#: src/control-flow-basics/loops.md +#: src/control-flow-basics/loops/for.md +msgid "" +"Under the hood `for` loops use a concept called \"iterators\" to handle " +"iterating over different kinds of ranges/collections. Iterators will be " +"discussed in more detail later." +msgstr "" + +#: src/control-flow-basics/loops/for.md +msgid "" +"Note that the `for` loop only iterates to `4`. Show the `1..=5` syntax for " +"an inclusive range." +msgstr "" + +#: src/control-flow-basics/loops/loop.md msgid "" "The [`loop` statement](https://doc.rust-lang.org/std/keyword.loop.html) just " "loops forever, until a `break`." msgstr "" -#: src/control-flow-basics/loops.md +#: src/control-flow-basics/loops/loop.md msgid "\"{i}\"" msgstr "" -#: src/control-flow-basics/loops.md +#: src/control-flow-basics/break-continue.md msgid "" -"We will discuss iteration later; for now, just stick to range expressions." -msgstr "" - -#: src/control-flow-basics/loops.md -msgid "" -"Note that the `for` loop only iterates to `4`. Show the `1..=5` syntax for " -"an inclusive range." +"If you want to immediately start the next iteration use [`continue`](https://" +"doc.rust-lang.org/reference/expressions/loop-expr.html#continue-expressions)." msgstr "" #: src/control-flow-basics/break-continue.md @@ -3233,32 +3277,26 @@ msgid "" "`loop` expression." msgstr "" -#: src/control-flow-basics/break-continue.md -msgid "" -"If you want to immediately start the next iteration use [`continue`](https://" -"doc.rust-lang.org/reference/expressions/loop-expr.html#continue-expressions)." +#: src/control-flow-basics/break-continue.md src/std-traits/exercise.md +#: src/std-traits/solution.md src/smart-pointers/trait-objects.md +#: src/modules/exercise.md src/modules/solution.md +#: src/android/build-rules/library.md +#: src/android/interoperability/cpp/rust-bridge.md +#: src/async/pitfalls/cancellation.md +msgid "\"{}\"" msgstr "" -#: src/control-flow-basics/break-continue.md -msgid "\"{result}\"" -msgstr "" - -#: src/control-flow-basics/break-continue.md +#: src/control-flow-basics/break-continue/labels.md msgid "" "Both `continue` and `break` can optionally take a label argument which is " "used to break out of nested loops:" msgstr "" -#: src/control-flow-basics/break-continue.md -msgid "\"x: {x}, i: {i}\"" +#: src/control-flow-basics/break-continue/labels.md +msgid "\"elements searched: {elements_searched}\"" msgstr "" -#: src/control-flow-basics/break-continue.md -msgid "" -"In this case we break the outer loop after 3 iterations of the inner loop." -msgstr "" - -#: src/control-flow-basics/break-continue.md +#: 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 " @@ -3286,65 +3324,61 @@ msgid "" "`()`." msgstr "" -#: src/control-flow-basics/blocks-and-scopes.md -msgid "Scopes and Shadowing" -msgstr "" - -#: src/control-flow-basics/blocks-and-scopes.md -msgid "A variable's scope is limited to the enclosing block." -msgstr "" - -#: src/control-flow-basics/blocks-and-scopes.md -msgid "" -"You can shadow variables, both those from outer scopes and variables from " -"the same scope:" -msgstr "" - -#: src/control-flow-basics/blocks-and-scopes.md -msgid "\"before: {a}\"" -msgstr "" - -#: src/control-flow-basics/blocks-and-scopes.md src/std-traits/from-and-into.md -#: src/slices-and-lifetimes/solution.md -msgid "\"hello\"" -msgstr "" - -#: src/control-flow-basics/blocks-and-scopes.md -msgid "\"inner scope: {a}\"" -msgstr "" - -#: src/control-flow-basics/blocks-and-scopes.md -msgid "\"shadowed in inner scope: {a}\"" -msgstr "" - -#: src/control-flow-basics/blocks-and-scopes.md -msgid "\"after: {a}\"" -msgstr "" - #: src/control-flow-basics/blocks-and-scopes.md msgid "" "You can show how the value of the block changes by changing the last line in " "the block. For instance, adding/removing a semicolon or using a `return`." msgstr "" -#: src/control-flow-basics/blocks-and-scopes.md +#: src/control-flow-basics/blocks-and-scopes/scopes.md +msgid "A variable's scope is limited to the enclosing block." +msgstr "" + +#: src/control-flow-basics/blocks-and-scopes/scopes.md +msgid "" +"You can shadow variables, both those from outer scopes and variables from " +"the same scope:" +msgstr "" + +#: src/control-flow-basics/blocks-and-scopes/scopes.md +msgid "\"before: {a}\"" +msgstr "" + +#: src/control-flow-basics/blocks-and-scopes/scopes.md +#: src/std-traits/from-and-into.md src/slices-and-lifetimes/solution.md +msgid "\"hello\"" +msgstr "" + +#: src/control-flow-basics/blocks-and-scopes/scopes.md +msgid "\"inner scope: {a}\"" +msgstr "" + +#: src/control-flow-basics/blocks-and-scopes/scopes.md +msgid "\"shadowed in inner scope: {a}\"" +msgstr "" + +#: src/control-flow-basics/blocks-and-scopes/scopes.md +msgid "\"after: {a}\"" +msgstr "" + +#: src/control-flow-basics/blocks-and-scopes/scopes.md msgid "" "Show that a variable's scope is limited by adding a `b` in the inner block " "in the last example, and then trying to access it outside that block." msgstr "" -#: src/control-flow-basics/blocks-and-scopes.md +#: 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 " "the same name, depending where you use it in the code." msgstr "" -#: src/control-flow-basics/blocks-and-scopes.md +#: src/control-flow-basics/blocks-and-scopes/scopes.md msgid "A shadowing variable can have a different type." msgstr "" -#: src/control-flow-basics/blocks-and-scopes.md +#: src/control-flow-basics/blocks-and-scopes/scopes.md msgid "" "Shadowing looks obscure at first, but is convenient for holding on to values " "after `.unwrap()`." @@ -3614,12 +3648,12 @@ msgid "Welcome Back" msgstr "āĻ¸ā§āĻŦāĻžāĻ—āĻ¤āĻŽ" #: src/welcome-day-1-afternoon.md -msgid "[Tuples and Arrays](./tuples-and-arrays.md) (1 hour)" +msgid "[Tuples and Arrays](./tuples-and-arrays.md) (35 minutes)" msgstr "" #: src/welcome-day-1-afternoon.md -msgid "[References](./references.md) (50 minutes)" -msgstr "" +msgid "[References](./references.md) (35 minutes)" +msgstr "[āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸](./references.md)(ā§Šā§Ģ āĻŽāĻŋāĻ¨āĻŋāĻŸ)" #: src/welcome-day-1-afternoon.md msgid "[User-Defined Types](./user-defined-types.md) (50 minutes)" @@ -3627,7 +3661,7 @@ msgstr "" #: src/welcome-day-1-afternoon.md msgid "" -"Including 10 minute breaks, this session should take about 2 hours and 55 " +"Including 10 minute breaks, this session should take about 2 hours and 15 " "minutes" msgstr "" @@ -3641,15 +3675,17 @@ msgid "[Array Iteration](./tuples-and-arrays/iteration.md) (3 minutes)" msgstr "" #: src/tuples-and-arrays.md -msgid "[Pattern Matching](./tuples-and-arrays/match.md) (10 minutes)" +msgid "" +"[Patterns and Destructuring](./tuples-and-arrays/destructuring.md) (5 " +"minutes)" msgstr "" #: src/tuples-and-arrays.md -msgid "[Destructuring](./tuples-and-arrays/destructuring.md) (5 minutes)" +msgid "[Exercise: Nested Arrays](./tuples-and-arrays/exercise.md) (15 minutes)" msgstr "" -#: src/tuples-and-arrays.md -msgid "[Exercise: Nested Arrays](./tuples-and-arrays/exercise.md) (30 minutes)" +#: src/tuples-and-arrays.md src/references.md +msgid "This segment should take about 35 minutes" msgstr "" #: src/tuples-and-arrays/tuples-and-arrays.md @@ -3660,7 +3696,6 @@ msgid "" msgstr "" #: src/tuples-and-arrays/tuples-and-arrays.md -#: src/tuples-and-arrays/destructuring.md msgid "Arrays" msgstr "Arrays" @@ -3673,7 +3708,6 @@ msgid "`[20, 30, 40]`, `[0; 3]`" msgstr "`[20, 30, 40]`, `[0; 3]`" #: src/tuples-and-arrays/tuples-and-arrays.md -#: src/tuples-and-arrays/destructuring.md msgid "Tuples" msgstr "Tuples" @@ -3781,206 +3815,55 @@ msgid "" "`debug_assert!` compile to nothing in release builds." msgstr "" -#: src/tuples-and-arrays/match.md +#: src/tuples-and-arrays/destructuring.md msgid "" -"The `match` keyword lets you match a value against one or more _patterns_. " -"The comparisons are done from top to bottom and the first match wins." +"When working with tuples and other structured values it's common to want to " +"extract the inner values into local variables. This can be done manually by " +"directly accessing the inner values:" msgstr "" -#: src/tuples-and-arrays/match.md -msgid "The patterns can be simple values, similarly to `switch` in C and C++:" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "'x'" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "'q'" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "\"Quitting\"" -msgstr "" - -#: src/tuples-and-arrays/match.md src/std-traits/solution.md -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "'a'" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "'s'" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "'w'" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "'d'" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "\"Moving around\"" -msgstr "" - -#: src/tuples-and-arrays/match.md src/error-handling/exercise.md -#: src/error-handling/solution.md -msgid "'0'" -msgstr "" - -#: src/tuples-and-arrays/match.md src/error-handling/exercise.md -#: src/error-handling/solution.md -msgid "'9'" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "\"Number input\"" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "\"Lowercase: {key}\"" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "\"Something else\"" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "" -"The `_` pattern is a wildcard pattern which matches any value. The " -"expressions _must_ be irrefutable, meaning that it covers every possibility, " -"so `_` is often used as the final catch-all case." -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "" -"Match can be used as an expression. Just like `if`, each match arm must have " -"the same type. The type is the last expression of the block, if any. In the " -"example above, the type is `()`." -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "" -"A variable in the pattern (`key` in this example) will create a binding that " -"can be used within the match arm." -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "A match guard causes the arm to match only if the condition is true." -msgstr "" - -#: src/tuples-and-arrays/match.md src/user-defined-types/named-structs.md -#: src/user-defined-types/enums.md src/methods-and-traits/methods.md -msgid "Key Points:" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "" -"You might point out how some specific characters are being used when in a " -"pattern" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "`|` as an `or`" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "`..` can expand as much as it needs to be" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "`1..=5` represents an inclusive range" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "`_` is a wild card" -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "" -"Match guards as a separate syntax feature are important and necessary when " -"we wish to concisely express more complex ideas than patterns alone would " -"allow." -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "" -"They are not the same as separate `if` expression inside of the match arm. " -"An `if` expression inside of the branch block (after `=>`) happens after the " -"match arm is selected. Failing the `if` condition inside of that block won't " -"result in other arms of the original `match` expression being considered." -msgstr "" - -#: src/tuples-and-arrays/match.md -msgid "" -"The condition defined in the guard applies to every expression in a pattern " -"with an `|`." +#: src/tuples-and-arrays/destructuring.md +msgid "\"left: {left}, right: {right}\"" msgstr "" #: src/tuples-and-arrays/destructuring.md msgid "" -"Destructuring is a way of extracting data from a data structure by writing a " -"pattern that is matched up to the data structure, binding variables to " -"subcomponents of the data structure." +"However, Rust also supports using pattern matching to destructure a larger " +"value into its constituent parts:" msgstr "" #: src/tuples-and-arrays/destructuring.md -msgid "You can destructure tuples and arrays by matching on their elements:" +msgid "This works with any kind of structured value:" msgstr "" #: src/tuples-and-arrays/destructuring.md -msgid "\"on Y axis\"" -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "\"on X axis\"" -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "\"left of Y axis\"" -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "\"below X axis\"" -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "\"first quadrant\"" -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "\"Tell me about {triple:?}\"" -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "\"First is 0, y = {y}, and z = {z}\"" -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "\"First is 1 and the rest were ignored\"" -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "\"All elements were ignored\"" -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "Create a new array pattern using `_` to represent an element." -msgstr "" - -#: src/tuples-and-arrays/destructuring.md -msgid "Add more values to the array." +msgid "\"a: {a}, b: {b}\"" msgstr "" #: src/tuples-and-arrays/destructuring.md msgid "" -"Point out that how `..` will expand to account for different number of " -"elements." +"The patterns used here are \"irrefutable\", meaning that the compiler can " +"statically verify that the value on the right of `=` has the same structure " +"as the pattern." msgstr "" #: src/tuples-and-arrays/destructuring.md -msgid "Show matching against the tail with patterns `[.., b]` and `[a@..,b]`" +msgid "" +"A variable name is an irrefutable pattern that always matches any value, " +"hence why we can also use `let` to declare a single variable." +msgstr "" + +#: src/tuples-and-arrays/destructuring.md +msgid "" +"Rust also supports using patterns in conditionals, allowing for equality " +"comparison and destructuring to happen at the same time. This form of " +"pattern matching will be discussed in more detail later." +msgstr "" + +#: src/tuples-and-arrays/destructuring.md +msgid "" +"Edit the examples above to show the compiler error when the pattern doesn't " +"match the value being matched on." msgstr "" #: src/tuples-and-arrays/exercise.md @@ -4009,7 +3892,11 @@ msgstr "" #: src/tuples-and-arrays/exercise.md src/borrowing/exercise.md #: src/unsafe-rust/exercise.md -msgid "// TODO: remove this when you're done with your implementation.\n" +msgid "// TODO: remove this when you're done with your implementation." +msgstr "" + +#: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md +msgid "//\n" msgstr "" #: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md @@ -4024,10 +3911,6 @@ msgstr "" msgid "\"transposed: {:#?}\"" msgstr "" -#: src/tuples-and-arrays/solution.md -msgid "//\n" -msgstr "" - #: src/references.md msgid "[Shared References](./references/shared.md) (10 minutes)" msgstr "" @@ -4037,11 +3920,7 @@ msgid "[Exclusive References](./references/exclusive.md) (10 minutes)" msgstr "" #: src/references.md -msgid "[Exercise: Geometry](./references/exercise.md) (30 minutes)" -msgstr "" - -#: src/references.md src/user-defined-types.md src/pattern-matching.md -msgid "This segment should take about 50 minutes" +msgid "[Exercise: Geometry](./references/exercise.md) (15 minutes)" msgstr "" #: src/references/shared.md @@ -4088,8 +3967,8 @@ msgstr "" #: src/references/shared.md msgid "" "Rust will auto-dereference in some cases, in particular when invoking " -"methods (try `r.count_ones()`). There is no need for an `->` operator like " -"in C++." +"methods (try `r.is_ascii()`). There is no need for an `->` operator like in " +"C++." msgstr "" #: src/references/shared.md @@ -4151,20 +4030,30 @@ msgstr "" #: src/references/exercise.md msgid "" "// Calculate the magnitude of a vector by summing the squares of its " -"coordinates\n" -"// and taking the square root. Use the `sqrt()` method to calculate the " -"square\n" -"// root, like `v.sqrt()`.\n" +"coordinates" msgstr "" #: src/references/exercise.md msgid "" -"// Normalize a vector by calculating its magnitude and dividing all of its\n" -"// coordinates by that magnitude.\n" +"// and taking the square root. Use the `sqrt()` method to calculate the " +"square" msgstr "" #: src/references/exercise.md -msgid "// Use the following `main` to test your work.\n" +msgid "// root, like `v.sqrt()`." +msgstr "" + +#: src/references/exercise.md +msgid "" +"// Normalize a vector by calculating its magnitude and dividing all of its" +msgstr "" + +#: src/references/exercise.md +msgid "// coordinates by that magnitude." +msgstr "" + +#: src/references/exercise.md +msgid "// Use the following `main` to test your work." msgstr "" #: src/references/exercise.md src/references/solution.md @@ -4215,6 +4104,10 @@ msgid "" "[Exercise: Elevator Events](./user-defined-types/exercise.md) (15 minutes)" msgstr "" +#: src/user-defined-types.md src/borrowing.md +msgid "This segment should take about 50 minutes" +msgstr "" + #: src/user-defined-types/named-structs.md msgid "Like C and C++, Rust has support for custom structs:" msgstr "" @@ -4236,6 +4129,11 @@ msgstr "" msgid "\"Jackie\"" msgstr "" +#: src/user-defined-types/named-structs.md src/user-defined-types/enums.md +#: src/pattern-matching/match.md src/methods-and-traits/methods.md +msgid "Key Points:" +msgstr "" + #: src/user-defined-types/named-structs.md msgid "Structs work like in C or C++." msgstr "" @@ -4298,9 +4196,8 @@ msgstr "" #: src/user-defined-types/tuple-structs.md #: src/android/interoperability/cpp/cpp-bridge.md -#: src/bare-metal/microcontrollers/type-state.md #: src/async/pitfalls/cancellation.md -msgid "// ...\n" +msgid "// ..." msgstr "" #: src/user-defined-types/tuple-structs.md @@ -4348,15 +4245,15 @@ msgid "" msgstr "" #: src/user-defined-types/enums.md -msgid "// Simple variant\n" +msgid "// Simple variant" msgstr "" #: src/user-defined-types/enums.md -msgid "// Tuple variant\n" +msgid "// Tuple variant" msgstr "" #: src/user-defined-types/enums.md -msgid "// Struct variant\n" +msgid "// Struct variant" msgstr "" #: src/user-defined-types/enums.md @@ -4608,7 +4505,7 @@ msgid "" msgstr "" #: src/user-defined-types/aliases.md -msgid "// Aliases are more useful with long, complex types:\n" +msgid "// Aliases are more useful with long, complex types:" msgstr "" #: src/user-defined-types/aliases.md @@ -4636,7 +4533,7 @@ msgid "" msgstr "" #: src/user-defined-types/exercise.md -msgid "// TODO: add required variants\n" +msgid "// TODO: add required variants" msgstr "" #: src/user-defined-types/exercise.md src/user-defined-types/solution.md @@ -4757,23 +4654,27 @@ msgid "[Welcome](./welcome-day-2.md) (3 minutes)" msgstr "" #: src/welcome-day-2.md -msgid "[Pattern Matching](./pattern-matching.md) (50 minutes)" +msgid "[Pattern Matching](./pattern-matching.md) (1 hour)" msgstr "" #: src/welcome-day-2.md -msgid "[Methods and Traits](./methods-and-traits.md) (55 minutes)" +msgid "[Methods and Traits](./methods-and-traits.md) (45 minutes)" msgstr "" #: src/welcome-day-2.md -msgid "[Generics](./generics.md) (45 minutes)" +msgid "[Generics](./generics.md) (40 minutes)" msgstr "" #: src/welcome-day-2.md src/welcome-day-4.md msgid "" -"Including 10 minute breaks, this session should take about 3 hours and 5 " +"Including 10 minute breaks, this session should take about 2 hours and 50 " "minutes" msgstr "" +#: src/pattern-matching.md +msgid "[Matching Values](./pattern-matching/match.md) (10 minutes)" +msgstr "" + #: src/pattern-matching.md msgid "[Destructuring](./pattern-matching/destructuring.md) (10 minutes)" msgstr "" @@ -4788,6 +4689,142 @@ msgid "" "minutes)" msgstr "" +#: src/pattern-matching.md src/memory-management.md src/testing.md +msgid "This segment should take about 1 hour" +msgstr "" + +#: src/pattern-matching/match.md +msgid "" +"The `match` keyword lets you match a value against one or more _patterns_. " +"The comparisons are done from top to bottom and the first match wins." +msgstr "" + +#: src/pattern-matching/match.md +msgid "The patterns can be simple values, similarly to `switch` in C and C++:" +msgstr "" + +#: src/pattern-matching/match.md +msgid "'x'" +msgstr "" + +#: src/pattern-matching/match.md +msgid "'q'" +msgstr "" + +#: src/pattern-matching/match.md +msgid "\"Quitting\"" +msgstr "" + +#: src/pattern-matching/match.md src/std-traits/solution.md +#: src/error-handling/exercise.md src/error-handling/solution.md +msgid "'a'" +msgstr "" + +#: src/pattern-matching/match.md +msgid "'s'" +msgstr "" + +#: src/pattern-matching/match.md +msgid "'w'" +msgstr "" + +#: src/pattern-matching/match.md +msgid "'d'" +msgstr "" + +#: src/pattern-matching/match.md +msgid "\"Moving around\"" +msgstr "" + +#: src/pattern-matching/match.md src/error-handling/exercise.md +#: src/error-handling/solution.md +msgid "'0'" +msgstr "" + +#: src/pattern-matching/match.md src/error-handling/exercise.md +#: src/error-handling/solution.md +msgid "'9'" +msgstr "" + +#: src/pattern-matching/match.md +msgid "\"Number input\"" +msgstr "" + +#: src/pattern-matching/match.md +msgid "\"Lowercase: {key}\"" +msgstr "" + +#: src/pattern-matching/match.md +msgid "\"Something else\"" +msgstr "" + +#: src/pattern-matching/match.md +msgid "" +"The `_` pattern is a wildcard pattern which matches any value. The " +"expressions _must_ be exhaustive, meaning that it covers every possibility, " +"so `_` is often used as the final catch-all case." +msgstr "" + +#: src/pattern-matching/match.md +msgid "" +"Match can be used as an expression. Just like `if`, each match arm must have " +"the same type. The type is the last expression of the block, if any. In the " +"example above, the type is `()`." +msgstr "" + +#: src/pattern-matching/match.md +msgid "" +"A variable in the pattern (`key` in this example) will create a binding that " +"can be used within the match arm." +msgstr "" + +#: src/pattern-matching/match.md +msgid "A match guard causes the arm to match only if the condition is true." +msgstr "" + +#: src/pattern-matching/match.md +msgid "" +"You might point out how some specific characters are being used when in a " +"pattern" +msgstr "" + +#: src/pattern-matching/match.md +msgid "`|` as an `or`" +msgstr "" + +#: src/pattern-matching/match.md +msgid "`..` can expand as much as it needs to be" +msgstr "" + +#: src/pattern-matching/match.md +msgid "`1..=5` represents an inclusive range" +msgstr "" + +#: src/pattern-matching/match.md +msgid "`_` is a wild card" +msgstr "" + +#: src/pattern-matching/match.md +msgid "" +"Match guards as a separate syntax feature are important and necessary when " +"we wish to concisely express more complex ideas than patterns alone would " +"allow." +msgstr "" + +#: src/pattern-matching/match.md +msgid "" +"They are not the same as separate `if` expression inside of the match arm. " +"An `if` expression inside of the branch block (after `=>`) happens after the " +"match arm is selected. Failing the `if` condition inside of that block won't " +"result in other arms of the original `match` expression being considered." +msgstr "" + +#: src/pattern-matching/match.md +msgid "" +"The condition defined in the guard applies to every expression in a pattern " +"with an `|`." +msgstr "" + #: src/pattern-matching/destructuring.md msgid "Like tuples, structs and enums can also be destructured by matching:" msgstr "" @@ -5083,11 +5120,7 @@ msgid "[Traits](./methods-and-traits/traits.md) (10 minutes)" msgstr "" #: src/methods-and-traits.md -msgid "[Deriving](./methods-and-traits/deriving.md) (5 minutes)" -msgstr "" - -#: src/methods-and-traits.md -msgid "[Trait Objects](./methods-and-traits/trait-objects.md) (10 minutes)" +msgid "[Deriving](./methods-and-traits/deriving.md) (3 minutes)" msgstr "" #: src/methods-and-traits.md @@ -5095,10 +5128,6 @@ msgid "" "[Exercise: Generic Logger](./methods-and-traits/exercise.md) (20 minutes)" msgstr "" -#: src/methods-and-traits.md -msgid "This segment should take about 55 minutes" -msgstr "" - #: src/methods-and-traits/methods.md msgid "" "Rust allows you to associate functions with your new types. You do this with " @@ -5106,15 +5135,15 @@ msgid "" msgstr "" #: src/methods-and-traits/methods.md -msgid "// No receiver, a static method\n" +msgid "// No receiver, a static method" msgstr "" #: src/methods-and-traits/methods.md -msgid "// Exclusive borrowed read-write access to self\n" +msgid "// Exclusive borrowed read-write access to self" msgstr "" #: src/methods-and-traits/methods.md -msgid "// Shared and read-only borrowed access to self\n" +msgid "// Shared and read-only borrowed access to self" msgstr "" #: src/methods-and-traits/methods.md @@ -5126,7 +5155,7 @@ msgid "\"Lap {idx}: {lap} sec\"" msgstr "" #: src/methods-and-traits/methods.md -msgid "// Exclusive ownership of self\n" +msgid "// Exclusive ownership of self" msgstr "" #: src/methods-and-traits/methods.md @@ -5138,7 +5167,7 @@ msgid "\"Monaco Grand Prix\"" msgstr "" #: src/methods-and-traits/methods.md -msgid "// race.add_lap(42);\n" +msgid "// race.add_lap(42);" msgstr "" #: src/methods-and-traits/methods.md @@ -5235,19 +5264,11 @@ msgid "" msgstr "" #: src/methods-and-traits/traits.md -msgid "\"Oh you're a cutie! What's your name? {}\"" +msgid "/// Return a sentence from this pet." msgstr "" -#: src/methods-and-traits/traits.md src/methods-and-traits/trait-objects.md -msgid "\"Woof, my name is {}!\"" -msgstr "" - -#: src/methods-and-traits/traits.md src/methods-and-traits/trait-objects.md -msgid "\"Miau!\"" -msgstr "" - -#: src/methods-and-traits/traits.md src/methods-and-traits/trait-objects.md -msgid "\"Fido\"" +#: src/methods-and-traits/traits.md +msgid "/// Print a string to the terminal greeting this pet." msgstr "" #: src/methods-and-traits/traits.md @@ -5257,14 +5278,66 @@ msgid "" msgstr "" #: src/methods-and-traits/traits.md -msgid "Traits are implemented in an `impl for { .. }` block." +msgid "" +"In the \"Generics\" segment, next, we will see how to build functionality " +"that is generic over all types implementing a trait." msgstr "" -#: src/methods-and-traits/traits.md +#: src/methods-and-traits/traits/implementing.md +#, fuzzy +msgid "Implementing Traits" +msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ Traits āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨" + +#: src/methods-and-traits/traits/implementing.md +msgid "\"Oh you're a cutie! What's your name? {}\"" +msgstr "" + +#: src/methods-and-traits/traits/implementing.md +#: src/smart-pointers/trait-objects.md +msgid "\"Woof, my name is {}!\"" +msgstr "" + +#: src/methods-and-traits/traits/implementing.md +#: src/smart-pointers/trait-objects.md +msgid "\"Fido\"" +msgstr "" + +#: src/methods-and-traits/traits/implementing.md msgid "" -"Traits may specify pre-implemented (provided) methods and methods that users " -"are required to implement themselves. Provided methods can rely on required " -"methods. In this case, `greet` is provided, and relies on `talk`." +"To implement `Trait` for `Type`, you use an `impl Trait for Type { .. }` " +"block." +msgstr "" + +#: src/methods-and-traits/traits/implementing.md +msgid "" +"Unlike Go interfaces, just having matching methods is not enough: a `Cat` " +"type with a `talk()` method would not automatically satisfy `Pet` unless it " +"is in an `impl Pet` block." +msgstr "" + +#: src/methods-and-traits/traits/implementing.md +msgid "" +"Traits may provide default implementations of some methods. Default " +"implementations can rely on all the methods of the trait. In this case, " +"`greet` is provided, and relies on `talk`." +msgstr "" + +#: src/methods-and-traits/traits/associated-types.md +msgid "" +"Associated types allow are placeholder types which are filled in by the " +"trait implementation." +msgstr "" + +#: src/methods-and-traits/traits/associated-types.md +msgid "" +"Associated types are sometimes also called \"output types\". The key " +"observation is that the implementer, not the caller, chooses this type." +msgstr "" + +#: src/methods-and-traits/traits/associated-types.md +msgid "" +"Many standard library traits have associated types, including arithmetic " +"operators and `Iterator`." msgstr "" #: src/methods-and-traits/deriving.md @@ -5274,11 +5347,11 @@ msgid "" msgstr "" #: src/methods-and-traits/deriving.md -msgid "// Default trait adds `default` constructor.\n" +msgid "// Default trait adds `default` constructor." msgstr "" #: src/methods-and-traits/deriving.md -msgid "// Clone trait adds `clone` method.\n" +msgid "// Clone trait adds `clone` method." msgstr "" #: src/methods-and-traits/deriving.md @@ -5286,7 +5359,7 @@ msgid "\"EldurScrollz\"" msgstr "" #: src/methods-and-traits/deriving.md -msgid "// Debug trait adds support for printing with `{:?}`.\n" +msgid "// Debug trait adds support for printing with `{:?}`." msgstr "" #: src/methods-and-traits/deriving.md @@ -5300,129 +5373,6 @@ msgid "" "serialization support for a struct using `#[derive(Serialize)]`." msgstr "" -#: src/methods-and-traits/trait-objects.md -msgid "" -"Trait objects allow for values of different types, for instance in a " -"collection:" -msgstr "" - -#: src/methods-and-traits/trait-objects.md -msgid "\"Hello, who are you? {}\"" -msgstr "" - -#: src/methods-and-traits/trait-objects.md -msgid "Memory layout after allocating `pets`:" -msgstr "" - -#: src/methods-and-traits/trait-objects.md -msgid "" -"```bob\n" -" Stack Heap\n" -".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - " -"- -.\n" -": : : :\n" -": pets : : +----+----+----+----" -"+ :\n" -": +-----------+-------+ : : +-----+-----+ .->| F | i | d | o " -"| :\n" -": | ptr | o---+---+-----+-->| o o | o o | | +----+----+----+----" -"+ :\n" -": | len | 2 | : : +-|-|-+-|-|-+ " -"`---------. :\n" -": | capacity | 2 | : : | | | | data " -"| :\n" -": +-----------+-------+ : : | | | | +-------+--|-------" -"+ :\n" -": : : | | | '-->| name | o, 4, 4 " -"| :\n" -": : : | | | | age | 5 " -"| :\n" -"`- - - - - - - - - - - - - -' : | | | +-------+----------" -"+ :\n" -" : | | " -"| :\n" -" : | | | " -"vtable :\n" -" : | | | +----------------------" -"+ :\n" -" : | | '---->| \"::talk\" " -"| :\n" -" : | | +----------------------" -"+ :\n" -" : | " -"| :\n" -" : | | " -"data :\n" -" : | | +-------+-------" -"+ :\n" -" : | '-->| lives | 9 " -"| :\n" -" : | +-------+-------" -"+ :\n" -" : " -"| :\n" -" : | " -"vtable :\n" -" : | +----------------------" -"+ :\n" -" : '---->| \"::talk\" " -"| :\n" -" : +----------------------" -"+ :\n" -" : :\n" -" '- - - - - - - - - - - - - - - - - - - - - " -"- -'\n" -"```" -msgstr "" - -#: src/methods-and-traits/trait-objects.md -msgid "" -"Types that implement a given trait may be of different sizes. This makes it " -"impossible to have things like `Vec` in the example above." -msgstr "" - -#: src/methods-and-traits/trait-objects.md -msgid "" -"`dyn Pet` is a way to tell the compiler about a dynamically sized type that " -"implements `Pet`." -msgstr "" - -#: src/methods-and-traits/trait-objects.md -msgid "" -"In the example, `pets` is allocated on the stack and the vector data is on " -"the heap. The two vector elements are _fat pointers_:" -msgstr "" - -#: src/methods-and-traits/trait-objects.md -msgid "" -"A fat pointer is a double-width pointer. It has two components: a pointer to " -"the actual object and a pointer to the [virtual method table](https://en." -"wikipedia.org/wiki/Virtual_method_table) (vtable) for the `Pet` " -"implementation of that particular object." -msgstr "" - -#: src/methods-and-traits/trait-objects.md -msgid "" -"The data for the `Dog` named Fido is the `name` and `age` fields. The `Cat` " -"has a `lives` field." -msgstr "" - -#: src/methods-and-traits/trait-objects.md -msgid "Compare these outputs in the above example:" -msgstr "" - -#: src/methods-and-traits/trait-objects.md src/std-traits/closures.md -msgid "\"{} {}\"" -msgstr "" - -#: src/methods-and-traits/trait-objects.md src/std-traits/exercise.md -#: src/std-traits/solution.md src/modules/exercise.md src/modules/solution.md -#: src/android/build-rules/library.md -#: src/android/interoperability/cpp/rust-bridge.md -#: src/async/pitfalls/cancellation.md -msgid "\"{}\"" -msgstr "" - #: src/methods-and-traits/exercise.md msgid "" "Let's design a simple logging utility, using a trait `Logger` with a `log` " @@ -5462,7 +5412,7 @@ msgid "\"Uhoh\"" msgstr "" #: src/methods-and-traits/exercise.md -msgid "// TODO: Define and implement `VerbosityFilter`.\n" +msgid "// TODO: Define and implement `VerbosityFilter`." msgstr "" #: src/methods-and-traits/solution.md @@ -5474,7 +5424,7 @@ msgid "[Generic Functions](./generics/generic-functions.md) (5 minutes)" msgstr "" #: src/generics.md -msgid "[Generic Data Types](./generics/generic-data.md) (15 minutes)" +msgid "[Generic Data Types](./generics/generic-data.md) (10 minutes)" msgstr "" #: src/generics.md @@ -5489,10 +5439,6 @@ msgstr "" msgid "[Exercise: Generic min](./generics/exercise.md) (10 minutes)" msgstr "" -#: src/generics.md src/smart-pointers.md src/iterators.md src/error-handling.md -msgid "This segment should take about 45 minutes" -msgstr "" - #: src/generics/generic-functions.md msgid "" "Rust supports generics, which lets you abstract algorithms or data " @@ -5500,7 +5446,7 @@ msgid "" msgstr "" #: src/generics/generic-functions.md -msgid "/// Pick `even` or `odd` depending on the value of `n`.\n" +msgid "/// Pick `even` or `odd` depending on the value of `n`." msgstr "" #: src/generics/generic-functions.md @@ -5546,7 +5492,7 @@ msgid "You can use generics to abstract over the concrete field type:" msgstr "" #: src/generics/generic-data.md -msgid "// fn set_x(&mut self, x: T)\n" +msgid "// fn set_x(&mut self, x: T)" msgstr "" #: src/generics/generic-data.md @@ -5601,7 +5547,7 @@ msgid "You can do this with `T: Trait` or `impl Trait`:" msgstr "" #: src/generics/trait-bounds.md -msgid "// struct NotClonable;\n" +msgid "// struct NotClonable;" msgstr "" #: src/generics/trait-bounds.md @@ -5647,9 +5593,11 @@ msgid "" msgstr "" #: src/generics/impl-trait.md -msgid "" -"// Syntactic sugar for:\n" -"// fn add_42_millions>(x: T) -> i32 {\n" +msgid "// Syntactic sugar for:" +msgstr "" + +#: src/generics/impl-trait.md +msgid "// fn add_42_millions>(x: T) -> i32 {" msgstr "" #: src/generics/impl-trait.md @@ -5710,7 +5658,7 @@ msgid "/// Return true if self is less than other.\n" msgstr "" #: src/generics/exercise.md -msgid "// TODO: implement the `min` function used in `main`.\n" +msgid "// TODO: implement the `min` function used in `main`." msgstr "" #: src/generics/exercise.md src/generics/solution.md @@ -5722,13 +5670,19 @@ msgid "\"Baumann\"" msgstr "" #: src/welcome-day-2-afternoon.md -msgid "[Standard Library Types](./std-types.md) (1 hour and 10 minutes)" +msgid "[Standard Library Types](./std-types.md) (1 hour and 20 minutes)" msgstr "" #: src/welcome-day-2-afternoon.md msgid "[Standard Library Traits](./std-traits.md) (1 hour and 40 minutes)" msgstr "" +#: src/welcome-day-2-afternoon.md +msgid "" +"Including 10 minute breaks, this session should take about 3 hours and 10 " +"minutes" +msgstr "" + #: src/std-types.md msgid "[Standard Library](./std-types/std.md) (3 minutes)" msgstr "" @@ -5758,11 +5712,11 @@ msgid "[HashMap](./std-types/hashmap.md) (10 minutes)" msgstr "" #: src/std-types.md -msgid "[Exercise: Counter](./std-types/exercise.md) (10 minutes)" +msgid "[Exercise: Counter](./std-types/exercise.md) (20 minutes)" msgstr "" -#: src/std-types.md src/memory-management.md src/slices-and-lifetimes.md -msgid "This segment should take about 1 hour and 10 minutes" +#: src/std-types.md +msgid "This segment should take about 1 hour and 20 minutes" msgstr "" #: src/std-types.md @@ -5830,10 +5784,16 @@ msgstr "" #: src/std-types/docs.md msgid "" -"/// Determine whether the first argument is divisible by the second " -"argument.\n" -"///\n" -"/// If the second argument is zero, the result is false.\n" +"/// Determine whether the first argument is divisible by the second argument." +msgstr "" + +#: src/std-types/docs.md src/testing/other.md +#: src/unsafe-rust/unsafe-functions.md +msgid "///" +msgstr "" + +#: src/std-types/docs.md +msgid "/// If the second argument is zero, the result is false." msgstr "" #: src/std-types/docs.md @@ -5852,8 +5812,7 @@ msgstr "" #: src/std-types/docs.md msgid "" -"//! This module contains functionality relating to divisibility of " -"integers.\n" +"//! This module contains functionality relating to divisibility of integers." msgstr "" #: src/std-types/docs.md @@ -6085,6 +6044,15 @@ msgid "" "boundaries or not." msgstr "" +#: src/std-types/string.md +msgid "" +"Many types can be converted to a string with the [`to_string`](https://doc." +"rust-lang.org/std/string/trait.ToString.html#tymethod.to_string) method. " +"This trait is automatically implemented for all types that implement " +"`Display`, so anything that can be formatted can also be converted to a " +"string." +msgstr "" + #: src/std-types/vec.md msgid "" "[`Vec`](https://doc.rust-lang.org/std/vec/struct.Vec.html) is the standard " @@ -6100,11 +6068,11 @@ msgid "\"v2: len = {}, capacity = {}\"" msgstr "" #: src/std-types/vec.md -msgid "// Canonical macro to initialize a vector with elements.\n" +msgid "// Canonical macro to initialize a vector with elements." msgstr "" #: src/std-types/vec.md -msgid "// Retain only the even elements.\n" +msgid "// Retain only the even elements." msgstr "" #: src/std-types/vec.md @@ -6112,7 +6080,7 @@ msgid "\"{v3:?}\"" msgstr "" #: src/std-types/vec.md -msgid "// Remove consecutive duplicates.\n" +msgid "// Remove consecutive duplicates." msgstr "" #: src/std-types/vec.md @@ -6192,7 +6160,7 @@ msgid "\"{book} is unknown.\"" msgstr "" #: src/std-types/hashmap.md -msgid "// Use the .entry() method to insert a value if nothing is found.\n" +msgid "// Use the .entry() method to insert a value if nothing is found." msgstr "" #: src/std-types/hashmap.md @@ -6280,21 +6248,21 @@ msgid "" "number of hash lookups required to implement the `count` method." msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md +#: src/std-types/exercise.md msgid "" -"/// Counter counts the number of times each value of type T has been seen.\n" +"/// Counter counts the number of times each value of type T has been seen." msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "/// Create a new Counter.\n" +#: src/std-types/exercise.md +msgid "/// Create a new Counter." msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "/// Count an occurrence of the given value.\n" +#: src/std-types/exercise.md +msgid "/// Count an occurrence of the given value." msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "/// Return the number of times the given value has been seen.\n" +#: src/std-types/exercise.md +msgid "/// Return the number of times the given value has been seen." msgstr "" #: src/std-types/exercise.md src/std-types/solution.md @@ -6313,6 +6281,23 @@ msgstr "" msgid "\"got {} apples\"" msgstr "" +#: src/std-types/solution.md +msgid "" +"/// Counter counts the number of times each value of type T has been seen.\n" +msgstr "" + +#: src/std-types/solution.md +msgid "/// Create a new Counter.\n" +msgstr "" + +#: src/std-types/solution.md +msgid "/// Count an occurrence of the given value.\n" +msgstr "" + +#: src/std-types/solution.md +msgid "/// Return the number of times the given value has been seen.\n" +msgstr "" + #: src/std-traits.md msgid "[Comparisons](./std-traits/comparisons.md) (10 minutes)" msgstr "" @@ -6725,12 +6710,16 @@ msgid "" "keyword makes them capture by value." msgstr "" +#: src/std-traits/closures.md src/smart-pointers/trait-objects.md +msgid "\"{} {}\"" +msgstr "" + #: src/std-traits/closures.md msgid "\"Hi\"" msgstr "" #: src/std-traits/closures.md -msgid "\"there\"" +msgid "\"Greg\"" msgstr "" #: src/std-traits/exercise.md @@ -6742,7 +6731,7 @@ msgid "" msgstr "" #: src/std-traits/exercise.md -msgid "// Implement the `Read` trait for `RotDecoder`.\n" +msgid "// Implement the `Read` trait for `RotDecoder`." msgstr "" #: src/std-traits/exercise.md src/std-traits/solution.md @@ -6786,16 +6775,16 @@ msgid "[Welcome](./welcome-day-3.md) (3 minutes)" msgstr "" #: src/welcome-day-3.md -msgid "[Memory Management](./memory-management.md) (1 hour and 10 minutes)" +msgid "[Memory Management](./memory-management.md) (1 hour)" msgstr "" #: src/welcome-day-3.md -msgid "[Smart Pointers](./smart-pointers.md) (45 minutes)" +msgid "[Smart Pointers](./smart-pointers.md) (55 minutes)" msgstr "" #: src/welcome-day-3.md msgid "" -"Including 10 minute breaks, this session should take about 2 hours and 15 " +"Including 10 minute breaks, this session should take about 2 hours and 20 " "minutes" msgstr "" @@ -6814,7 +6803,7 @@ msgid "[Ownership](./memory-management/ownership.md) (5 minutes)" msgstr "" #: src/memory-management.md -msgid "[Move Semantics](./memory-management/move.md) (10 minutes)" +msgid "[Move Semantics](./memory-management/move.md) (5 minutes)" msgstr "" #: src/memory-management.md @@ -6908,15 +6897,21 @@ msgid "\"world\"" msgstr "" #: src/memory-management/review.md -msgid "" -"// DON'T DO THIS AT HOME! For educational purposes only.\n" -" // String provides no guarantees about its layout, so this could lead " -"to\n" -" // undefined behavior.\n" +msgid "// DON'T DO THIS AT HOME! For educational purposes only." msgstr "" #: src/memory-management/review.md -msgid "\"ptr = {ptr:#x}, len = {len}, capacity = {capacity}\"" +msgid "" +"// String provides no guarantees about its layout, so this could lead to" +msgstr "" + +#: src/memory-management/review.md +#, fuzzy +msgid "// undefined behavior." +msgstr "āĻ°āĻžāĻ¨āĻŸāĻžāĻ‡āĻŽā§‡ āĻ•ā§‹āĻ¨ āĻ…āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŋāĻ¤ āĻ†āĻšāĻ°āĻŖ āĻ¨ā§‡āĻ‡:" + +#: src/memory-management/review.md +msgid "\"capacity = {capacity}, ptr = {ptr:#x}, len = {len}\"" msgstr "" #: src/memory-management/approaches.md @@ -7049,7 +7044,7 @@ msgid "\"s2: {s2}\"" msgstr "" #: src/memory-management/move.md -msgid "// println!(\"s1: {s1}\");\n" +msgid "// println!(\"s1: {s1}\");" msgstr "" #: src/memory-management/move.md @@ -7112,7 +7107,7 @@ msgid "\"Alice\"" msgstr "Slices" #: src/memory-management/move.md -msgid "// say_hello(name);\n" +msgid "// say_hello(name);" msgstr "" #: src/memory-management/move.md @@ -7185,7 +7180,7 @@ msgid "\"Cpp\"" msgstr "" #: src/memory-management/move.md -msgid "// Duplicate the data in s1.\n" +msgid "// Duplicate the data in s1." msgstr "" #: src/memory-management/move.md @@ -7524,10 +7519,18 @@ msgstr "" msgid "[Rc](./smart-pointers/rc.md) (5 minutes)" msgstr "" +#: src/smart-pointers.md +msgid "[Trait Objects](./smart-pointers/trait-objects.md) (10 minutes)" +msgstr "" + #: src/smart-pointers.md msgid "[Exercise: Binary Tree](./smart-pointers/exercise.md) (30 minutes)" msgstr "" +#: src/smart-pointers.md src/error-handling.md +msgid "This segment should take about 55 minutes" +msgstr "" + #: src/smart-pointers/box.md msgid "" "[`Box`](https://doc.rust-lang.org/std/boxed/struct.Box.html) is an owned " @@ -7551,11 +7554,11 @@ msgid "" msgstr "" #: src/smart-pointers/box.md -msgid "/// A non-empty list: first element and the rest of the list.\n" +msgid "/// A non-empty list: first element and the rest of the list." msgstr "" #: src/smart-pointers/box.md -msgid "/// An empty list.\n" +msgid "/// An empty list." msgstr "" #: src/smart-pointers/box.md @@ -7610,8 +7613,8 @@ msgstr "" #: src/smart-pointers/box.md msgid "" "If `Box` was not used and we attempted to embed a `List` directly into the " -"`List`, the compiler would not compute a fixed size of the struct in memory " -"(`List` would be of infinite size)." +"`List`, the compiler would not be able to compute a fixed size for the " +"struct in memory (the `List` would be of infinite size)." msgstr "" #: src/smart-pointers/box.md @@ -7622,9 +7625,10 @@ msgstr "" #: src/smart-pointers/box.md msgid "" -"Remove the `Box` in the List definition and show the compiler error. " -"\"Recursive with indirection\" is a hint you might want to use a Box or " -"reference of some kind, instead of storing a value directly." +"Remove the `Box` in the List definition and show the compiler error. We get " +"the message \"recursive without indirection\", because for data recursion, " +"we have to use indirection, a Box or reference of some kind, instead of " +"storing the value directly." msgstr "" #: src/smart-pointers/box.md @@ -7714,6 +7718,121 @@ msgid "" "cycles that will be dropped properly (likely in combination with `RefCell`)." msgstr "" +#: src/smart-pointers/trait-objects.md +msgid "" +"Trait objects allow for values of different types, for instance in a " +"collection:" +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "\"Miau!\"" +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "\"Hello, who are you? {}\"" +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "Memory layout after allocating `pets`:" +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - " +"- -.\n" +": : : :\n" +": pets : : +----+----+----+----" +"+ :\n" +": +-----------+-------+ : : +-----+-----+ .->| F | i | d | o " +"| :\n" +": | ptr | o---+---+-----+-->| o o | o o | | +----+----+----+----" +"+ :\n" +": | len | 2 | : : +-|-|-+-|-|-+ " +"`---------. :\n" +": | capacity | 2 | : : | | | | data " +"| :\n" +": +-----------+-------+ : : | | | | +-------+--|-------" +"+ :\n" +": : : | | | '-->| name | o, 4, 4 " +"| :\n" +": : : | | | | age | 5 " +"| :\n" +"`- - - - - - - - - - - - - -' : | | | +-------+----------" +"+ :\n" +" : | | " +"| :\n" +" : | | | " +"vtable :\n" +" : | | | +----------------------" +"+ :\n" +" : | | '---->| \"::talk\" " +"| :\n" +" : | | +----------------------" +"+ :\n" +" : | " +"| :\n" +" : | | " +"data :\n" +" : | | +-------+-------" +"+ :\n" +" : | '-->| lives | 9 " +"| :\n" +" : | +-------+-------" +"+ :\n" +" : " +"| :\n" +" : | " +"vtable :\n" +" : | +----------------------" +"+ :\n" +" : '---->| \"::talk\" " +"| :\n" +" : +----------------------" +"+ :\n" +" : :\n" +" '- - - - - - - - - - - - - - - - - - - - - " +"- -'\n" +"```" +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "" +"Types that implement a given trait may be of different sizes. This makes it " +"impossible to have things like `Vec` in the example above." +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "" +"`dyn Pet` is a way to tell the compiler about a dynamically sized type that " +"implements `Pet`." +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "" +"In the example, `pets` is allocated on the stack and the vector data is on " +"the heap. The two vector elements are _fat pointers_:" +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "" +"A fat pointer is a double-width pointer. It has two components: a pointer to " +"the actual object and a pointer to the [virtual method table](https://en." +"wikipedia.org/wiki/Virtual_method_table) (vtable) for the `Pet` " +"implementation of that particular object." +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "" +"The data for the `Dog` named Fido is the `name` and `age` fields. The `Cat` " +"has a `lives` field." +msgstr "" + +#: src/smart-pointers/trait-objects.md +msgid "Compare these outputs in the above example:" +msgstr "" + #: src/smart-pointers/exercise.md msgid "" "A binary tree is a tree-type data structure where every node has two " @@ -7748,7 +7867,7 @@ msgid "" msgstr "" #: src/smart-pointers/exercise.md -msgid "// Implement `new`, `insert`, `len`, and `has`.\n" +msgid "// Implement `new`, `insert`, `len`, and `has`." msgstr "" #: src/smart-pointers/exercise.md src/smart-pointers/solution.md @@ -7760,7 +7879,7 @@ msgid "\"bar\"" msgstr "" #: src/welcome-day-3-afternoon.md -msgid "[Borrowing](./borrowing.md) (1 hour)" +msgid "[Borrowing](./borrowing.md) (50 minutes)" msgstr "" #: src/welcome-day-3-afternoon.md @@ -7768,12 +7887,6 @@ msgid "" "[Slices and Lifetimes](./slices-and-lifetimes.md) (1 hour and 10 minutes)" msgstr "" -#: src/welcome-day-3-afternoon.md -msgid "" -"Including 10 minute breaks, this session should take about 2 hours and 20 " -"minutes" -msgstr "" - #: src/borrowing.md msgid "[Borrowing a Value](./borrowing/shared.md) (10 minutes)" msgstr "" @@ -7787,7 +7900,7 @@ msgid "[Interior Mutability](./borrowing/interior-mutability.md) (10 minutes)" msgstr "" #: src/borrowing.md -msgid "[Exercise: Health Statistics](./borrowing/exercise.md) (30 minutes)" +msgid "[Exercise: Health Statistics](./borrowing/exercise.md) (20 minutes)" msgstr "" #: src/borrowing/shared.md @@ -7998,7 +8111,8 @@ msgid "" msgstr "" #: src/borrowing/exercise.md src/borrowing/solution.md -#: src/android/build-rules/library.md src/android/aidl/client.md +#: src/android/build-rules/library.md +#: src/android/aidl/example-service/client.md msgid "\"Bob\"" msgstr "" @@ -8035,6 +8149,10 @@ msgid "" "[Exercise: Protobuf Parsing](./slices-and-lifetimes/exercise.md) (30 minutes)" msgstr "" +#: src/slices-and-lifetimes.md +msgid "This segment should take about 1 hour and 10 minutes" +msgstr "" + #: src/slices-and-lifetimes/slices.md msgid "Slices" msgstr "Slices" @@ -8203,7 +8321,7 @@ msgid "" msgstr "" #: src/slices-and-lifetimes/lifetime-annotations.md -msgid "// What is the lifetime of p3?\n" +msgid "// What is the lifetime of p3?" msgstr "" #: src/slices-and-lifetimes/lifetime-annotations.md @@ -8310,7 +8428,7 @@ msgid "\"The quick brown fox jumps over the lazy dog.\"" msgstr "" #: src/slices-and-lifetimes/struct-lifetimes.md -msgid "// erase(text);\n" +msgid "// erase(text);" msgstr "" #: src/slices-and-lifetimes/struct-lifetimes.md @@ -8500,7 +8618,7 @@ msgid "" msgstr "" #: src/slices-and-lifetimes/exercise.md -msgid "// TODO: Implement ProtoMessage for Person and PhoneNumber.\n" +msgid "// TODO: Implement ProtoMessage for Person and PhoneNumber." msgstr "" #: src/slices-and-lifetimes/solution.md @@ -8560,7 +8678,7 @@ msgid "[Modules](./modules.md) (40 minutes)" msgstr "" #: src/welcome-day-4.md -msgid "[Testing](./testing.md) (1 hour and 5 minutes)" +msgid "[Testing](./testing.md) (1 hour)" msgstr "" #: src/iterators.md @@ -8675,10 +8793,13 @@ msgid "" "lets you build a collection from an [`Iterator`](https://doc.rust-lang.org/" "std/iter/trait.Iterator.html)." msgstr "" +"[`FromIterator`](https://doc.rust-lang.org/std/iter/trait.FromIterator.html) " +"āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ [`Iterator`](https://doc.rust-lang.org/std/iter/trait.Iterator.html) " +"āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ|" #: src/iterators/fromiterator.md msgid "\"prime_squares: {prime_squares:?}\"" -msgstr "" +msgstr "\"prime_squares: {prime_squares:?}\"" #: src/iterators/fromiterator.md msgid "`Iterator` implements" @@ -8732,7 +8853,7 @@ msgid "" msgstr "" #: src/modules.md -msgid "[Modules](./modules/modules.md) (5 minutes)" +msgid "[Modules](./modules/modules.md) (3 minutes)" msgstr "" #: src/modules.md @@ -8752,10 +8873,6 @@ msgid "" "[Exercise: Modules for a GUI Library](./modules/exercise.md) (15 minutes)" msgstr "" -#: src/modules.md -msgid "This segment should take about 40 minutes" -msgstr "" - #: src/modules/modules.md msgid "We have seen how `impl` blocks let us namespace functions to a type." msgstr "" @@ -8822,20 +8939,24 @@ msgstr "" #: src/modules/filesystem.md msgid "" "//! This module implements the garden, including a highly performant " -"germination\n" -"//! implementation.\n" +"germination" msgstr "" #: src/modules/filesystem.md -msgid "// Re-export types from this module.\n" +#, fuzzy +msgid "//! implementation." +msgstr "āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨" + +#: src/modules/filesystem.md +msgid "// Re-export types from this module." msgstr "" #: src/modules/filesystem.md -msgid "/// Sow the given seed packets.\n" +msgid "/// Sow the given seed packets." msgstr "" #: src/modules/filesystem.md -msgid "/// Harvest the produce in the garden that is ready.\n" +msgid "/// Harvest the produce in the garden that is ready." msgstr "" #: src/modules/filesystem.md @@ -9042,15 +9163,15 @@ msgstr "" msgid "Here's the single-module implementation of the GUI library:" msgstr "" -#: src/modules/exercise.md src/modules/solution.md +#: src/modules/exercise.md msgid "/// Natural width of `self`.\n" msgstr "" -#: src/modules/exercise.md src/modules/solution.md +#: src/modules/exercise.md msgid "/// Draw the widget into a buffer.\n" msgstr "" -#: src/modules/exercise.md src/modules/solution.md +#: src/modules/exercise.md msgid "/// Draw the widget on standard output.\n" msgstr "" @@ -9090,7 +9211,7 @@ msgstr "" msgid "\"| {:inner_width$} |\"" msgstr "" -#: src/modules/exercise.md src/modules/solution.md +#: src/modules/exercise.md msgid "// add a bit of padding\n" msgstr "" @@ -9122,68 +9243,91 @@ msgid "" msgstr "" #: src/modules/solution.md -msgid "// ---- src/widgets.rs ----\n" +msgid "// ---- src/widgets.rs ----" msgstr "" #: src/modules/solution.md -msgid "// ---- src/widgets/label.rs ----\n" +msgid "/// Natural width of `self`." msgstr "" #: src/modules/solution.md -msgid "// ANCHOR_END: Label-width\n" +msgid "/// Draw the widget into a buffer." msgstr "" #: src/modules/solution.md -msgid "// ANCHOR: Label-draw_into\n" +msgid "/// Draw the widget on standard output." msgstr "" #: src/modules/solution.md -msgid "// ANCHOR_END: Label-draw_into\n" +msgid "// ---- src/widgets/label.rs ----" msgstr "" #: src/modules/solution.md -msgid "// ---- src/widgets/button.rs ----\n" +msgid "// ANCHOR_END: Label-width" msgstr "" #: src/modules/solution.md -msgid "// ANCHOR_END: Button-width\n" +msgid "// ANCHOR: Label-draw_into" msgstr "" #: src/modules/solution.md -msgid "// ANCHOR: Button-draw_into\n" +msgid "// ANCHOR_END: Label-draw_into" msgstr "" #: src/modules/solution.md -msgid "// ANCHOR_END: Button-draw_into\n" +msgid "// ---- src/widgets/button.rs ----" msgstr "" #: src/modules/solution.md -msgid "// ---- src/widgets/window.rs ----\n" +msgid "// ANCHOR_END: Button-width" msgstr "" #: src/modules/solution.md -msgid "" -"// ANCHOR_END: Window-width\n" -" // Add 4 paddings for borders\n" +msgid "// add a bit of padding" msgstr "" #: src/modules/solution.md -msgid "// ANCHOR: Window-draw_into\n" +msgid "// ANCHOR: Button-draw_into" msgstr "" #: src/modules/solution.md -msgid "// ANCHOR_END: Window-draw_into\n" +msgid "// ANCHOR_END: Button-draw_into" msgstr "" #: src/modules/solution.md -msgid "" -"// TODO: after learning about error handling, you can change\n" -" // draw_into to return Result<(), std::fmt::Error>. Then use\n" -" // the ?-operator here instead of .unwrap().\n" +msgid "// ---- src/widgets/window.rs ----" msgstr "" #: src/modules/solution.md -msgid "// ---- src/main.rs ----\n" +msgid "// ANCHOR_END: Window-width" +msgstr "" + +#: src/modules/solution.md +msgid "// Add 4 paddings for borders" +msgstr "" + +#: src/modules/solution.md +msgid "// ANCHOR: Window-draw_into" +msgstr "" + +#: src/modules/solution.md +msgid "// ANCHOR_END: Window-draw_into" +msgstr "" + +#: src/modules/solution.md +msgid "// TODO: after learning about error handling, you can change" +msgstr "" + +#: src/modules/solution.md +msgid "// draw_into to return Result<(), std::fmt::Error>. Then use" +msgstr "" + +#: src/modules/solution.md +msgid "// the ?-operator here instead of .unwrap()." +msgstr "" + +#: src/modules/solution.md +msgid "// ---- src/main.rs ----" msgstr "" #: src/testing.md @@ -9191,7 +9335,7 @@ msgid "[Test Modules](./testing/unit-tests.md) (5 minutes)" msgstr "" #: src/testing.md -msgid "[Other Types of Tests](./testing/other.md) (10 minutes)" +msgid "[Other Types of Tests](./testing/other.md) (5 minutes)" msgstr "" #: src/testing.md @@ -9207,7 +9351,7 @@ msgid "[Mocking](./testing/mocking.md) (5 minutes)" msgstr "" #: src/testing.md -msgid "[Compiler Lints and Clippy](./testing/lints.md) (5 minutes)" +msgid "[Compiler Lints and Clippy](./testing/lints.md) (3 minutes)" msgstr "" #: src/testing.md @@ -9267,7 +9411,7 @@ msgid "Create a `.rs` file under `tests/`:" msgstr "" #: src/testing/other.md -msgid "// tests/my_library.rs\n" +msgid "// tests/my_library.rs" msgstr "" #: src/testing/other.md @@ -9283,14 +9427,23 @@ msgid "Rust has built-in support for documentation tests:" msgstr "" #: src/testing/other.md -msgid "" -"/// Shortens a string to the given length.\n" -"///\n" -"/// ```\n" -"/// # use playground::shorten_string;\n" -"/// assert_eq!(shorten_string(\"Hello World\", 5), \"Hello\");\n" -"/// assert_eq!(shorten_string(\"Hello World\", 20), \"Hello World\");\n" -"/// ```\n" +msgid "/// Shortens a string to the given length." +msgstr "" + +#: src/testing/other.md +msgid "/// ```" +msgstr "" + +#: src/testing/other.md +msgid "/// # use playground::shorten_string;" +msgstr "" + +#: src/testing/other.md +msgid "/// assert_eq!(shorten_string(\"Hello World\", 5), \"Hello\");" +msgstr "" + +#: src/testing/other.md +msgid "/// assert_eq!(shorten_string(\"Hello World\", 20), \"Hello World\");" msgstr "" #: src/testing/other.md @@ -9377,8 +9530,8 @@ msgstr "" #: src/testing/googletest.md msgid "" -"A particularly nice feature is that mismatches in multi-line strings strings " -"are shown as a diff:" +"A particularly nice feature is that mismatches in multi-line strings are " +"shown as a diff:" msgstr "" #: src/testing/googletest.md @@ -9512,7 +9665,7 @@ msgid "" msgstr "" #: src/testing/exercise.md -msgid "Ignore all spaces. Reject number with less than two digits." +msgid "Ignore all spaces. Reject number with fewer than two digits." msgstr "" #: src/testing/exercise.md @@ -9622,17 +9775,13 @@ msgid "\" 0 0 \"" msgstr "" #: src/welcome-day-4-afternoon.md -msgid "[Error Handling](./error-handling.md) (45 minutes)" +msgid "[Error Handling](./error-handling.md) (55 minutes)" msgstr "" #: src/welcome-day-4-afternoon.md msgid "[Unsafe Rust](./unsafe-rust.md) (1 hour and 5 minutes)" msgstr "" -#: src/welcome-day-4-afternoon.md -msgid "Including 10 minute breaks, this session should take about 2 hours" -msgstr "" - #: src/error-handling.md msgid "[Panics](./error-handling/panics.md) (3 minutes)" msgstr "" @@ -9656,7 +9805,7 @@ msgstr "" #: src/error-handling.md msgid "" -"[Exercise: Rewriting with Result](./error-handling/exercise.md) (20 minutes)" +"[Exercise: Rewriting with Result](./error-handling/exercise.md) (30 minutes)" msgstr "" #: src/error-handling/panics.md @@ -9753,7 +9902,7 @@ msgid "We can use this to simplify our error handling code:" msgstr "" #: src/error-handling/try.md -msgid "//fs::write(\"config.dat\", \"alice\").unwrap();\n" +msgid "//fs::write(\"config.dat\", \"alice\").unwrap();" msgstr "" #: src/error-handling/try.md src/error-handling/try-conversions.md @@ -9782,7 +9931,7 @@ msgstr "" #: src/error-handling/try.md msgid "" "Note that `main` can return a `Result<(), E>` as long as it implements `std::" -"process:Termination`. In practice, this means that `E` implements `Debug`. " +"process::Termination`. In practice, this means that `E` implements `Debug`. " "The executable will print the `Err` variant and return a nonzero exit status " "on error." msgstr "" @@ -9814,7 +9963,7 @@ msgstr "" #: src/error-handling/try-conversions.md #: src/error-handling/thiserror-and-anyhow.md -msgid "//fs::write(\"config.dat\", \"\").unwrap();\n" +msgid "//fs::write(\"config.dat\", \"\").unwrap();" msgstr "" #: src/error-handling/try-conversions.md @@ -10120,6 +10269,10 @@ msgstr "" msgid "[Exercise: FFI Wrapper](./unsafe-rust/exercise.md) (30 minutes)" msgstr "" +#: src/unsafe-rust.md +msgid "This segment should take about 1 hour and 5 minutes" +msgstr "" + #: src/unsafe-rust/unsafe.md msgid "The Rust language has two parts:" msgstr "" @@ -10193,14 +10346,25 @@ msgstr "" msgid "\"careful!\"" msgstr "" +#: src/unsafe-rust/dereferencing.md +msgid "// Safe because r1 and r2 were obtained from references and so are" +msgstr "" + #: src/unsafe-rust/dereferencing.md msgid "" -"// Safe because r1 and r2 were obtained from references and so are\n" -" // guaranteed to be non-null and properly aligned, the objects " -"underlying\n" -" // the references from which they were obtained are live throughout the\n" -" // whole unsafe block, and they are not accessed either through the\n" -" // references or concurrently through any other pointers.\n" +"// guaranteed to be non-null and properly aligned, the objects underlying" +msgstr "" + +#: src/unsafe-rust/dereferencing.md +msgid "// the references from which they were obtained are live throughout the" +msgstr "" + +#: src/unsafe-rust/dereferencing.md +msgid "// whole unsafe block, and they are not accessed either through the" +msgstr "" + +#: src/unsafe-rust/dereferencing.md +msgid "// references or concurrently through any other pointers." msgstr "" #: src/unsafe-rust/dereferencing.md @@ -10216,13 +10380,11 @@ msgid "\"r2 is: {}\"" msgstr "" #: src/unsafe-rust/dereferencing.md -msgid "" -"// NOT SAFE. DO NOT DO THIS.\n" -" /*\n" -" let r3: &String = unsafe { &*r1 };\n" -" drop(s);\n" -" println!(\"r3 is: {}\", *r3);\n" -" */" +msgid "// NOT SAFE. DO NOT DO THIS." +msgstr "" + +#: src/unsafe-rust/dereferencing.md +msgid "/*" msgstr "" #: src/unsafe-rust/dereferencing.md @@ -10325,7 +10487,7 @@ msgstr "" #: src/unsafe-rust/unions.md #, fuzzy -msgid "// Undefined behavior!\n" +msgid "// Undefined behavior!" msgstr "āĻ°āĻžāĻ¨āĻŸāĻžāĻ‡āĻŽā§‡ āĻ•ā§‹āĻ¨ āĻ…āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŋāĻ¤ āĻ†āĻšāĻ°āĻŖ āĻ¨ā§‡āĻ‡:" #: src/unsafe-rust/unions.md @@ -10358,7 +10520,6 @@ msgstr "" #: src/android/interoperability/cpp/cpp-bridge.md #: src/exercises/chromium/build-rules.md src/bare-metal/aps/inline-assembly.md #: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md -#: src/exercises/bare-metal/rtc.md #: src/exercises/bare-metal/solutions-afternoon.md msgid "\"C\"" msgstr "" @@ -10369,8 +10530,11 @@ msgstr "" #: src/unsafe-rust/unsafe-functions.md msgid "" -"// Safe because the indices are in the correct order, within the bounds of\n" -" // the string slice, and lie on UTF-8 sequence boundaries.\n" +"// Safe because the indices are in the correct order, within the bounds of" +msgstr "" + +#: src/unsafe-rust/unsafe-functions.md +msgid "// the string slice, and lie on UTF-8 sequence boundaries." msgstr "" #: src/unsafe-rust/unsafe-functions.md @@ -10383,7 +10547,7 @@ msgstr "" #: src/unsafe-rust/unsafe-functions.md #, fuzzy -msgid "// Undefined behavior if abs misbehaves.\n" +msgid "// Undefined behavior if abs misbehaves." msgstr "āĻ°āĻžāĻ¨āĻŸāĻžāĻ‡āĻŽā§‡ āĻ•ā§‹āĻ¨ āĻ…āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŋāĻ¤ āĻ†āĻšāĻ°āĻŖ āĻ¨ā§‡āĻ‡:" #: src/unsafe-rust/unsafe-functions.md @@ -10391,11 +10555,19 @@ msgid "\"Absolute value of -3 according to C: {}\"" msgstr "" #: src/unsafe-rust/unsafe-functions.md -msgid "" -"// Not upholding the UTF-8 encoding requirement breaks memory safety!\n" -" // println!(\"emoji: {}\", unsafe { emojis.get_unchecked(0..3) });\n" -" // println!(\"char count: {}\", count_chars(unsafe {\n" -" // emojis.get_unchecked(0..3) }));\n" +msgid "// Not upholding the UTF-8 encoding requirement breaks memory safety!" +msgstr "" + +#: src/unsafe-rust/unsafe-functions.md +msgid "// println!(\"emoji: {}\", unsafe { emojis.get_unchecked(0..3) });" +msgstr "" + +#: src/unsafe-rust/unsafe-functions.md +msgid "// println!(\"char count: {}\", count_chars(unsafe {" +msgstr "" + +#: src/unsafe-rust/unsafe-functions.md +msgid "// emojis.get_unchecked(0..3) }));" msgstr "" #: src/unsafe-rust/unsafe-functions.md @@ -10409,16 +10581,19 @@ msgid "" msgstr "" #: src/unsafe-rust/unsafe-functions.md -msgid "" -"/// Swaps the values pointed to by the given pointers.\n" -"///\n" -"/// # Safety\n" -"///\n" -"/// The pointers must be valid and properly aligned.\n" +msgid "/// Swaps the values pointed to by the given pointers." +msgstr "" + +#: src/unsafe-rust/unsafe-functions.md src/unsafe-rust/unsafe-traits.md +msgid "/// # Safety" msgstr "" #: src/unsafe-rust/unsafe-functions.md -msgid "// Safe because ...\n" +msgid "/// The pointers must be valid and properly aligned." +msgstr "" + +#: src/unsafe-rust/unsafe-functions.md +msgid "// Safe because ..." msgstr "" #: src/unsafe-rust/unsafe-functions.md @@ -10472,14 +10647,15 @@ msgid "" msgstr "" #: src/unsafe-rust/unsafe-traits.md -msgid "" -"/// ...\n" -"/// # Safety\n" -"/// The type must have a defined representation and no padding.\n" +msgid "/// ..." msgstr "" #: src/unsafe-rust/unsafe-traits.md -msgid "// Safe because u32 has a defined representation and no padding.\n" +msgid "/// The type must have a defined representation and no padding." +msgstr "" + +#: src/unsafe-rust/unsafe-traits.md +msgid "// Safe because u32 has a defined representation and no padding." msgstr "" #: src/unsafe-rust/unsafe-traits.md @@ -10670,18 +10846,18 @@ msgstr "" msgid "\"readdir$INODE64\"" msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +#: src/unsafe-rust/exercise.md msgid "" "// Call opendir and return a Ok value if that worked,\n" -" // otherwise return Err with a message.\n" +" // otherwise return Err with a message." msgstr "" #: src/unsafe-rust/exercise.md -msgid "// Keep calling readdir until we get a NULL pointer back.\n" +msgid "// Keep calling readdir until we get a NULL pointer back." msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "// Call closedir as needed.\n" +#: src/unsafe-rust/exercise.md +msgid "// Call closedir as needed." msgstr "" #: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md @@ -10693,6 +10869,12 @@ msgstr "" msgid "\"files: {:#?}\"" msgstr "" +#: src/unsafe-rust/solution.md +msgid "" +"// Call opendir and return a Ok value if that worked,\n" +" // otherwise return Err with a message.\n" +msgstr "" + #: src/unsafe-rust/solution.md msgid "\"Invalid path: {err}\"" msgstr "" @@ -10721,6 +10903,10 @@ msgid "" " // terminated.\n" msgstr "" +#: src/unsafe-rust/solution.md +msgid "// Call closedir as needed.\n" +msgstr "" + #: src/unsafe-rust/solution.md msgid "// SAFETY: self.dir is not NULL.\n" msgstr "" @@ -11059,7 +11245,8 @@ msgstr "" msgid "\"greetings\"" msgstr "" -#: src/android/build-rules/library.md src/android/aidl/implementation.md +#: src/android/build-rules/library.md +#: src/android/aidl/example-service/service.md #: src/android/interoperability/java.md msgid "\"src/lib.rs\"" msgstr "" @@ -11108,138 +11295,241 @@ msgstr "" msgid "You can create new AIDL servers in Rust." msgstr "" -#: src/android/aidl/interface.md +#: src/android/aidl/birthday-service.md +msgid "" +"To illustrate how to use Rust with Binder, we're going to walk through the " +"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 "" + +#: src/android/aidl/example-service/interface.md msgid "AIDL Interfaces" msgstr "" -#: src/android/aidl/interface.md +#: src/android/aidl/example-service/interface.md msgid "You declare the API of your service using an AIDL interface:" msgstr "" -#: src/android/aidl/interface.md +#: src/android/aidl/example-service/interface.md +#: src/android/aidl/example-service/service-bindings.md msgid "" "_birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl_:" msgstr "" -#: src/android/aidl/interface.md src/android/aidl/changing.md +#: src/android/aidl/example-service/interface.md +#: src/android/aidl/example-service/service-bindings.md +#: src/android/aidl/example-service/changing-definition.md msgid "/** Birthday service interface. */" msgstr "" -#: src/android/aidl/interface.md src/android/aidl/changing.md +#: src/android/aidl/example-service/interface.md +#: src/android/aidl/example-service/service-bindings.md +#: src/android/aidl/example-service/changing-definition.md msgid "/** Generate a Happy Birthday message. */" msgstr "" -#: src/android/aidl/interface.md +#: src/android/aidl/example-service/interface.md msgid "_birthday_service/aidl/Android.bp_:" msgstr "" -#: src/android/aidl/interface.md +#: src/android/aidl/example-service/interface.md msgid "\"com.example.birthdayservice\"" msgstr "" -#: src/android/aidl/interface.md +#: src/android/aidl/example-service/interface.md msgid "\"com/example/birthdayservice/*.aidl\"" msgstr "" -#: src/android/aidl/interface.md +#: src/android/aidl/example-service/interface.md msgid "// Rust is not enabled by default\n" msgstr "" -#: src/android/aidl/interface.md +#: src/android/aidl/example-service/interface.md msgid "" -"Add `vendor_available: true` if your AIDL file is used by a binary in the " -"vendor partition." +"Note that the directory structure under the `aidl/` directory needs to match " +"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 "" -#: src/android/aidl/implementation.md +#: src/android/aidl/example-service/service-bindings.md +msgid "Generated Service API" +msgstr "" + +#: 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 "" + +#: src/android/aidl/example-service/service-bindings.md +#, fuzzy +msgid "_Generated trait_:" +msgstr "āĻ…āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻ°āĻžāĻ¸ā§āĻŸ" + +#: 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 "" + +#: src/android/aidl/example-service/service-bindings.md +msgid "" +"The generated bindings can be found at `out/soong/.intermediates//`." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/android/aidl/example-service/service.md msgid "Service Implementation" msgstr "" -#: src/android/aidl/implementation.md +#: src/android/aidl/example-service/service.md msgid "We can now implement the AIDL service:" msgstr "" -#: src/android/aidl/implementation.md +#: src/android/aidl/example-service/service.md +#: src/android/aidl/example-service/changing-implementation.md msgid "_birthday_service/src/lib.rs_:" msgstr "" -#: src/android/aidl/implementation.md -msgid "//! Implementation of the `IBirthdayService` AIDL interface.\n" -msgstr "" - -#: src/android/aidl/implementation.md +#: src/android/aidl/example-service/service.md msgid "/// The `IBirthdayService` implementation.\n" msgstr "" -#: src/android/aidl/implementation.md +#: 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 "" -#: src/android/aidl/implementation.md src/android/aidl/server.md -#: src/android/aidl/client.md +#: src/android/aidl/example-service/service.md +#: src/android/aidl/example-service/server.md +#: src/android/aidl/example-service/client.md msgid "_birthday_service/Android.bp_:" msgstr "" -#: src/android/aidl/implementation.md src/android/aidl/server.md +#: src/android/aidl/example-service/service.md +#: src/android/aidl/example-service/server.md msgid "\"libbirthdayservice\"" msgstr "" -#: src/android/aidl/implementation.md src/android/aidl/server.md -#: src/android/aidl/client.md +#: src/android/aidl/example-service/service.md +#: src/android/aidl/example-service/server.md +#: src/android/aidl/example-service/client.md msgid "\"birthdayservice\"" msgstr "" -#: src/android/aidl/implementation.md src/android/aidl/server.md -#: src/android/aidl/client.md +#: src/android/aidl/example-service/service.md +#: src/android/aidl/example-service/server.md +#: src/android/aidl/example-service/client.md msgid "\"com.example.birthdayservice-rust\"" msgstr "" -#: src/android/aidl/implementation.md src/android/aidl/server.md -#: src/android/aidl/client.md +#: src/android/aidl/example-service/service.md +#: src/android/aidl/example-service/server.md +#: src/android/aidl/example-service/client.md msgid "\"libbinder_rs\"" msgstr "" -#: src/android/aidl/server.md +#: src/android/aidl/example-service/service.md +msgid "" +"Point out the path to the generated `IBirthdayService` trait, and explain " +"why each of the segments is necessary." +msgstr "" + +#: src/android/aidl/example-service/service.md +msgid "" +"TODO: What does the `binder::Interface` trait do? Are there methods to " +"override? Where source?" +msgstr "" + +#: src/android/aidl/example-service/server.md msgid "AIDL Server" msgstr "" -#: src/android/aidl/server.md +#: src/android/aidl/example-service/server.md msgid "Finally, we can create a server which exposes the service:" msgstr "" -#: src/android/aidl/server.md +#: src/android/aidl/example-service/server.md msgid "_birthday_service/src/server.rs_:" msgstr "" -#: src/android/aidl/server.md src/android/aidl/client.md +#: src/android/aidl/example-service/server.md msgid "//! Birthday service.\n" msgstr "" -#: src/android/aidl/server.md +#: src/android/aidl/example-service/server.md msgid "/// Entry point for birthday service.\n" msgstr "" -#: src/android/aidl/server.md +#: src/android/aidl/example-service/server.md msgid "\"Failed to register service\"" msgstr "" -#: src/android/aidl/server.md +#: src/android/aidl/example-service/server.md msgid "\"birthday_server\"" msgstr "" -#: src/android/aidl/server.md +#: src/android/aidl/example-service/server.md msgid "\"src/server.rs\"" msgstr "" -#: src/android/aidl/server.md src/android/aidl/client.md +#: src/android/aidl/example-service/server.md +#: src/android/aidl/example-service/client.md msgid "// To avoid dynamic link error.\n" msgstr "" -#: src/android/aidl/deploy.md +#: src/android/aidl/example-service/server.md +msgid "" +"The process for taking a user-defined service implementation (in this case " +"the `BirthdayService` type, which implements the `IBirthdayService`) and " +"starting it as a Binder service has multiple steps, and may appear more " +"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 "" + +#: src/android/aidl/example-service/server.md +msgid "Create an instance of your service type (`BirthdayService`)." +msgstr "" + +#: src/android/aidl/example-service/server.md +msgid "" +"Wrap the service object in corresponding `Bn*` type (`BnBirthdayService` in " +"this case). This type is generated by Binder and provides the common Binder " +"functionality that would be provided by the `BnBinder` base class in C++. We " +"don't have inheritance in Rust, so instead we use composition, putting our " +"`BirthdayService` within the generated `BnBinderService`." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: src/android/aidl/example-service/deploy.md msgid "We can now build, push, and start the service:" msgstr "" -#: src/android/aidl/deploy.md +#: src/android/aidl/example-service/deploy.md msgid "" "```shell\n" "m birthday_server\n" @@ -11250,59 +11540,62 @@ msgid "" "```" msgstr "" -#: src/android/aidl/deploy.md +#: src/android/aidl/example-service/deploy.md msgid "In another terminal, check that the service runs:" msgstr "" -#: src/android/aidl/deploy.md +#: src/android/aidl/example-service/deploy.md msgid "You can also call the service with `service call`:" msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md msgid "AIDL Client" msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md msgid "Finally, we can create a Rust client for our new service." msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md +#: src/android/aidl/example-service/changing-implementation.md msgid "_birthday_service/src/client.rs_:" msgstr "" -#: src/android/aidl/client.md -msgid "/// Connect to the BirthdayService.\n" -msgstr "" - -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md msgid "/// Call the birthday service.\n" msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md src/android/aidl/types/objects.md +#: src/android/aidl/types/parcelables.md +#: src/android/aidl/types/file-descriptor.md msgid "\"Failed to connect to BirthdayService\"" msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md +msgid "// Call the service.\n" +msgstr "" + +#: src/android/aidl/example-service/client.md msgid "\"{msg}\"" msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md msgid "\"birthday_client\"" msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md msgid "\"src/client.rs\"" msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md msgid "Notice that the client does not depend on `libbirthdayservice`." msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md msgid "Build, push, and run the client on your device:" msgstr "" -#: src/android/aidl/client.md +#: src/android/aidl/example-service/client.md msgid "" "```shell\n" "m birthday_client\n" @@ -11312,12 +11605,366 @@ msgid "" "```" msgstr "" -#: src/android/aidl/changing.md +#: src/android/aidl/example-service/client.md +msgid "" +"`Strong` is the trait object representing the service " +"that the client has connected to." +msgstr "" + +#: src/android/aidl/example-service/client.md +msgid "" +"`Strong` is a custom smart pointer type for Binder. It handles both an in-" +"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 "" + +#: src/android/aidl/example-service/client.md +msgid "" +"Note that the trait object that the client uses to talk to the service uses " +"the exact same trait that the server implements. For a given Binder " +"interface, there is a single Rust trait generated that both client and " +"server use." +msgstr "" + +#: src/android/aidl/example-service/client.md +msgid "" +"Use the same service identifier used when registering the service. This " +"should ideally be defined in a common crate that both the client and server " +"can depend on." +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md msgid "" "Let us extend the API with more functionality: we want to let clients " "specify a list of lines for the birthday card:" msgstr "" +#: src/android/aidl/example-service/changing-definition.md +msgid "This results in an updated trait definition for `IBirthdayService`:" +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md +msgid "" +"Note how the `String[]` in the AIDL definition is translated as a " +"`&[String]` in Rust, i.e. that idiomatic Rust types are used in the " +"generated bindings wherever possible:" +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md +msgid "`in` array arguments are translated to slices." +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md +msgid "`out` and `inout` args are translated to `&mut Vec`." +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md +msgid "Return values are translated to returning a `Vec`." +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "Updating Client and Service" +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "Update the client and server code to account for the new API." +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "'\\n'" +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "\"Habby birfday to yuuuuu\"" +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "\"And also: many more\"" +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "" +"TODO: Move code snippets into project files where they'll actually be built?" +msgstr "" + +#: src/android/aidl/types.md +msgid "Working With AIDL Types" +msgstr "" + +#: src/android/aidl/types.md +msgid "AIDL types translate into the appropriate idiomatic Rust type:" +msgstr "" + +#: src/android/aidl/types.md +msgid "Primitive types map (mostly) to idiomatic Rust types." +msgstr "" + +#: src/android/aidl/types.md +msgid "Collection types like slices, `Vec`s and string types are supported." +msgstr "" + +#: src/android/aidl/types.md +msgid "" +"References to AIDL objects and file handles can be sent between clients and " +"services." +msgstr "" + +#: src/android/aidl/types.md +msgid "File handles and parcelables are fully supported." +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "Primitive types map (mostly) idiomatically:" +msgstr "" + +#: src/android/aidl/types/primitives.md +#, fuzzy +msgid "AIDL Type" +msgstr "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 "āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ°āĻžāĻ¸ā§āĻŸ" + +#: src/android/aidl/types/primitives.md +msgid "Note" +msgstr "" + +#: src/android/aidl/types/primitives.md +#, fuzzy +msgid "`boolean`" +msgstr "`bool`" + +#: src/android/aidl/types/primitives.md +msgid "`byte`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`i8`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "Note that bytes are signed." +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`u16`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "Note the usage of `u16`, NOT `u32`." +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`int`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`i32`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`long`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`i64`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`float`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`f32`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`double`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`f64`" +msgstr "" + +#: src/android/aidl/types/arrays.md +msgid "" +"The array types (`T[]`, `byte[]`, and `List`) get translated to the " +"appropriate Rust array type depending on how they are used in the function " +"signature:" +msgstr "" + +#: src/android/aidl/types/arrays.md +#, fuzzy +msgid "Position" +msgstr "āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĻ¸āĻŽā§‚āĻš" + +#: src/android/aidl/types/arrays.md +msgid "`in` argument" +msgstr "" + +#: src/android/aidl/types/arrays.md +#, fuzzy +msgid "`&[T]`" +msgstr "Slices" + +#: src/android/aidl/types/arrays.md +msgid "`out`/`inout` argument" +msgstr "" + +#: src/android/aidl/types/arrays.md +msgid "`&mut Vec`" +msgstr "" + +#: src/android/aidl/types/arrays.md +msgid "Return" +msgstr "" + +#: src/android/aidl/types/arrays.md +#: src/android/interoperability/cpp/type-mapping.md +msgid "`Vec`" +msgstr "" + +#: src/android/aidl/types/arrays.md +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." +msgstr "" + +#: src/android/aidl/types/arrays.md +msgid "Arrays in parcelable fields always get translated to `Vec`." +msgstr "" + +#: 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 "" + +#: src/android/aidl/types/objects.md +msgid "" +"**birthday_service/aidl/com/example/birthdayservice/IBirthdayInfoProvider." +"aidl**:" +msgstr "" + +#: src/android/aidl/types/objects.md src/android/aidl/types/parcelables.md +#: src/android/aidl/types/file-descriptor.md +msgid "" +"**birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl**:" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "/** The same thing, but using a binder object. */" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "/** The same thing, but using `IBinder`. */" +msgstr "" + +#: src/android/aidl/types/objects.md src/android/aidl/types/parcelables.md +#: src/android/aidl/types/file-descriptor.md +msgid "**birthday_service/src/client.rs**:" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "/// Rust struct implementing the `IBirthdayInfoProvider` interface.\n" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "// Create a binder object for the `IBirthdayInfoProvider` interface.\n" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "// Send the binder object to the service.\n" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "" +"// Perform the same operation but passing the provider as an `SpIBinder`.\n" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "" +"Note the usage of `BnBirthdayInfoProvider`. This serves the same purpose as " +"`BnBirthdayService` that we saw previously." +msgstr "" + +#: src/android/aidl/types/parcelables.md +msgid "Binder for Rust supports sending parcelables directly:" +msgstr "" + +#: src/android/aidl/types/parcelables.md +msgid "" +"**birthday_service/aidl/com/example/birthdayservice/BirthdayInfo.aidl**:" +msgstr "" + +#: src/android/aidl/types/parcelables.md +msgid "/** The same thing, but with a parcelable. */" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "" +"Files can be sent between Binder clients/servers using the " +"`ParcelFileDescriptor` type:" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "/** The same thing, but loads info from a file. */" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "// Open a file and put the birthday info in it.\n" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "\"/data/local/tmp/birthday.info\"" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "\"{name}\"" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "\"{years}\"" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "// Create a `ParcelFileDescriptor` from the file and send it.\n" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "**birthday_service/src/lib.rs**:" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "" +"// Convert the file descriptor to a `File`. `ParcelFileDescriptor` wraps\n" +" // an `OwnedFd`, which can be cloned and then used to create a " +"`File`\n" +" // object.\n" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "\"Invalid file handle\"" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "" +"`ParcelFileDescriptor` wraps an `OwnedFd`, and so can be created from a " +"`File` (or any other type that wraps an `OwnedFd`), and can be used to " +"create a new `File` handle on the other side." +msgstr "" + +#: 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 "" + #: src/android/logging.md msgid "" "You should use the `log` crate to automatically log to `logcat` (on-device) " @@ -11903,11 +12550,6 @@ msgid "" "through a `noexcept` C++ function." msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "Rust Type" -msgstr "āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ°āĻžāĻ¸ā§āĻŸ" - #: src/android/interoperability/cpp/type-mapping.md #, fuzzy msgid "C++ Type" @@ -11955,10 +12597,6 @@ msgstr "" msgid "`std::unique_ptr`" msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -msgid "`Vec`" -msgstr "" - #: src/android/interoperability/cpp/type-mapping.md msgid "`rust::Vec`" msgstr "" @@ -12065,9 +12703,11 @@ msgid "" msgstr "" #: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "" -"// Generate a C++ header containing the C++ bindings\n" -"// to the Rust exported functions in lib.rs.\n" +msgid "// Generate a C++ header containing the C++ bindings" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "// to the Rust exported functions in lib.rs." msgstr "" #: src/android/interoperability/cpp/android-cpp-genrules.md @@ -12088,7 +12728,7 @@ msgid "\"lib.rs.h\"" msgstr "" #: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "// Generate the C++ code that Rust calls into.\n" +msgid "// Generate the C++ code that Rust calls into." msgstr "" #: src/android/interoperability/cpp/android-cpp-genrules.md @@ -12278,9 +12918,9 @@ msgstr "" #: src/chromium/cargo.md msgid "" -"Rust community typically uses `cargo` and libraries from [crates.io](https://" -"crates.io/). Chromium is built using `gn` and `ninja` and a curated set of " -"dependencies." +"The Rust community typically uses `cargo` and libraries from [crates.io]" +"(https://crates.io/). Chromium is built using `gn` and `ninja` and a curated " +"set of dependencies." msgstr "" #: src/chromium/cargo.md @@ -12434,13 +13074,13 @@ msgstr "" msgid "" "Disclaimer: a unique reason for using `cargo` was unavailability of `gn` " "when building and bootstrapping Rust standard library when building Rust " -"toolchain.)" +"toolchain." msgstr "" #: src/chromium/cargo.md msgid "" "`run_gnrt.py` uses Chromium's copy of `cargo` and `rustc`. `gnrt` depends on " -"third-party libraries downloaded from the internet, by `run_gnrt.py` asks " +"third-party libraries downloaded from the internet, but `run_gnrt.py` asks " "`cargo` that only `--locked` content is allowed via `Cargo.lock`.)" msgstr "" @@ -13134,7 +13774,7 @@ msgid "\"example/include/blobstore.h\"" msgstr "" #: src/chromium/interoperability-with-cpp/example-bindings.md -msgid "// Definitions of Rust types and functions go here\n" +msgid "// Definitions of Rust types and functions go here" msgstr "" #: src/chromium/interoperability-with-cpp/example-bindings.md @@ -13331,17 +13971,19 @@ msgid "\"gfx::rust_bindings\"" msgstr "" #: src/chromium/interoperability-with-cpp/error-handling-png.md -msgid "" -"/// This returns an FFI-friendly equivalent of `Result,\n" -" /// ()>`.\n" +msgid "/// This returns an FFI-friendly equivalent of `Result," msgstr "" #: src/chromium/interoperability-with-cpp/error-handling-png.md -msgid "/// C++ bindings for the `crate::png::ResultOfPngReader` type.\n" +msgid "/// ()>`." msgstr "" #: src/chromium/interoperability-with-cpp/error-handling-png.md -msgid "/// C++ bindings for the `crate::png::PngReader` type.\n" +msgid "/// C++ bindings for the `crate::png::ResultOfPngReader` type." +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-png.md +msgid "/// C++ bindings for the `crate::png::PngReader` type." msgstr "" #: src/chromium/interoperability-with-cpp/error-handling-png.md @@ -14682,6 +15324,10 @@ msgstr "" msgid "// let gpio0_01_again = gpio0.p0_01; // Error, moved.\n" msgstr "" +#: src/bare-metal/microcontrollers/type-state.md +msgid "// ...\n" +msgstr "" + #: src/bare-metal/microcontrollers/type-state.md msgid "// pin_input.is_high(); // Error, moved.\n" msgstr "" @@ -15011,33 +15657,6 @@ msgstr "" msgid "_src/main.rs_:" msgstr "" -#: src/exercises/bare-metal/compass.md -#: src/exercises/bare-metal/solutions-morning.md -msgid "// Configure serial port.\n" -msgstr "" - -#: src/exercises/bare-metal/compass.md -#: src/exercises/bare-metal/solutions-morning.md -msgid "// Use the system timer as a delay provider.\n" -msgstr "" - -#: src/exercises/bare-metal/compass.md -msgid "" -"// Set up the I2C controller and Inertial Measurement Unit.\n" -" // TODO\n" -msgstr "" - -#: src/exercises/bare-metal/compass.md -#: src/exercises/bare-metal/solutions-morning.md -msgid "\"Ready.\"" -msgstr "" - -#: src/exercises/bare-metal/compass.md -msgid "" -"// Read compass data and log it to the serial port.\n" -" // TODO\n" -msgstr "" - #: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md msgid "_Cargo.toml_ (you shouldn't need to change this):" msgstr "" @@ -15071,6 +15690,14 @@ msgstr "" msgid "([back to exercise](compass.md))" msgstr "" +#: src/exercises/bare-metal/solutions-morning.md +msgid "// Configure serial port.\n" +msgstr "" + +#: src/exercises/bare-metal/solutions-morning.md +msgid "// Use the system timer as a delay provider.\n" +msgstr "" + #: src/exercises/bare-metal/solutions-morning.md msgid "// Set up the I2C controller and Inertial Measurement Unit.\n" msgstr "" @@ -15083,6 +15710,10 @@ msgstr "" msgid "// Set up display and timer.\n" msgstr "" +#: src/exercises/bare-metal/solutions-morning.md +msgid "\"Ready.\"" +msgstr "" + #: src/exercises/bare-metal/solutions-morning.md msgid "// Read compass data and log it to the serial port.\n" msgstr "" @@ -15441,12 +16072,10 @@ msgid "" msgstr "" #: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md -#: src/exercises/bare-metal/rtc.md msgid "/// Writes a single byte to the UART.\n" msgstr "" #: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md -#: src/exercises/bare-metal/rtc.md msgid "// Wait until there is room in the TX buffer.\n" msgstr "" @@ -15457,12 +16086,10 @@ msgid "" msgstr "" #: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md -#: src/exercises/bare-metal/rtc.md msgid "// Write to the TX buffer.\n" msgstr "" #: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md -#: src/exercises/bare-metal/rtc.md msgid "// Wait until the UART is no longer busy.\n" msgstr "" @@ -15500,7 +16127,7 @@ msgid "" "traits too." msgstr "" -#: src/bare-metal/aps/uart/traits.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/uart/traits.md #: src/exercises/bare-metal/solutions-afternoon.md msgid "" "// Safe because it just contains a pointer to device memory, which can be\n" @@ -15682,43 +16309,43 @@ msgid "" "working with bitflags." msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// Flags from the UART flag register.\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// Clear to send.\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// Data set ready.\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// Data carrier detect.\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// UART busy transmitting data.\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// Receive FIFO is empty.\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// Transmit FIFO is full.\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// Receive FIFO is full.\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// Transmit FIFO is empty.\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/bitflags.md msgid "/// Ring indicator.\n" msgstr "" @@ -15754,19 +16381,19 @@ msgstr "" msgid "/// Driver for a PL011 UART.\n" msgstr "" -#: src/bare-metal/aps/better-uart/driver.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/driver.md msgid "" "// Safe because we know that self.registers points to the control\n" " // registers of a PL011 device which is appropriately mapped.\n" msgstr "" -#: src/bare-metal/aps/better-uart/driver.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/driver.md msgid "" "/// Reads and returns a pending byte, or `None` if nothing has been\n" " /// received.\n" msgstr "" -#: src/bare-metal/aps/better-uart/driver.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/better-uart/driver.md msgid "// TODO: Check for error conditions in bits 8-11.\n" msgstr "" @@ -15787,13 +16414,11 @@ msgid "" msgstr "" #: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md -#: src/exercises/bare-metal/rtc.md #: src/exercises/bare-metal/solutions-afternoon.md msgid "/// Base address of the primary PL011 UART.\n" msgstr "" #: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md -#: src/exercises/bare-metal/rtc.md #: src/exercises/bare-metal/solutions-afternoon.md msgid "" "// Safe because `PL011_BASE_ADDRESS` is the base address of a PL011 device,\n" @@ -15839,11 +16464,11 @@ msgid "" "`Log` trait." msgstr "" -#: src/bare-metal/aps/logging.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/logging.md msgid "\"[{}] {}\"" msgstr "" -#: src/bare-metal/aps/logging.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/logging.md msgid "/// Initialises UART logger.\n" msgstr "" @@ -15857,7 +16482,7 @@ msgstr "" msgid "We need to initialise the logger before we use it." msgstr "" -#: src/bare-metal/aps/logging/using.md src/exercises/bare-metal/rtc.md +#: src/bare-metal/aps/logging/using.md #: src/exercises/bare-metal/solutions-afternoon.md msgid "\"{info}\"" msgstr "" @@ -16031,15 +16656,15 @@ msgid "" msgstr "" #: src/bare-metal/useful-crates/aarch64-paging.md -msgid "// Create a new page table with identity mapping.\n" +msgid "// Create a new page table with identity mapping." msgstr "" #: src/bare-metal/useful-crates/aarch64-paging.md -msgid "// Map a 2 MiB region of memory as read-only.\n" +msgid "// Map a 2 MiB region of memory as read-only." msgstr "" #: src/bare-metal/useful-crates/aarch64-paging.md -msgid "// Set `TTBR0_EL1` to activate the page table.\n" +msgid "// Set `TTBR0_EL1` to activate the page table." msgstr "" #: src/bare-metal/useful-crates/aarch64-paging.md @@ -16229,763 +16854,44 @@ msgid "" "look in the `rtc` directory for the following files." msgstr "" -#: src/exercises/bare-metal/rtc.md -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Base addresses of the GICv3.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "\"main({:#x}, {:#x}, {:#x}, {:#x})\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "" -"// Safe because `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 "" - -#: src/exercises/bare-metal/rtc.md -msgid "// TODO: Create instance of RTC driver and print current time.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "// TODO: Wait for 3 seconds.\n" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "" "_src/exceptions.rs_ (you should only need to change this for the 3rd part of " "the exercise):" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "" -"// Copyright 2023 Google LLC\n" -"//\n" -"// Licensed under the Apache License, Version 2.0 (the \"License\");\n" -"// you may not use this file except in compliance with the License.\n" -"// You may obtain a copy of the License at\n" -"//\n" -"// http://www.apache.org/licenses/LICENSE-2.0\n" -"//\n" -"// Unless required by applicable law or agreed to in writing, software\n" -"// distributed under the License is distributed on an \"AS IS\" BASIS,\n" -"// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" -"// See the License for the specific language governing permissions and\n" -"// limitations under the License.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"sync_exception_current\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"irq_current\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"No pending interrupt\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"IRQ {intid:?}\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"fiq_current\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"serr_current\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"sync_lower\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"irq_lower\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"fiq_lower\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"serr_lower\"" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "_src/logger.rs_ (you shouldn't need to change this):" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "// ANCHOR: main\n" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "_src/pl011.rs_ (you shouldn't need to change this):" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "// ANCHOR: Flags\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "// ANCHOR_END: Flags\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "" -"/// Flags from the UART Receive Status Register / Error Clear Register.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "/// Framing error.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "/// Parity error.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "/// Break error.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "/// Overrun error.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "// ANCHOR: Registers\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "// ANCHOR_END: Registers\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "" -"// ANCHOR: Uart\n" -"/// Driver for a PL011 UART.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "" -"/// Constructs a new instance of the UART driver for a PL011 device at the\n" -" /// given base address.\n" -" ///\n" -" /// # Safety\n" -" ///\n" -" /// The given base address must point to the MMIO control registers of " -"a\n" -" /// PL011 device, which must be mapped into the address space of the " -"process\n" -" /// as device memory and not have any other aliases.\n" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "// ANCHOR_END: Uart\n" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "_build.rs_ (you shouldn't need to change this):" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "\"linux\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"CROSS_COMPILE\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "\"aarch64-linux-gnu\"" -msgstr "aarch64-paging" - -#: src/exercises/bare-metal/rtc.md -msgid "\"aarch64-none-elf\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"entry.S\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "\"exceptions.S\"" -msgstr "āĻŦā§āĻ¯āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ" - -#: src/exercises/bare-metal/rtc.md -msgid "\"idmap.S\"" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "\"empty\"" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "_entry.S_ (you shouldn't need to change this):" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "" -"```armasm\n" -"/*\n" -" * Copyright 2023 Google LLC\n" -" *\n" -" * Licensed under the Apache License, Version 2.0 (the \"License\");\n" -" * you may not use this file except in compliance with the License.\n" -" * You may obtain a copy of the License at\n" -" *\n" -" * https://www.apache.org/licenses/LICENSE-2.0\n" -" *\n" -" * Unless required by applicable law or agreed to in writing, software\n" -" * distributed under the License is distributed on an \"AS IS\" BASIS,\n" -" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" -" * See the License for the specific language governing permissions and\n" -" * limitations under the License.\n" -" */\n" -"\n" -".macro adr_l, reg:req, sym:req\n" -"\tadrp \\reg, \\sym\n" -"\tadd \\reg, \\reg, :lo12:\\sym\n" -".endm\n" -"\n" -".macro mov_i, reg:req, imm:req\n" -"\tmovz \\reg, :abs_g3:\\imm\n" -"\tmovk \\reg, :abs_g2_nc:\\imm\n" -"\tmovk \\reg, :abs_g1_nc:\\imm\n" -"\tmovk \\reg, :abs_g0_nc:\\imm\n" -".endm\n" -"\n" -".set .L_MAIR_DEV_nGnRE,\t0x04\n" -".set .L_MAIR_MEM_WBWA,\t0xff\n" -".set .Lmairval, .L_MAIR_DEV_nGnRE | (.L_MAIR_MEM_WBWA << 8)\n" -"\n" -"/* 4 KiB granule size for TTBR0_EL1. */\n" -".set .L_TCR_TG0_4KB, 0x0 << 14\n" -"/* 4 KiB granule size for TTBR1_EL1. */\n" -".set .L_TCR_TG1_4KB, 0x2 << 30\n" -"/* Disable translation table walk for TTBR1_EL1, generating a translation " -"fault instead. */\n" -".set .L_TCR_EPD1, 0x1 << 23\n" -"/* Translation table walks for TTBR0_EL1 are inner sharable. */\n" -".set .L_TCR_SH_INNER, 0x3 << 12\n" -"/*\n" -" * Translation table walks for TTBR0_EL1 are outer write-back read-allocate " -"write-allocate\n" -" * cacheable.\n" -" */\n" -".set .L_TCR_RGN_OWB, 0x1 << 10\n" -"/*\n" -" * Translation table walks for TTBR0_EL1 are inner write-back read-allocate " -"write-allocate\n" -" * cacheable.\n" -" */\n" -".set .L_TCR_RGN_IWB, 0x1 << 8\n" -"/* Size offset for TTBR0_EL1 is 2**39 bytes (512 GiB). */\n" -".set .L_TCR_T0SZ_512, 64 - 39\n" -".set .Ltcrval, .L_TCR_TG0_4KB | .L_TCR_TG1_4KB | .L_TCR_EPD1 | ." -"L_TCR_RGN_OWB\n" -".set .Ltcrval, .Ltcrval | .L_TCR_RGN_IWB | .L_TCR_SH_INNER | ." -"L_TCR_T0SZ_512\n" -"\n" -"/* Stage 1 instruction access cacheability is unaffected. */\n" -".set .L_SCTLR_ELx_I, 0x1 << 12\n" -"/* SP alignment fault if SP is not aligned to a 16 byte boundary. */\n" -".set .L_SCTLR_ELx_SA, 0x1 << 3\n" -"/* Stage 1 data access cacheability is unaffected. */\n" -".set .L_SCTLR_ELx_C, 0x1 << 2\n" -"/* EL0 and EL1 stage 1 MMU enabled. */\n" -".set .L_SCTLR_ELx_M, 0x1 << 0\n" -"/* Privileged Access Never is unchanged on taking an exception to EL1. */\n" -".set .L_SCTLR_EL1_SPAN, 0x1 << 23\n" -"/* SETEND instruction disabled at EL0 in aarch32 mode. */\n" -".set .L_SCTLR_EL1_SED, 0x1 << 8\n" -"/* Various IT instructions are disabled at EL0 in aarch32 mode. */\n" -".set .L_SCTLR_EL1_ITD, 0x1 << 7\n" -".set .L_SCTLR_EL1_RES1, (0x1 << 11) | (0x1 << 20) | (0x1 << 22) | (0x1 << " -"28) | (0x1 << 29)\n" -".set .Lsctlrval, .L_SCTLR_ELx_M | .L_SCTLR_ELx_C | .L_SCTLR_ELx_SA | ." -"L_SCTLR_EL1_ITD | .L_SCTLR_EL1_SED\n" -".set .Lsctlrval, .Lsctlrval | .L_SCTLR_ELx_I | .L_SCTLR_EL1_SPAN | ." -"L_SCTLR_EL1_RES1\n" -"\n" -"/**\n" -" * This is a generic entry point for an image. It carries out the operations " -"required to prepare the\n" -" * loaded image to be run. Specifically, it zeroes the bss section using " -"registers x25 and above,\n" -" * prepares the stack, enables floating point, and sets up the exception " -"vector. It preserves x0-x3\n" -" * for the Rust entry point, as these may contain boot parameters.\n" -" */\n" -".section .init.entry, \"ax\"\n" -".global entry\n" -"entry:\n" -"\t/* Load and apply the memory management configuration, ready to enable MMU " -"and caches. */\n" -"\tadrp x30, idmap\n" -"\tmsr ttbr0_el1, x30\n" -"\n" -"\tmov_i x30, .Lmairval\n" -"\tmsr mair_el1, x30\n" -"\n" -"\tmov_i x30, .Ltcrval\n" -"\t/* Copy the supported PA range into TCR_EL1.IPS. */\n" -"\tmrs x29, id_aa64mmfr0_el1\n" -"\tbfi x30, x29, #32, #4\n" -"\n" -"\tmsr tcr_el1, x30\n" -"\n" -"\tmov_i x30, .Lsctlrval\n" -"\n" -"\t/*\n" -"\t * Ensure everything before this point has completed, then invalidate any " -"potentially stale\n" -"\t * local TLB entries before they start being used.\n" -"\t */\n" -"\tisb\n" -"\ttlbi vmalle1\n" -"\tic iallu\n" -"\tdsb nsh\n" -"\tisb\n" -"\n" -"\t/*\n" -"\t * Configure sctlr_el1 to enable MMU and cache and don't proceed until " -"this has completed.\n" -"\t */\n" -"\tmsr sctlr_el1, x30\n" -"\tisb\n" -"\n" -"\t/* Disable trapping floating point access in EL1. */\n" -"\tmrs x30, cpacr_el1\n" -"\torr x30, x30, #(0x3 << 20)\n" -"\tmsr cpacr_el1, x30\n" -"\tisb\n" -"\n" -"\t/* Zero out the bss section. */\n" -"\tadr_l x29, bss_begin\n" -"\tadr_l x30, bss_end\n" -"0:\tcmp x29, x30\n" -"\tb.hs 1f\n" -"\tstp xzr, xzr, [x29], #16\n" -"\tb 0b\n" -"\n" -"1:\t/* Prepare the stack. */\n" -"\tadr_l x30, boot_stack_end\n" -"\tmov sp, x30\n" -"\n" -"\t/* Set up exception vector. */\n" -"\tadr x30, vector_table_el1\n" -"\tmsr vbar_el1, x30\n" -"\n" -"\t/* Call into Rust code. */\n" -"\tbl main\n" -"\n" -"\t/* Loop forever waiting for interrupts. */\n" -"2:\twfi\n" -"\tb 2b\n" -"```" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "_exceptions.S_ (you shouldn't need to change this):" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "" -"```armasm\n" -"/*\n" -" * Copyright 2023 Google LLC\n" -" *\n" -" * Licensed under the Apache License, Version 2.0 (the \"License\");\n" -" * you may not use this file except in compliance with the License.\n" -" * You may obtain a copy of the License at\n" -" *\n" -" * https://www.apache.org/licenses/LICENSE-2.0\n" -" *\n" -" * Unless required by applicable law or agreed to in writing, software\n" -" * distributed under the License is distributed on an \"AS IS\" BASIS,\n" -" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" -" * See the License for the specific language governing permissions and\n" -" * limitations under the License.\n" -" */\n" -"\n" -"/**\n" -" * Saves the volatile registers onto the stack. This currently takes 14\n" -" * instructions, so it can be used in exception handlers with 18 " -"instructions\n" -" * left.\n" -" *\n" -" * On return, x0 and x1 are initialised to elr_el2 and spsr_el2 " -"respectively,\n" -" * which can be used as the first and second arguments of a subsequent " -"call.\n" -" */\n" -".macro save_volatile_to_stack\n" -"\t/* Reserve stack space and save registers x0-x18, x29 & x30. */\n" -"\tstp x0, x1, [sp, #-(8 * 24)]!\n" -"\tstp x2, x3, [sp, #8 * 2]\n" -"\tstp x4, x5, [sp, #8 * 4]\n" -"\tstp x6, x7, [sp, #8 * 6]\n" -"\tstp x8, x9, [sp, #8 * 8]\n" -"\tstp x10, x11, [sp, #8 * 10]\n" -"\tstp x12, x13, [sp, #8 * 12]\n" -"\tstp x14, x15, [sp, #8 * 14]\n" -"\tstp x16, x17, [sp, #8 * 16]\n" -"\tstr x18, [sp, #8 * 18]\n" -"\tstp x29, x30, [sp, #8 * 20]\n" -"\n" -"\t/*\n" -"\t * Save elr_el1 & spsr_el1. This such that we can take nested exception\n" -"\t * and still be able to unwind.\n" -"\t */\n" -"\tmrs x0, elr_el1\n" -"\tmrs x1, spsr_el1\n" -"\tstp x0, x1, [sp, #8 * 22]\n" -".endm\n" -"\n" -"/**\n" -" * Restores the volatile registers from the stack. This currently takes 14\n" -" * instructions, so it can be used in exception handlers while still leaving " -"18\n" -" * instructions left; if paired with save_volatile_to_stack, there are 4\n" -" * instructions to spare.\n" -" */\n" -".macro restore_volatile_from_stack\n" -"\t/* Restore registers x2-x18, x29 & x30. */\n" -"\tldp x2, x3, [sp, #8 * 2]\n" -"\tldp x4, x5, [sp, #8 * 4]\n" -"\tldp x6, x7, [sp, #8 * 6]\n" -"\tldp x8, x9, [sp, #8 * 8]\n" -"\tldp x10, x11, [sp, #8 * 10]\n" -"\tldp x12, x13, [sp, #8 * 12]\n" -"\tldp x14, x15, [sp, #8 * 14]\n" -"\tldp x16, x17, [sp, #8 * 16]\n" -"\tldr x18, [sp, #8 * 18]\n" -"\tldp x29, x30, [sp, #8 * 20]\n" -"\n" -"\t/* Restore registers elr_el1 & spsr_el1, using x0 & x1 as scratch. */\n" -"\tldp x0, x1, [sp, #8 * 22]\n" -"\tmsr elr_el1, x0\n" -"\tmsr spsr_el1, x1\n" -"\n" -"\t/* Restore x0 & x1, and release stack space. */\n" -"\tldp x0, x1, [sp], #8 * 24\n" -".endm\n" -"\n" -"/**\n" -" * This is a generic handler for exceptions taken at the current EL while " -"using\n" -" * SP0. It behaves similarly to the SPx case by first switching to SPx, " -"doing\n" -" * the work, then switching back to SP0 before returning.\n" -" *\n" -" * Switching to SPx and calling the Rust handler takes 16 instructions. To\n" -" * restore and return we need an additional 16 instructions, so we can " -"implement\n" -" * the whole handler within the allotted 32 instructions.\n" -" */\n" -".macro current_exception_sp0 handler:req\n" -"\tmsr spsel, #1\n" -"\tsave_volatile_to_stack\n" -"\tbl \\handler\n" -"\trestore_volatile_from_stack\n" -"\tmsr spsel, #0\n" -"\teret\n" -".endm\n" -"\n" -"/**\n" -" * This is a generic handler for exceptions taken at the current EL while " -"using\n" -" * SPx. It saves volatile registers, calls the Rust handler, restores " -"volatile\n" -" * registers, then returns.\n" -" *\n" -" * This also works for exceptions taken from EL0, if we don't care about\n" -" * non-volatile registers.\n" -" *\n" -" * Saving state and jumping to the Rust handler takes 15 instructions, and\n" -" * restoring and returning also takes 15 instructions, so we can fit the " -"whole\n" -" * handler in 30 instructions, under the limit of 32.\n" -" */\n" -".macro current_exception_spx handler:req\n" -"\tsave_volatile_to_stack\n" -"\tbl \\handler\n" -"\trestore_volatile_from_stack\n" -"\teret\n" -".endm\n" -"\n" -".section .text.vector_table_el1, \"ax\"\n" -".global vector_table_el1\n" -".balign 0x800\n" -"vector_table_el1:\n" -"sync_cur_sp0:\n" -"\tcurrent_exception_sp0 sync_exception_current\n" -"\n" -".balign 0x80\n" -"irq_cur_sp0:\n" -"\tcurrent_exception_sp0 irq_current\n" -"\n" -".balign 0x80\n" -"fiq_cur_sp0:\n" -"\tcurrent_exception_sp0 fiq_current\n" -"\n" -".balign 0x80\n" -"serr_cur_sp0:\n" -"\tcurrent_exception_sp0 serr_current\n" -"\n" -".balign 0x80\n" -"sync_cur_spx:\n" -"\tcurrent_exception_spx sync_exception_current\n" -"\n" -".balign 0x80\n" -"irq_cur_spx:\n" -"\tcurrent_exception_spx irq_current\n" -"\n" -".balign 0x80\n" -"fiq_cur_spx:\n" -"\tcurrent_exception_spx fiq_current\n" -"\n" -".balign 0x80\n" -"serr_cur_spx:\n" -"\tcurrent_exception_spx serr_current\n" -"\n" -".balign 0x80\n" -"sync_lower_64:\n" -"\tcurrent_exception_spx sync_lower\n" -"\n" -".balign 0x80\n" -"irq_lower_64:\n" -"\tcurrent_exception_spx irq_lower\n" -"\n" -".balign 0x80\n" -"fiq_lower_64:\n" -"\tcurrent_exception_spx fiq_lower\n" -"\n" -".balign 0x80\n" -"serr_lower_64:\n" -"\tcurrent_exception_spx serr_lower\n" -"\n" -".balign 0x80\n" -"sync_lower_32:\n" -"\tcurrent_exception_spx sync_lower\n" -"\n" -".balign 0x80\n" -"irq_lower_32:\n" -"\tcurrent_exception_spx irq_lower\n" -"\n" -".balign 0x80\n" -"fiq_lower_32:\n" -"\tcurrent_exception_spx fiq_lower\n" -"\n" -".balign 0x80\n" -"serr_lower_32:\n" -"\tcurrent_exception_spx serr_lower\n" -"```" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "_idmap.S_ (you shouldn't need to change this):" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "" -"```armasm\n" -"/*\n" -" * Copyright 2023 Google LLC\n" -" *\n" -" * Licensed under the Apache License, Version 2.0 (the \"License\");\n" -" * you may not use this file except in compliance with the License.\n" -" * You may obtain a copy of the License at\n" -" *\n" -" * https://www.apache.org/licenses/LICENSE-2.0\n" -" *\n" -" * Unless required by applicable law or agreed to in writing, software\n" -" * distributed under the License is distributed on an \"AS IS\" BASIS,\n" -" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" -" * See the License for the specific language governing permissions and\n" -" * limitations under the License.\n" -" */\n" -"\n" -".set .L_TT_TYPE_BLOCK, 0x1\n" -".set .L_TT_TYPE_PAGE, 0x3\n" -".set .L_TT_TYPE_TABLE, 0x3\n" -"\n" -"/* Access flag. */\n" -".set .L_TT_AF, 0x1 << 10\n" -"/* Not global. */\n" -".set .L_TT_NG, 0x1 << 11\n" -".set .L_TT_XN, 0x3 << 53\n" -"\n" -".set .L_TT_MT_DEV, 0x0 << 2\t\t\t// MAIR #0 (DEV_nGnRE)\n" -".set .L_TT_MT_MEM, (0x1 << 2) | (0x3 << 8)\t// MAIR #1 (MEM_WBWA), inner " -"shareable\n" -"\n" -".set .L_BLOCK_DEV, .L_TT_TYPE_BLOCK | .L_TT_MT_DEV | .L_TT_AF | .L_TT_XN\n" -".set .L_BLOCK_MEM, .L_TT_TYPE_BLOCK | .L_TT_MT_MEM | .L_TT_AF | .L_TT_NG\n" -"\n" -".section \".rodata.idmap\", \"a\", %progbits\n" -".global idmap\n" -".align 12\n" -"idmap:\n" -"\t/* level 1 */\n" -"\t.quad\t\t.L_BLOCK_DEV | 0x0\t\t // 1 GiB of device mappings\n" -"\t.quad\t\t.L_BLOCK_MEM | 0x40000000\t// 1 GiB of DRAM\n" -"\t.fill\t\t254, 8, 0x0\t\t\t// 254 GiB of unmapped VA space\n" -"\t.quad\t\t.L_BLOCK_DEV | 0x4000000000 // 1 GiB of device mappings\n" -"\t.fill\t\t255, 8, 0x0\t\t\t// 255 GiB of remaining VA space\n" -"```" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "_image.ld_ (you shouldn't need to change this):" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "" -"```ld\n" -"/*\n" -" * Copyright 2023 Google LLC\n" -" *\n" -" * Licensed under the Apache License, Version 2.0 (the \"License\");\n" -" * you may not use this file except in compliance with the License.\n" -" * You may obtain a copy of the License at\n" -" *\n" -" * https://www.apache.org/licenses/LICENSE-2.0\n" -" *\n" -" * Unless required by applicable law or agreed to in writing, software\n" -" * distributed under the License is distributed on an \"AS IS\" BASIS,\n" -" * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" -" * See the License for the specific language governing permissions and\n" -" * limitations under the License.\n" -" */\n" -"\n" -"/*\n" -" * Code will start running at this symbol which is placed at the start of " -"the\n" -" * image.\n" -" */\n" -"ENTRY(entry)\n" -"\n" -"MEMORY\n" -"{\n" -"\timage : ORIGIN = 0x40080000, LENGTH = 2M\n" -"}\n" -"\n" -"SECTIONS\n" -"{\n" -"\t/*\n" -"\t * Collect together the code.\n" -"\t */\n" -"\t.init : ALIGN(4096) {\n" -"\t\ttext_begin = .;\n" -"\t\t*(.init.entry)\n" -"\t\t*(.init.*)\n" -"\t} >image\n" -"\t.text : {\n" -"\t\t*(.text.*)\n" -"\t} >image\n" -"\ttext_end = .;\n" -"\n" -"\t/*\n" -"\t * Collect together read-only data.\n" -"\t */\n" -"\t.rodata : ALIGN(4096) {\n" -"\t\trodata_begin = .;\n" -"\t\t*(.rodata.*)\n" -"\t} >image\n" -"\t.got : {\n" -"\t\t*(.got)\n" -"\t} >image\n" -"\trodata_end = .;\n" -"\n" -"\t/*\n" -"\t * Collect together the read-write data including .bss at the end which\n" -"\t * will be zero'd by the entry code.\n" -"\t */\n" -"\t.data : ALIGN(4096) {\n" -"\t\tdata_begin = .;\n" -"\t\t*(.data.*)\n" -"\t\t/*\n" -"\t\t * The entry point code assumes that .data is a multiple of 32\n" -"\t\t * bytes long.\n" -"\t\t */\n" -"\t\t. = ALIGN(32);\n" -"\t\tdata_end = .;\n" -"\t} >image\n" -"\n" -"\t/* Everything beyond this point will not be included in the binary. */\n" -"\tbin_end = .;\n" -"\n" -"\t/* The entry point code assumes that .bss is 16-byte aligned. */\n" -"\t.bss : ALIGN(16) {\n" -"\t\tbss_begin = .;\n" -"\t\t*(.bss.*)\n" -"\t\t*(COMMON)\n" -"\t\t. = ALIGN(16);\n" -"\t\tbss_end = .;\n" -"\t} >image\n" -"\n" -"\t.stack (NOLOAD) : ALIGN(4096) {\n" -"\t\tboot_stack_begin = .;\n" -"\t\t. += 40 * 4096;\n" -"\t\t. = ALIGN(4096);\n" -"\t\tboot_stack_end = .;\n" -"\t} >image\n" -"\n" -"\t. = ALIGN(4K);\n" -"\tPROVIDE(dma_region = .);\n" -"\n" -"\t/*\n" -"\t * Remove unused sections from the image.\n" -"\t */\n" -"\t/DISCARD/ : {\n" -"\t\t/* The image loads itself so doesn't need these sections. */\n" -"\t\t*(.gnu.hash)\n" -"\t\t*(.hash)\n" -"\t\t*(.interp)\n" -"\t\t*(.eh_frame_hdr)\n" -"\t\t*(.eh_frame)\n" -"\t\t*(.note.gnu.build-id)\n" -"\t}\n" -"}\n" -"```" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "_Makefile_ (you shouldn't need to change this):" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "# Copyright 2023 Google LLC" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "$(shell uname -s)" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "aarch64-linux-gnu" -msgstr "aarch64-paging" - -#: src/exercises/bare-metal/rtc.md -msgid "stdio -display none -kernel $< -s" -msgstr "" - -#: src/exercises/bare-metal/rtc.md -msgid "cargo clean" -msgstr "" - #: src/exercises/bare-metal/rtc.md msgid "Run the code in QEMU with `make qemu`." msgstr "" @@ -17002,6 +16908,10 @@ msgstr "" msgid "_main.rs_:" msgstr "" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Base addresses of the GICv3.\n" +msgstr "" + #: src/exercises/bare-metal/solutions-afternoon.md msgid "/// Base address of the PL031 RTC.\n" msgstr "" @@ -17010,6 +16920,17 @@ msgstr "" msgid "/// The IRQ used by the PL031 RTC.\n" msgstr "" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "\"main({:#x}, {:#x}, {:#x}, {:#x})\"" +msgstr "" + +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "" +"// Safe because `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 "" + #: src/exercises/bare-metal/solutions-afternoon.md msgid "" "// Safe because `PL031_BASE_ADDRESS` is the base address of a PL031 device,\n" @@ -17601,7 +17522,7 @@ msgid "Let us see `Arc` and `Mutex` in action:" msgstr "" #: src/concurrency/shared_state/example.md -msgid "// use std::sync::{Arc, Mutex};\n" +msgid "// use std::sync::{Arc, Mutex};" msgstr "" #: src/concurrency/shared_state/example.md @@ -17675,10 +17596,17 @@ msgstr "" #: src/exercises/concurrency/dining-philosophers.md #: src/exercises/concurrency/dining-philosophers-async.md -msgid "" -"// left_fork: ...\n" -" // right_fork: ...\n" -" // thoughts: ...\n" +msgid "// left_fork: ..." +msgstr "" + +#: src/exercises/concurrency/dining-philosophers.md +#: src/exercises/concurrency/dining-philosophers-async.md +msgid "// right_fork: ..." +msgstr "" + +#: src/exercises/concurrency/dining-philosophers.md +#: src/exercises/concurrency/dining-philosophers-async.md +msgid "// thoughts: ..." msgstr "" #: src/exercises/concurrency/dining-philosophers.md @@ -17689,9 +17617,7 @@ msgid "\"Eureka! {} has a new idea!\"" msgstr "" #: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Pick up forks...\n" +msgid "// Pick up forks..." msgstr "" #: src/exercises/concurrency/dining-philosophers.md @@ -17738,24 +17664,21 @@ msgstr "" #: src/exercises/concurrency/dining-philosophers.md #: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Create forks\n" +msgid "// Create forks" msgstr "" #: src/exercises/concurrency/dining-philosophers.md #: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Create philosophers\n" +msgid "// Create philosophers" msgstr "" #: src/exercises/concurrency/dining-philosophers.md -msgid "// Make each of them think and eat 100 times\n" +msgid "// Make each of them think and eat 100 times" msgstr "" #: src/exercises/concurrency/dining-philosophers.md #: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Output their thoughts\n" +msgid "// Output their thoughts" msgstr "" #: src/exercises/concurrency/dining-philosophers.md @@ -18558,17 +18481,19 @@ msgid "" msgstr "" #: src/async/pitfalls/pin.md -msgid "" -"// A work item. In this case, just sleep for the given time and respond\n" -"// with a message on the `respond_on` channel.\n" +msgid "// A work item. In this case, just sleep for the given time and respond" msgstr "" #: src/async/pitfalls/pin.md -msgid "// A worker which listens for work on a queue and performs it.\n" +msgid "// with a message on the `respond_on` channel." msgstr "" #: src/async/pitfalls/pin.md -msgid "// Pretend to work.\n" +msgid "// A worker which listens for work on a queue and performs it." +msgstr "" + +#: src/async/pitfalls/pin.md +msgid "// Pretend to work." msgstr "" #: src/async/pitfalls/pin.md @@ -18576,11 +18501,11 @@ msgid "\"failed to send response\"" msgstr "" #: src/async/pitfalls/pin.md -msgid "// TODO: report number of iterations every 100ms\n" +msgid "// TODO: report number of iterations every 100ms" msgstr "" #: src/async/pitfalls/pin.md -msgid "// A requester which requests work and waits for it to complete.\n" +msgid "// A requester which requests work and waits for it to complete." msgstr "" #: src/async/pitfalls/pin.md @@ -18760,7 +18685,7 @@ msgid "" msgstr "" #: src/async/pitfalls/cancellation.md -msgid "// prefix buf and bytes with self.\n" +msgid "// prefix buf and bytes with self." msgstr "" #: src/async/pitfalls/cancellation.md @@ -18821,8 +18746,11 @@ msgid "" msgstr "" #: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Make them think and eat\n" +msgid "// Keep trying until we have both forks" +msgstr "" + +#: src/exercises/concurrency/dining-philosophers-async.md +msgid "// Make them think and eat" msgstr "" #: src/exercises/concurrency/dining-philosophers-async.md @@ -18891,7 +18819,7 @@ msgid "" "[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 = { version = \"1.36.0\", features = [\"full\"] }\n" "tokio-websockets = { version = \"0.5.1\", features = [\"client\", " "\"fastrand\", \"server\", \"sha1_smol\"] }\n" "```" @@ -18963,7 +18891,7 @@ msgid "_src/bin/server.rs_:" msgstr "" #: src/exercises/concurrency/chat-app.md -msgid "// TODO: For a hint, see the description of the task below.\n" +msgid "// TODO: For a hint, see the description of the task below." msgstr "" #: src/exercises/concurrency/chat-app.md @@ -19046,10 +18974,24 @@ msgstr "" msgid "([back to exercise](dining-philosophers-async.md))" msgstr "" +#: src/exercises/concurrency/solutions-afternoon.md +msgid "// Keep trying until we have both forks\n" +msgstr "" + +#: src/exercises/concurrency/solutions-afternoon.md +msgid "// Pick up forks...\n" +msgstr "" + #: src/exercises/concurrency/solutions-afternoon.md msgid "" -"// Add a delay before picking the second fork to allow the execution\n" -" // to transfer to another task\n" +"// 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 "" + +#: src/exercises/concurrency/solutions-afternoon.md +msgid "" +"// If we didn't get the right fork, drop the left fork and let\n" +" // other tasks make progress.\n" msgstr "" #: src/exercises/concurrency/solutions-afternoon.md @@ -19057,16 +18999,25 @@ msgid "// The locks are dropped here\n" msgstr "" #: src/exercises/concurrency/solutions-afternoon.md -msgid "" -"// To avoid a deadlock, we have to break the symmetry\n" -" // somewhere. This will swap the forks without deinitializing\n" -" // either of them.\n" +msgid "// Create forks\n" +msgstr "" + +#: src/exercises/concurrency/solutions-afternoon.md +msgid "// Create philosophers\n" msgstr "" #: src/exercises/concurrency/solutions-afternoon.md msgid "// tx is dropped here, so we don't need to explicitly drop it later\n" msgstr "" +#: src/exercises/concurrency/solutions-afternoon.md +msgid "// Make them think and eat\n" +msgstr "" + +#: src/exercises/concurrency/solutions-afternoon.md +msgid "// Output their thoughts\n" +msgstr "" + #: src/exercises/concurrency/solutions-afternoon.md msgid "\"Here is a thought: {thought}\"" msgstr "" @@ -19422,7 +19373,7 @@ msgstr "" #: src/glossary.md msgid "" "Rust Fundamentals: \n" -"Days 1 to 3 of this course." +"Days 1 to 4 of this course." msgstr "" #: src/glossary.md @@ -19753,6 +19704,22 @@ msgid "" "directory for details, including the license terms." msgstr "" +#~ msgid "Much of the Rust syntax will be familiar to you from C, C++ or Java:" +#~ msgstr "" +#~ "C, C++ or Java āĻĨā§‡āĻ•ā§‡ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ°āĻžāĻ¸ā§āĻŸ āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•ā§āĻ¸ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻŽāĻ¨ā§‡ āĻšāĻŦā§‡āĻƒ" + +#, fuzzy +#~ msgid "\"aarch64-linux-gnu\"" +#~ msgstr "aarch64-paging" + +#, fuzzy +#~ msgid "\"exceptions.S\"" +#~ msgstr "āĻŦā§āĻ¯āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ" + +#, fuzzy +#~ msgid "aarch64-linux-gnu" +#~ msgstr "aarch64-paging" + #~ msgid "Small Example" #~ msgstr "āĻ›ā§‹āĻŸā§āĻŸ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ" @@ -19780,9 +19747,6 @@ msgstr "" #~ msgid "Arrays and for Loops" #~ msgstr "Arrays āĻāĻŦāĻ‚ for-Loops" -#~ msgid "if expressions" -#~ msgstr "if āĻāĻ•ā§āĻ¸āĻĒā§āĻ°ā§‡āĻļāĻ¨" - #~ msgid "for expressions" #~ msgstr "for āĻāĻ•ā§āĻ¸āĻĒā§āĻ°ā§‡āĻļāĻ¨"