From c226366d2c3a4e24defe28a8a5a461a1e3be3909 Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 01/15] Initial localization commit --- cards/add.svg.import | 1 + cards/bisect-bad.svg.import | 1 + cards/bisect-good.svg.import | 1 + cards/bisect-start.svg.import | 1 + cards/branch-delete.svg.import | 1 + cards/branch.svg.import | 1 + cards/checkout-file.svg.import | 1 + cards/checkout-from.svg.import | 1 + cards/checkout.svg.import | 1 + cards/cherry-pick.svg.import | 1 + cards/clone.svg.import | 1 + cards/commit-a.svg.import | 1 + cards/commit-auto.svg.import | 1 + cards/commit.svg.import | 1 + cards/fetch.svg.import | 1 + cards/file-copy.svg.import | 1 + cards/file-delete.svg.import | 1 + cards/file-new.svg.import | 1 + cards/file-rename.svg.import | 1 + cards/init.svg.import | 1 + cards/merge-abort.svg.import | 1 + cards/merge.svg.import | 1 + cards/pull.svg.import | 1 + cards/push.svg.import | 1 + cards/rebase-continue.svg.import | 1 + cards/rebase-interactive.svg.import | 1 + cards/rebase.svg.import | 1 + cards/reflog.svg.import | 1 + cards/reset-file.svg.import | 1 + cards/reset-hard.svg.import | 1 + cards/reset.svg.import | 1 + cards/revert.svg.import | 1 + cards/rm.svg.import | 1 + cards/show.svg.import | 1 + fonts/Moderustic-VariableFont_wght.ttf | Bin 0 -> 265568 bytes fonts/default.tres | 2 +- images/cli-badge.svg.import | 1 + images/commit.svg.import | 1 + images/conflict.svg.import | 1 + images/file.svg.import | 1 + images/head.svg.import | 1 + images/modified.svg.import | 1 + images/new.svg.import | 1 + images/oh-my-git.png.import | 1 + images/ref.svg.import | 1 + images/remote.svg.import | 1 + images/removed.svg.import | 1 + images/string.svg.import | 1 + images/untracked.svg.import | 1 + levels/bisect/bisect | 16 +- levels/branches/branch-create | 14 +- levels/branches/branch-remove | 10 +- levels/branches/checkout-commit | 10 +- levels/branches/fork | 16 +- levels/branches/grow | 12 +- levels/branches/reorder | 22 +- levels/changing-the-past/rebase | 14 +- levels/changing-the-past/reorder | 12 +- levels/files/files-add | 17 +- levels/files/files-delete | 13 +- levels/index/add | 14 +- levels/index/change | 12 +- levels/index/checkout | 8 +- levels/index/compare | 10 +- levels/index/new | 14 +- levels/index/reset | 14 +- levels/index/rm | 8 +- levels/index/steps | 14 +- levels/intro/cli | 10 +- levels/intro/commit | 14 +- levels/intro/copies | 14 +- levels/intro/init | 12 +- levels/intro/remote | 14 +- levels/intro/risky | 16 +- levels/intro/who-are-you | 14 +- levels/low-level/basics | 13 +- levels/low-level/blob-create | 18 +- levels/low-level/blob-remove | 10 +- levels/low-level/commit-create | 10 +- levels/low-level/commit-parents | 8 +- levels/low-level/commit-rhombus | 8 +- levels/low-level/index-add | 21 +- levels/low-level/index-remove | 6 +- levels/low-level/index-update | 12 +- levels/low-level/puzzle-apocalypse | 7 +- levels/low-level/puzzle-precious-blob | 2 +- .../low-level/puzzle-trees-all-the-way-down | 8 +- levels/low-level/ref-create | 10 +- levels/low-level/ref-move | 6 +- levels/low-level/ref-remove | 6 +- levels/low-level/symref-create | 8 +- levels/low-level/symref-no-deref | 22 +- levels/low-level/tree-create | 12 +- levels/low-level/tree-nested | 6 +- levels/low-level/tree-read | 8 +- levels/low-level/welcome | 16 +- levels/merge/conflict | 14 +- levels/merge/merge | 10 +- levels/merge/merge-abort | 16 +- levels/remotes/friend | 10 +- levels/remotes/problems | 6 +- levels/sandbox/empty | 4 +- levels/sandbox/remote | 6 +- levels/sandbox/three-commits | 10 +- levels/shit-happens/bad-commit | 17 +- levels/shit-happens/pushed-something-broken | 4 +- levels/shit-happens/reflog | 12 +- levels/shit-happens/restore-a-file | 8 +- .../shit-happens/restore-a-file-from-the-past | 8 +- levels/stash/stash | 18 +- levels/stash/stash-branch | 20 +- levels/stash/stash-clear | 23 +- levels/stash/stash-merge | 21 +- levels/stash/stash-pop | 18 +- levels/tags/add-tag | 23 +- levels/tags/add-tag-later | 20 +- levels/tags/remote-tag | 22 +- levels/tags/remove-tag | 19 +- levels/unused/checkout | 8 +- levels/unused/clone | 4 +- levels/unused/commit | 10 +- levels/unused/commit-a | 10 +- levels/unused/fetch | 12 +- levels/unused/files-move | 12 +- levels/unused/index-mv | 10 +- levels/unused/init | 4 +- levels/unused/pull-push | 12 +- levels/unused/remotes-add | 18 +- levels/unused/remotes-delete | 10 +- levels/unused/restore | 8 +- levels/unused/split | 4 +- levels/unused/steps | 6 +- levels/unused/who-are-you | 11 +- levels/workflows/gitignore | 6 +- levels/workflows/pr | 4 +- nodes/blob.svg.import | 1 + nodes/commit.svg.import | 1 + nodes/document.svg.import | 1 + nodes/head.svg.import | 1 + nodes/head1.svg.import | 1 + nodes/head2.svg.import | 1 + nodes/head3.svg.import | 1 + nodes/pop.wav.import | 4 +- nodes/ref.svg.import | 1 + nodes/tree.svg.import | 1 + project.godot | 12 +- resources/cards.json | 74 +- scenes/arrow.tscn | 4 +- scenes/card.gd | 2 +- scenes/card.tscn | 4 +- scenes/cards.tscn | 4 +- scenes/file_browser.tscn | 13 +- scenes/file_browser_item.tscn | 2 +- scenes/game.gd | 51 ++ scenes/level.gd | 36 +- scenes/level_select.tscn | 6 +- scenes/main.tscn | 20 +- scenes/music_button.tscn | 14 +- scenes/no_git.tscn | 10 +- scenes/node.tscn | 2 +- scenes/notification.tscn | 4 +- scenes/repository.tscn | 8 +- scenes/survey.tscn | 8 +- scenes/terminal.tscn | 6 +- scenes/text_editor.tscn | 4 +- scenes/title.tscn | 31 +- scenes/translator.gd | 16 + scripts/translator.gd | 20 + sounds/buzzer.wav.import | 4 +- sounds/poof.wav.import | 4 +- sounds/success.wav.import | 4 +- sounds/swish.wav.import | 4 +- sounds/swoosh.wav.import | 4 +- sounds/typewriter_ding.wav.import | 4 +- styles/theme.tres | 18 +- tr_localization.py | 166 ++++ translations.csv | 808 ++++++++++++++++++ translations.csv.import | 16 + translations.en.translation | Bin 0 -> 31293 bytes translations.ru.translation | Bin 0 -> 9648 bytes 180 files changed, 1592 insertions(+), 872 deletions(-) create mode 100644 fonts/Moderustic-VariableFont_wght.ttf create mode 100644 scenes/translator.gd create mode 100644 scripts/translator.gd create mode 100644 tr_localization.py create mode 100644 translations.csv create mode 100644 translations.csv.import create mode 100644 translations.en.translation create mode 100644 translations.ru.translation diff --git a/cards/add.svg.import b/cards/add.svg.import index cca96963..4ec91074 100644 --- a/cards/add.svg.import +++ b/cards/add.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/bisect-bad.svg.import b/cards/bisect-bad.svg.import index c2afba5d..a23974fb 100644 --- a/cards/bisect-bad.svg.import +++ b/cards/bisect-bad.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/bisect-good.svg.import b/cards/bisect-good.svg.import index 50f3eefa..eccfb466 100644 --- a/cards/bisect-good.svg.import +++ b/cards/bisect-good.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/bisect-start.svg.import b/cards/bisect-start.svg.import index cd672e14..f58b103b 100644 --- a/cards/bisect-start.svg.import +++ b/cards/bisect-start.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/branch-delete.svg.import b/cards/branch-delete.svg.import index 6277fe4c..385e0b99 100644 --- a/cards/branch-delete.svg.import +++ b/cards/branch-delete.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/branch.svg.import b/cards/branch.svg.import index ff2d5b89..f0a165e1 100644 --- a/cards/branch.svg.import +++ b/cards/branch.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/checkout-file.svg.import b/cards/checkout-file.svg.import index a960142c..10b175cc 100644 --- a/cards/checkout-file.svg.import +++ b/cards/checkout-file.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/checkout-from.svg.import b/cards/checkout-from.svg.import index 2892f47f..7e6160ea 100644 --- a/cards/checkout-from.svg.import +++ b/cards/checkout-from.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/checkout.svg.import b/cards/checkout.svg.import index 895efd60..ba8c88a9 100644 --- a/cards/checkout.svg.import +++ b/cards/checkout.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/cherry-pick.svg.import b/cards/cherry-pick.svg.import index 35491837..1c88964e 100644 --- a/cards/cherry-pick.svg.import +++ b/cards/cherry-pick.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/clone.svg.import b/cards/clone.svg.import index 1f894b7f..6fa25e0b 100644 --- a/cards/clone.svg.import +++ b/cards/clone.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/commit-a.svg.import b/cards/commit-a.svg.import index d514e295..be711b0a 100644 --- a/cards/commit-a.svg.import +++ b/cards/commit-a.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/commit-auto.svg.import b/cards/commit-auto.svg.import index 51e7cfd0..4f561ca7 100644 --- a/cards/commit-auto.svg.import +++ b/cards/commit-auto.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/commit.svg.import b/cards/commit.svg.import index 613bc093..1e1535b3 100644 --- a/cards/commit.svg.import +++ b/cards/commit.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/fetch.svg.import b/cards/fetch.svg.import index 3c65896a..80da7341 100644 --- a/cards/fetch.svg.import +++ b/cards/fetch.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/file-copy.svg.import b/cards/file-copy.svg.import index ebd39cbc..f5c94052 100644 --- a/cards/file-copy.svg.import +++ b/cards/file-copy.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/file-delete.svg.import b/cards/file-delete.svg.import index 9c9d9da1..942334e4 100644 --- a/cards/file-delete.svg.import +++ b/cards/file-delete.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/file-new.svg.import b/cards/file-new.svg.import index 968c8004..334d7a15 100644 --- a/cards/file-new.svg.import +++ b/cards/file-new.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/file-rename.svg.import b/cards/file-rename.svg.import index 79f12610..ca2d82c6 100644 --- a/cards/file-rename.svg.import +++ b/cards/file-rename.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/init.svg.import b/cards/init.svg.import index aacb273f..dedbfe6d 100644 --- a/cards/init.svg.import +++ b/cards/init.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/merge-abort.svg.import b/cards/merge-abort.svg.import index cbdf0a87..4a919d2d 100644 --- a/cards/merge-abort.svg.import +++ b/cards/merge-abort.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/merge.svg.import b/cards/merge.svg.import index b96f40d6..a83da3df 100644 --- a/cards/merge.svg.import +++ b/cards/merge.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/pull.svg.import b/cards/pull.svg.import index 15ab40da..e792f8f9 100644 --- a/cards/pull.svg.import +++ b/cards/pull.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/push.svg.import b/cards/push.svg.import index aa6a9ff0..e191ead5 100644 --- a/cards/push.svg.import +++ b/cards/push.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/rebase-continue.svg.import b/cards/rebase-continue.svg.import index 4276f0a1..41f5eda8 100644 --- a/cards/rebase-continue.svg.import +++ b/cards/rebase-continue.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/rebase-interactive.svg.import b/cards/rebase-interactive.svg.import index a65c3156..ebe06246 100644 --- a/cards/rebase-interactive.svg.import +++ b/cards/rebase-interactive.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/rebase.svg.import b/cards/rebase.svg.import index 97241e1b..460096ae 100644 --- a/cards/rebase.svg.import +++ b/cards/rebase.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/reflog.svg.import b/cards/reflog.svg.import index 17b81f71..00dcf26b 100644 --- a/cards/reflog.svg.import +++ b/cards/reflog.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/reset-file.svg.import b/cards/reset-file.svg.import index 883becfa..03dc0bd4 100644 --- a/cards/reset-file.svg.import +++ b/cards/reset-file.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/reset-hard.svg.import b/cards/reset-hard.svg.import index 199bee3d..103b70b6 100644 --- a/cards/reset-hard.svg.import +++ b/cards/reset-hard.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/reset.svg.import b/cards/reset.svg.import index 3409230d..0e43dc4f 100644 --- a/cards/reset.svg.import +++ b/cards/reset.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/revert.svg.import b/cards/revert.svg.import index 6f0bbfc0..6491f9cb 100644 --- a/cards/revert.svg.import +++ b/cards/revert.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/rm.svg.import b/cards/rm.svg.import index 2830052e..ab96873d 100644 --- a/cards/rm.svg.import +++ b/cards/rm.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/cards/show.svg.import b/cards/show.svg.import index 39cebac3..40f15049 100644 --- a/cards/show.svg.import +++ b/cards/show.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/fonts/Moderustic-VariableFont_wght.ttf b/fonts/Moderustic-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3e88190f4d82c01f32b994a8121d5e1646b1aac0 GIT binary patch literal 265568 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

qr+Z!fDoY|fI;YGISf|8Cw2m&lL}+R;w~rY@ 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%0AK;m!LglOiLJ+7o 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 literal 0 HcmV?d00001 diff --git a/fonts/default.tres b/fonts/default.tres index 1438e9a5..c4d53877 100644 --- a/fonts/default.tres +++ b/fonts/default.tres @@ -1,6 +1,6 @@ [gd_resource type="DynamicFont" load_steps=2 format=2] -[ext_resource path="res://fonts/cabin-regular.ttf" type="DynamicFontData" id=1] +[ext_resource path="res://fonts/Moderustic-VariableFont_wght.ttf" type="DynamicFontData" id=1] [resource] size = 23 diff --git a/images/cli-badge.svg.import b/images/cli-badge.svg.import index 53031f82..930d9988 100644 --- a/images/cli-badge.svg.import +++ b/images/cli-badge.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/commit.svg.import b/images/commit.svg.import index 54316cf6..fbf6f821 100644 --- a/images/commit.svg.import +++ b/images/commit.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/conflict.svg.import b/images/conflict.svg.import index 5053a2bd..63c961d9 100644 --- a/images/conflict.svg.import +++ b/images/conflict.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/file.svg.import b/images/file.svg.import index 12aa5dd7..49fd863f 100644 --- a/images/file.svg.import +++ b/images/file.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/head.svg.import b/images/head.svg.import index 2a5c3cfc..b92f7aaf 100644 --- a/images/head.svg.import +++ b/images/head.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/modified.svg.import b/images/modified.svg.import index a7356bb8..c8ba6f44 100644 --- a/images/modified.svg.import +++ b/images/modified.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/new.svg.import b/images/new.svg.import index 4b017670..1218f0e5 100644 --- a/images/new.svg.import +++ b/images/new.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/oh-my-git.png.import b/images/oh-my-git.png.import index 708ee152..a173ad8b 100644 --- a/images/oh-my-git.png.import +++ b/images/oh-my-git.png.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/ref.svg.import b/images/ref.svg.import index 480c664e..1b179aea 100644 --- a/images/ref.svg.import +++ b/images/ref.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/remote.svg.import b/images/remote.svg.import index 762dcebb..7c90ac0b 100644 --- a/images/remote.svg.import +++ b/images/remote.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/removed.svg.import b/images/removed.svg.import index 1e0dd8a2..104b392e 100644 --- a/images/removed.svg.import +++ b/images/removed.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/string.svg.import b/images/string.svg.import index 97a8d20c..53ec0cd0 100644 --- a/images/string.svg.import +++ b/images/string.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/images/untracked.svg.import b/images/untracked.svg.import index 95cb7008..ab65e26c 100644 --- a/images/untracked.svg.import +++ b/images/untracked.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/levels/bisect/bisect b/levels/bisect/bisect index cf7bf6a9..b3666708 100644 --- a/levels/bisect/bisect +++ b/levels/bisect/bisect @@ -1,17 +1,9 @@ -title = Yellow brick road +title = bisect_title_261 cards = checkout commit-auto reset-hard bisect-start bisect-good bisect-bad [description] -(Please zoom out a bit using your mouse wheel! :D) - -Oh no! You have lost your key at some point during the day! - -Sure, you could look at every single commit in an attempt to find it - but there's a better way: your time machine has a built-in way to find the point in time where things went wrong quickly! - -First, play the "bisect start" card. Then, go to a commit where you don't have the key, and play the "bisect bad" card. Likewise, go to a commit early on where you have the key *in your pocket*, and play the "bisect good" card. - -After you've found the last good commit, reset the main branch to it. What happened to the key after you lost it? +bisect_description_262 [setup] @@ -35,9 +27,9 @@ done [win] -# Find the last good commit +# bisect_win_hint_264 test "$(git log --pretty=%s main | head -1)" -eq 11 [congrats] -Well done! :) The only problem is that you now have to walk all the way back home, again... +bisect_congrats_263 diff --git a/levels/branches/branch-create b/levels/branches/branch-create index 110d9291..2941736e 100644 --- a/levels/branches/branch-create +++ b/levels/branches/branch-create @@ -1,11 +1,9 @@ -title = Creating branches +title = branchcreate_title_089 cards = checkout commit-auto branch branch-delete reset-hard [description] -You were invited to two parties! At one of them, your favorite band is playing - and the other one is your best friend's birthday party. Where should you go? No worries - as a time travel agent in training, you can go to both parties! - -To make it easier to tell which timeline is which, you can create time portals! (We call these "branches".) +branchcreate_description_090 [cli] @@ -31,14 +29,12 @@ git branch -D main [win] -# Create a branch called 'birthday' that points to the birthday timeline. +# branchcreate_win_hint_092 git show birthday | grep 'to the birthday' -# Create a branch called 'concert' that points to the concert timeline. +# branchcreate_win_hint_093 git show concert | grep 'to the concert' [congrats] -Now you can travel between those branches easily (using `git checkout`) - try it! - -Your friend is happy that you made it to the birthday party and you also got your concert ticket signed. Yay! +branchcreate_congrats_091 diff --git a/levels/branches/branch-remove b/levels/branches/branch-remove index 3b576e0f..373261ba 100644 --- a/levels/branches/branch-remove +++ b/levels/branches/branch-remove @@ -1,11 +1,9 @@ -title = Deleting branches +title = branchremove_title_108 cards = checkout commit-auto reset-hard branch-delete [description] -Life is full of dangers, right? Even when walking to school, it seems like there's a lot of risks! - -This Monday is especially bad. You made it to school, but there's some timelines you definitely don't want to keep around. +branchremove_description_109 [setup] @@ -39,9 +37,9 @@ git checkout leap^^ [win] -# Find the bad branches and delete them. Keep only the best one. +# branchremove_win_hint_111 test "$(git show-ref --heads | cut -f2 -d' ')" = "$(echo refs/heads/leap)" [congrats] -On second thought, maybe you even prefer the ice cream timeline to the main one? :) +branchremove_congrats_110 diff --git a/levels/branches/checkout-commit b/levels/branches/checkout-commit index fdcb0caa..d3f336de 100644 --- a/levels/branches/checkout-commit +++ b/levels/branches/checkout-commit @@ -1,11 +1,9 @@ -title = Moving through time +title = checkoutcommit_title_085 cards = checkout commit-auto [description] -The yellow boxes are frozen points in time, we call them "commits"! You can travel between them using the "checkout" card! (Try it!) - -Can you find out what happened here? Then, while on the last commit, edit the files to fix the problem, and make a new commit! +checkoutcommit_description_086 [cli] @@ -35,9 +33,9 @@ git branch -df main [win] -# Restore sisterly peace. +# checkoutcommit_win_hint_088 { git show HEAD:piggy_bank | grep "10 coins"; } && { test $(git show HEAD:little_sister | wc -l) -eq $(git show HEAD:little_sister | grep -v "10 coins" | wc -l); } && { git rev-parse HEAD^^^; } [congrats] -Wonderful! Now that you're getting familiar with the time machine, let's look at some more complicated situations... +checkoutcommit_congrats_087 diff --git a/levels/branches/fork b/levels/branches/fork index a58dcf5a..340ee5db 100644 --- a/levels/branches/fork +++ b/levels/branches/fork @@ -1,11 +1,9 @@ -title = Make parallel commits +title = fork_title_103 cards = checkout commit-auto [description] -Did you know that creating parallel timelines is perfectly legal and safe? It's true! - -Can you find out when things went wrong in this zoo? Then, go back to the last good commit and create a parallel universe where everyone is happy! +fork_description_104 [cli] @@ -50,16 +48,12 @@ git branch -d main [win] -# Make sure that the child is happy. +# fork_win_hint_106 git ls-tree --name-only -r HEAD | grep child -# Make sure that the lion gets something to eat. +# fork_win_hint_107 git show HEAD:cage/lion | grep -v "very hungry" [congrats] -Whew, good job! This seems like a *much* better outcome. - -Feel free to add more parallel timelines, or make them longer. - -If you're ready, our next mission is already waiting... +fork_congrats_105 diff --git a/levels/branches/grow b/levels/branches/grow index 77fe3608..9b9f3c54 100644 --- a/levels/branches/grow +++ b/levels/branches/grow @@ -1,13 +1,9 @@ -title = Branches grow with you! +title = grow_title_094 cards = checkout commit-auto branch branch-delete reset-hard [description] -Note that there are two options to "travel to the end of a timeline": - -First, you can directly travel to the commit, like we've done it before. - -And second, you can travel to the branch label. In this case, when you make a new commit, the branch will grow with you, and still point at the end of the timeline! +grow_description_095 [cli] @@ -37,7 +33,7 @@ git branch -D main [win] -# Travel directly to the last yellow commit of the birthday timeline, make a change to 'you', and make a commit +# grow_win_hint_096 for commit in $(git cat-file --batch-check='%(objectname) %(objecttype)' --batch-all-objects | grep 'commit$' | cut -f1 -d' '); do if test $(git rev-parse $commit^) = $(git rev-parse birthday); then return 0 @@ -45,5 +41,5 @@ for commit in $(git cat-file --batch-check='%(objectname) %(objecttype)' --batch done return 1 -# Travel to the blue 'concert' branch, make a change to 'you', and a commit. +# grow_win_hint_097 git show concert^ | grep "Go to the concert" diff --git a/levels/branches/reorder b/levels/branches/reorder index 1c36c089..7de933ee 100644 --- a/levels/branches/reorder +++ b/levels/branches/reorder @@ -1,21 +1,9 @@ -title = Moving branches around +title = reorder_title_098 cards = checkout commit-auto merge reset-hard [description] -One of your colleagues messed up here, and put the branches in the wrong timelines! - -You could delete and re-create these branches - but you can also directly move them to different commits, by using - - git checkout - -on the branch names, and then using - - git reset --hard - -on the commit where you want the branch to be. - -The donut branch is in the right place, but the timeline is still incomplete - make you actually *eat* the donut in that branch! +reorder_description_099 [setup] @@ -75,13 +63,13 @@ git checkout --detach main [win] -# Did you eat a baguette on the baguette branch? +# reorder_win_hint_100 git show baguette:you | grep "You ate.*baguette" -# Did you drink a coffee on the coffee branch? +# reorder_win_hint_101 git show coffee:you | grep "You drank.*coffee" -# Did you eat a donut on the donut branch? +# reorder_win_hint_102 git show donut:you | grep "You ate.*donut" [actions] diff --git a/levels/changing-the-past/rebase b/levels/changing-the-past/rebase index 6ed89a8f..c89742fd 100644 --- a/levels/changing-the-past/rebase +++ b/levels/changing-the-past/rebase @@ -1,13 +1,9 @@ -title = Rebasing +title = rebase_title_253 cards = checkout commit-auto reset-hard rebase [description] -Okay - turns out that saving time in the morning by utilizing parallel universes is against the regulations of the International Time Travel Association. You'll have to do your tasks in sequence after all. - -See the "rebase" card? When you drag it to a commit, it will copy the events in your current timeline after the specified one! This way, make a clean, linear timeline where you visit all three shops. - -Again, we want to make that our base reality - the "main" branch should point to that timeline! +rebase_description_254 [setup] @@ -76,11 +72,9 @@ git checkout --detach main [win] -# Order all tree branches into one and move the main branch ref +# rebase_win_hint_256 { git show main:you | grep "You ate.*baguette"; } && { git show main:you | grep "You drank.*coffee"; } && { git show main:you | grep "You ate.*donut"; } && { test "$(git log main --oneline | wc -l)" -eq 7; } [congrats] -Notice how the other timelines and commits are still there - if anything goes wrong, you can also travel back to them. - -It's really hard to actually *destroy* stuff with your time machine. +rebase_congrats_255 diff --git a/levels/changing-the-past/reorder b/levels/changing-the-past/reorder index 04f66cbe..6a0ce74a 100644 --- a/levels/changing-the-past/reorder +++ b/levels/changing-the-past/reorder @@ -1,13 +1,9 @@ -title = Reordering events +title = reorder_title_257 cards = checkout commit-auto reset-hard rebase-interactive cherry-pick [description] -Oops, looks like there's something messed up here. Can you put the events back into their correct order? - -There are two ways to do this: You can drag the "interactive rebase" card to the commit before the one you want to change, then reorder the lines in the file that opens, and save it. - -Or you can reset the main tag to the very first commit, and then cherry-pick single commits in the order you want. You have cards for both approaches! +reorder_description_258 [setup] @@ -70,9 +66,9 @@ git commit -am "Put on shirt" [win] -# Reorder the commits to dress yourself in the correct way +# reorder_win_hint_260 { git log main --oneline | perl -0777 -ne'exit(1) if not /shoes[\s\S]*pants[\s\S]*underwear/'; } && { test "$(git log main --oneline | wc -l)" -eq 5; } [congrats] -Feel free to reset the level and try the other strategy! Which one do you like better? +reorder_congrats_259 diff --git a/levels/files/files-add b/levels/files/files-add index 0676df69..acc87851 100644 --- a/levels/files/files-add +++ b/levels/files/files-add @@ -1,16 +1,9 @@ -title = Interior design +title = filesadd_title_248 cards = file-new file-delete [description] -Now that your room looks tidy, you can start to unpack your stuff. You brought two new pieces of furniture with you and with a bright smile, -you see that their colors match the color of your bed! - -Build up your two pieces of furniture by playing the touch card. -Then name your furniture - you can choose whatever you like. - -Make sure the colors match! You can find the bed's color in its description. -Don't forget to add a color and description to your new furnitures, too! +filesadd_description_249 [setup] @@ -18,15 +11,15 @@ echo A yellow cozy bed. > bed [win] -# Add two more pieces of furniture +# filesadd_win_hint_251 NUM_FILES="$(ls | wc -l)" test "$NUM_FILES" -ge 3 -# Make sure the colors match your bed's color. +# filesadd_win_hint_252 NUM_FILES="$(ls | wc -l)" YELLOW_FILES="$(grep -li yellow * | wc -l)" test "$NUM_FILES" -ge 2 && test "$YELLOW_FILES" = "$NUM_FILES" [congrats] -Don't you immediately feel more at home? +filesadd_congrats_250 diff --git a/levels/files/files-delete b/levels/files/files-delete index 7bf33be3..fbc07970 100644 --- a/levels/files/files-delete +++ b/levels/files/files-delete @@ -1,12 +1,9 @@ -title = Unexpected Roommates +title = filesdelete_title_243 cards = file-delete [description] -The first day at Time Travel School comes to an end and you receive the key to your room. -Full of excitement you open the door just to find... spider webs! Spider webs everywhere! - -Remove all the spider webs you can find with the remove card! +filesdelete_description_244 [cli] @@ -23,14 +20,14 @@ echo An extra thick spider web is right beside your door. > thick_web [win] -# Remove all spider webs. +# filesdelete_win_hint_246 ! ls | grep thick_web && ! ls | grep big_web && ! ls | grep tiny_web -# But make sure you keep your bed! +# filesdelete_win_hint_247 ls | grep bed [congrats] -Your room looks now very tidy and cozy! Time to unpack your stuff! +filesdelete_congrats_245 diff --git a/levels/index/add b/levels/index/add index b68f357b..f4af3d9e 100644 --- a/levels/index/add +++ b/levels/index/add @@ -1,13 +1,9 @@ -title = Updating files in the index +title = add_title_076 cards = add commit checkout [description] -So you start working, and make changes to your files! Git lets you choose which of these changes you want to put in the next commit. This is like updating the index version of that file to the new version. - -This allows you to have smaller commits, that describe better what you changed! - -The command for this is the same - `git add`! +add_description_077 [setup] @@ -19,12 +15,12 @@ git commit -m "Initial commit" [win] -# Make changes to all files! +# add_win_hint_079 test "$(cat a)" != "a" && test "$(cat b)" != "b" && test "$(cat c)" != "c" -# Add only the changes of a and c, and make a commit! Finally, make a commit which captures the changes in b! +# add_win_hint_080 test "$(git show main:a)" != "a" && test "$(git show main:b)" != "b" && @@ -35,4 +31,4 @@ test "$(git show main^:c)" != "c" [congrats] -Well done! Try travelling between the commits using `git checkout`, so you can look at their contents again! +add_congrats_078 diff --git a/levels/index/change b/levels/index/change index f1e377d0..ebbe1256 100644 --- a/levels/index/change +++ b/levels/index/change @@ -1,13 +1,9 @@ -title = Update files in the index +title = change_title_058 cards = add commit [description] -When we change files, the index won't change on its own. We have to use `git add` to update the index to the changed version of the file. - -Let's try that! - -The icons in the file browser show you when the actual file (white) and the version in the index (blue) are different, and when they are the same! +change_description_059 [win] @@ -24,8 +20,8 @@ git commit -m "The beginning" # Make a change to the candle. test "$(git diff --name-only)" = "candle" || file -f .git/candle-changed && touch .git/candle-changed -# Add the candle. +# new_win_hint_083 test "$(git diff --cached --name-only)" = "candle" || file -f .git/candle-added && touch .git/candle-added -# Make a commit. +# new_win_hint_084 test "$(git diff --name-only HEAD HEAD^)" = "candle" diff --git a/levels/index/checkout b/levels/index/checkout index 3c01b094..a37870da 100644 --- a/levels/index/checkout +++ b/levels/index/checkout @@ -1,11 +1,9 @@ -title = Checking out files from the index +title = checkout_title_073 cards = add reset-file checkout-file commit [description] -So you've made changes to your files, but you decide that you don't want to keep them! You can use `git checkout` for that! - -What happens if you have already update the index, like in file c? You have to reset the index first! +checkout_description_074 [setup] @@ -21,5 +19,5 @@ git add c [win] -# Remove all changes in your local files! +# checkout_win_hint_075 test "$(git diff --name-only | wc -l)" -eq 0 diff --git a/levels/index/compare b/levels/index/compare index 97fa6c73..52a24008 100644 --- a/levels/index/compare +++ b/levels/index/compare @@ -1,15 +1,13 @@ -title = Step by step +title = compare_title_070 cards = checkout commit-auto [description] -Welcome to today's lesson! We're going to learn how to make commits with more precision! - -Have a look at these two timelines. They have exactly the same outcome. But one of them makes it much easier to figure out what happened. +compare_description_071 [win] -# Right! Having each change in its own commit makes it easier to understand what's going on! Let's learn how to do that! +# compare_win_hint_072 git branch --show-current | grep step-by-step [setup] @@ -30,7 +28,7 @@ echo "The candle has been blown out." > candle git commit -am "The end" -git checkout HEAD^ +terminal_button2_022 git checkout -b step-by-step diff --git a/levels/index/new b/levels/index/new index 4df39306..4ff583d7 100644 --- a/levels/index/new +++ b/levels/index/new @@ -1,15 +1,9 @@ -title = Add new files to the index +title = new_title_081 cards = add commit [description] -So far, when we made a commit, we've always recorded the current status of all objects, right? - -But Git allows you to pick which changes you want to put in a commit! - -To learn how that works, we need to learn about the "index"! In the index, we can prepare what will be in the next commit. In this game, the index is represented by a blue aura around icons in the file browser! - -Initially, the index is empty. To make a commit that contains a new file, we need to add it! +new_description_082 [cli] @@ -21,8 +15,8 @@ echo "The candle is burning with a blue flame." > candle [win] -# Add the candle. +# new_win_hint_083 test "$(git diff --cached --name-only)" = "candle" || file -f .git/candle-added && touch .git/candle-added -# Make a commit. +# new_win_hint_084 test "$(git ls-tree --name-only HEAD)" = "candle" diff --git a/levels/index/reset b/levels/index/reset index 5e21973d..1229ad3e 100644 --- a/levels/index/reset +++ b/levels/index/reset @@ -1,15 +1,9 @@ -title = Resetting files in the index +title = reset_title_054 cards = add reset-file commit [description] -See the dark shadow behind the icons? That's the version of the file in the last commit! - -For example, these candles have been blown out, and that change has been added. - -But you decide that this was a mistake! You only want to blow out the red candle in the next commit! - -If you already have updated the index to a changed file, but want to reset it, you can use `git reset`! +reset_description_055 [setup] @@ -26,12 +20,12 @@ git add . [win] -# Reset the changes in the green and blue candles! +# reset_win_hint_056 git show :green_candle | grep burning && git show :blue_candle | grep burning && git show :red_candle | grep -v burning -# And make a commit! +# reset_win_hint_057 git show main:green_candle | grep burning && git show main:blue_candle | grep burning && git show main:red_candle | grep -v burning diff --git a/levels/index/rm b/levels/index/rm index 637fd225..abf23100 100644 --- a/levels/index/rm +++ b/levels/index/rm @@ -1,11 +1,9 @@ -title = Delete a file in the next commit +title = rm_title_060 cards = add reset-file checkout-file rm file-delete commit [description] -If you want to remove a file in the next commit, you can use `git rm`! This will both delete the file locally, and in the index. - -If a file is modified, you'll need to reset these changes first/reset the files. +rm_description_061 [setup] @@ -20,5 +18,5 @@ git add b [win] -# Make a commit where all files are deleted ¯\_(^_^)_/¯ +# rm_win_hint_062 test "$(git ls-tree main | wc -l)" -eq 0 diff --git a/levels/index/steps b/levels/index/steps index 36e75001..d8782317 100644 --- a/levels/index/steps +++ b/levels/index/steps @@ -1,9 +1,9 @@ -title = Adding changes step by step +title = steps_title_063 cards = add reset-file commit [description] -The index is really useful, because it allows us to be precise about which changes we want to include in each commit! +steps_description_064 [setup] @@ -16,13 +16,13 @@ git commit -m "The beginning" [win] -# Make changes to all three objects, to form a logical sequence of events! +# steps_win_hint_065 test "$(git diff --name-only | wc -l)" -eq 3 || file -f .git/candle-changed && touch .git/candle-changed -# Only add one of these changes! +# steps_win_hint_066 test "$(git diff --cached --name-only | wc -l)" -eq 1 || file -f .git/candle-added && touch .git/candle-added -# And make a commit. +# steps_win_hint_067 COUNT=0 for commit in $(git cat-file --batch-check='%(objectname) %(objecttype)' --batch-all-objects | grep 'commit$' | cut -f1 -d' '); do if test "$(git diff --name-only $commit $commit^ | wc -l)" -eq 1; then @@ -32,7 +32,7 @@ done test "$COUNT" -ge 1 -# Make a second commit that only records a single change. +# steps_win_hint_068 COUNT=0 for commit in $(git cat-file --batch-check='%(objectname) %(objecttype)' --batch-all-objects | grep 'commit$' | cut -f1 -d' '); do if test "$(git diff --name-only $commit $commit^ | wc -l)" -eq 1; then @@ -42,7 +42,7 @@ done test "$COUNT" -ge 2 -# And a third one. +# steps_win_hint_069 COUNT=0 for commit in $(git cat-file --batch-check='%(objectname) %(objecttype)' --batch-all-objects | grep 'commit$' | cut -f1 -d' '); do if test "$(git diff --name-only $commit $commit^ | wc -l)" -eq 1; then diff --git a/levels/intro/cli b/levels/intro/cli index 1ee655b4..419205c6 100644 --- a/levels/intro/cli +++ b/levels/intro/cli @@ -1,9 +1,9 @@ -title = The command line +title = cli_title_112 cards = [description] -These playing cards are designed to be easy to use and to remember! We'd suggest sticking to them if you don't have a lot of experience with Git! +cli_description_113 [cli] @@ -17,11 +17,9 @@ rm -rf .git [win] -# Initialize the time machine! +# cli_win_hint_115 test -d .git [congrats] -Cool! Instead of using the playing cards, you can also do everything via the command line! - -The command line is pretty powerful! Often, you can use it to solve tasks faster compared to using a graphical interface. +cli_congrats_114 diff --git a/levels/intro/commit b/levels/intro/commit index 333ea6e5..b986e5c2 100644 --- a/levels/intro/commit +++ b/levels/intro/commit @@ -1,11 +1,9 @@ -title = Your first commit +title = commit_title_134 cards = commit-auto [description] -You can use your time machine to make snapshots of objects around you! Here, let's practice this! - -(Your teacher pours some water into a glass.) +commit_description_135 [cli] @@ -19,15 +17,15 @@ echo "The glass is full of water." > glass [win] -# Make a snapshot of the glass (a "commit") +# commit_win_hint_137 git rev-parse HEAD -# Change the contents of the glass! +# commit_win_hint_138 ! test "$(cat glass)" = "The glass is full of water." -# And make a second commit! +# commit_win_hint_139 git rev-parse HEAD^ && ! test "$(git show main:glass)" = "The glass is full of water." [congrats] -Nice! You can try making some additional commits. When you feel comfortable, click on "Next Level". +commit_congrats_136 diff --git a/levels/intro/copies b/levels/intro/copies index ef05d24f..f1635306 100644 --- a/levels/intro/copies +++ b/levels/intro/copies @@ -1,19 +1,13 @@ -title = Making backups +title = copies_title_140 cards = [description] -This time, you're making a lot of backup copies - you can look at them by clicking on them! +copies_description_141 [congrats] -Okay, this kind of works. - -But you're a bit worried that you'll end up with hundreds of copies of this form, and it will be hard to keep track of all of them. - -And especially when working with other people, sending copies back and forth doesn't seem ideal. - -You can't wait to try these time machines! +copies_congrats_142 [setup] @@ -38,5 +32,5 @@ cp form2_final.txt form2_really_final.txt [win] -# Add another line to form2_really_final.txt! +# copies_win_hint_143 test "$(cat form2_really_final.txt | wc -l )" -ge 5 diff --git a/levels/intro/init b/levels/intro/init index ea0426e7..15b721dc 100644 --- a/levels/intro/init +++ b/levels/intro/init @@ -1,13 +1,9 @@ -title = Enter the time machine +title = init_title_121 cards = init [description] -You've been accepted to time travel school! Yay! It's your first day! Your teacher explains: - -"To do anything with a time machine, you first need to initialize it!" - -Drag that blue card up to play it! +init_description_122 [setup] @@ -15,9 +11,9 @@ rm -rf .git [win] -# Initialize the time machine! +# cli_win_hint_115 test -d .git [congrats] -Nice! See that little owl squirrel that appeared? It will be your companion, and always show you where you are in time! +init_congrats_123 diff --git a/levels/intro/remote b/levels/intro/remote index c19b49a1..9215a669 100644 --- a/levels/intro/remote +++ b/levels/intro/remote @@ -1,11 +1,9 @@ -title = Working together +title = remote_title_128 cards = pull commit-auto push [description] -Let's add your name to our list of students! - -I already have a second commit of it in my time machine - let's work together! +remote_description_129 [cli] @@ -13,7 +11,7 @@ To go back to old commands, you can press arrow up and down. That way, you don't [congrats] -Welcome to time travel school! :) I'll see you for your first class tomorrow! +remote_congrats_130 [setup] @@ -37,13 +35,13 @@ git commit -m "Added two students" [win] -# Get the second commit from your teacher using `git pull`. +# remote_win_hint_131 test "$(git log --oneline teacher/main | wc -l)" -ge 2 -# Add your name to the list of students +# remote_win_hint_132 test "$(cat students |wc -l)" -ge 5 -# Commit your result. +# remote_win_hint_133 test "$(git show main:students |wc -l)" -ge 5 [win teacher] diff --git a/levels/intro/risky b/levels/intro/risky index a5e72392..ff38bc16 100644 --- a/levels/intro/risky +++ b/levels/intro/risky @@ -1,21 +1,13 @@ -title = Living dangerously +title = risky_title_124 cards = [description] -So you have decided to apply for time travel school, to learn how to use this time machine called "Git"! - -How exciting! - -You're almost done with the paperwork! You just need to fill in one more reason why you want to learn Git. +risky_description_125 [congrats] -Suddenly, your cat jumps on the table, snatches away the form, and runs away! Oh no. All your hard work, gone! - -You clearly need a better solution. - -(Click "Next Level" as soon as you're ready!) +risky_congrats_126 [setup] @@ -38,5 +30,5 @@ test "$(cat form.txt | wc -l )" -ge 5 && echo "(Has been stolen by your cat.) [win] -# Add another line to form.txt! +# risky_win_hint_127 test "$(cat form.txt | wc -l )" -ge 5 diff --git a/levels/intro/who-are-you b/levels/intro/who-are-you index 9fb907ab..9bc1d580 100644 --- a/levels/intro/who-are-you +++ b/levels/intro/who-are-you @@ -1,11 +1,9 @@ -title = Welcome to time travel school! +title = whoareyou_title_116 cards = config-name commit-auto checkout [description] -You're still pretty confused by everything that's going on. The next day, you decide to enroll in time travel school! - -Your time travel teacher welcomes you: "Hello there! Wanna tell us your name?" +whoareyou_description_117 [setup] @@ -25,14 +23,12 @@ Signature: $(git config user.name)" >> form [win] -# Introduce yourself. +# whoareyou_win_hint_119 test "$(git config user.name)" != "You" -# Fill out the enrollment form, and commit it! +# whoareyou_win_hint_120 git show main:form | grep '\[[xX]\]' [congrats] -"We're so glad to have you! - -Git can help you fix problems in the past! It allows you to collaborate with other students of time travel! It's really powerful, and it's really popular! I'll see you for your first lesson tomorrow!" +whoareyou_congrats_118 diff --git a/levels/low-level/basics b/levels/low-level/basics index 55374b50..1603fd18 100644 --- a/levels/low-level/basics +++ b/levels/low-level/basics @@ -1,19 +1,10 @@ [description] -For this prototype, we assume you have some experience with the command line. Here are some commands that will be useful: - -- ls -- echo content > file -- cat file -- mkdir dir - -Find the riddle in your current directory and put the answer into the file "answer"! +basics_description_293 [congrats] -Omnomnom! - -For technical reasons, you can't use `cd` in this prototype yet. But there won't be a lot of interaction with the file system anyways. :) +basics_congrats_294 [setup] diff --git a/levels/low-level/blob-create b/levels/low-level/blob-create index 86f62542..41bb73f6 100644 --- a/levels/low-level/blob-create +++ b/levels/low-level/blob-create @@ -1,24 +1,10 @@ [description] -At its core, Git is very simple. It stores "objects", which are basically files identified by an "identifier" (short: ID). - -There are four types of objects: blobs, trees, commits, and tags. The simplest type is a "blob", which is just a piece of text. - -Let's create some blobs! To do that, create a file with the desired content, and then use - - git hash-object -w - -The flag -w means "write", and tells Git to actually write the new blob to the disk. - -Create three new blobs! +blobcreate_description_287 [congrats] -Tip: You can also use a command like this to create a blob in a single line: - - echo "awesome content" | git hash-object -w --stdin - -Did you already notice that you can drag and drop all objects? :) +blobcreate_congrats_288 [setup] diff --git a/levels/low-level/blob-remove b/levels/low-level/blob-remove index bbc1b307..ba6706b6 100644 --- a/levels/low-level/blob-remove +++ b/levels/low-level/blob-remove @@ -1,16 +1,10 @@ [description] -There's a simple command to remove all objects that are not referenced by anything: - - git prune - -Remove all blobs in this repository. +blobremove_description_283 [congrats] -Generally, `git prune` will be useful if you want to clean up some objects you made. - -Alternatively, you can also click the "Reload" button to restart a level. +blobremove_congrats_284 [setup] diff --git a/levels/low-level/commit-create b/levels/low-level/commit-create index 79a8e521..4b9d781b 100644 --- a/levels/low-level/commit-create +++ b/levels/low-level/commit-create @@ -1,14 +1,6 @@ [description] -So a tree describes a directory structure at a specific point in time. - -It would be nice if we could remember when that state existed, and who authored it, right? - -Enter: commits. They are objects that point to a tree and contain some additional metadata. You can create a commit using - - git commit-tree -m "Description of your commit" - -Make a commit from the tree in this repository! +commitcreate_description_278 [setup] diff --git a/levels/low-level/commit-parents b/levels/low-level/commit-parents index a2efb11f..fa5d746e 100644 --- a/levels/low-level/commit-parents +++ b/levels/low-level/commit-parents @@ -1,12 +1,6 @@ [description] -When using the commit-tree command, you can optionally specify a parent: - - git commit-tree -m "Description" -p - -Make a string of three commits! - -Hint: You'll need a tree object. What could be the easiest way to obtain one? +commitparents_description_286 [setup] diff --git a/levels/low-level/commit-rhombus b/levels/low-level/commit-rhombus index e320ca08..a445c25f 100644 --- a/levels/low-level/commit-rhombus +++ b/levels/low-level/commit-rhombus @@ -1,10 +1,6 @@ [description] -A commit can have multiple parents! You can specify the -p option multiple times, like this: - - git commit-tree -m "Description" -p -p - -Build a rhombus shape from commits, where two commits point to the same parent, and then a fourth commit points to both of them. +commitrhombus_description_280 [setup] @@ -21,7 +17,7 @@ NORTH=$(git commit-tree $TREE -m "Nort" -p $EAST -p $WEST) COMMITS=$(git cat-file --batch-check='%(objectname) %(objecttype)' --batch-all-objects | grep commit | cut -f1 -d" ") for COMMIT in $COMMITS; do - # My first parent's parents has to be the same as my second parent's parent. + # commitrhombus_win_hint_281 if [ "$(git rev-parse --verify -q $COMMIT^1^)" = "$(git rev-parse --verify -q $COMMIT^2^)" ]; then return 0 fi diff --git a/levels/low-level/index-add b/levels/low-level/index-add index 633245cd..070e4c49 100644 --- a/levels/low-level/index-add +++ b/levels/low-level/index-add @@ -1,27 +1,10 @@ [description] -Blobs usually represent the content of a file. But on their own, they don't have any metadata, not even a name! - -Git has a very powerful concept to store metadata related to blobs: the index! It's a list that relates blobs to filenames and access permissions. - -The most convenient option to add an entry to the index is via an existing file: - - echo "my content" > file - git update-index --add file - -Add three entries to the index! For a bonus challenge: can you add a file that is inside of a directory, like "directory/file"? +indexadd_description_296 [congrats] -There's another way to add an entry to the index directly: - - git update-index --add --cacheinfo ,, - -The first three numbers of the mode describe the type of the entry, "100" is a regular file. - -The second three number describe the permissions. Only "644" (non-executable) and "755" (executable) are supported. - -You can insert the hash of an object into the terminal by right-clicking on it! :) +indexadd_congrats_297 [setup] diff --git a/levels/low-level/index-remove b/levels/low-level/index-remove index 9816126b..e3f8eb3c 100644 --- a/levels/low-level/index-remove +++ b/levels/low-level/index-remove @@ -1,10 +1,6 @@ [description] -To remove an entry from the index, use a command like this: - - git update-index --force-remove - -Remove all entries from the index! +indexremove_description_277 [setup] diff --git a/levels/low-level/index-update b/levels/low-level/index-update index 047493d3..fcfbed91 100644 --- a/levels/low-level/index-update +++ b/levels/low-level/index-update @@ -1,14 +1,6 @@ [description] -Instead of removing an entry from the index and adding one with the same name, you can also directly update that entry! - -Put the content you want in a file with a matching name, and then run - - git update-index - -This will create a new blob, and update the hash of the entry to that blob. - -Update an entry in the index! +indexupdate_description_275 [setup] @@ -29,5 +21,5 @@ git update-index file1 [win] -# This is not really a good test for the winning condition... +# indexupdate_win_hint_276 test "$(git ls-files -s | git hash-object --stdin)" != "10c4b28623e7e44e09f5a596450a50ab7ac31fbe" -a "$(git ls-files | wc -l)" -eq 3 diff --git a/levels/low-level/puzzle-apocalypse b/levels/low-level/puzzle-apocalypse index 119784d8..5cfc71ae 100644 --- a/levels/low-level/puzzle-apocalypse +++ b/levels/low-level/puzzle-apocalypse @@ -1,11 +1,6 @@ [description] -Delete all objects in this repository using git commands only! - -Useful commands: - - git prune - git reflog expire +puzzleapocalypse_description_303 [setup] diff --git a/levels/low-level/puzzle-precious-blob b/levels/low-level/puzzle-precious-blob index 865cfdfb..fa17c3d3 100644 --- a/levels/low-level/puzzle-precious-blob +++ b/levels/low-level/puzzle-precious-blob @@ -1,6 +1,6 @@ [description] -Create two trees pointing to the same blob! +puzzlepreciousblob_description_295 [setup] diff --git a/levels/low-level/puzzle-trees-all-the-way-down b/levels/low-level/puzzle-trees-all-the-way-down index bc3e58aa..002a3cfe 100644 --- a/levels/low-level/puzzle-trees-all-the-way-down +++ b/levels/low-level/puzzle-trees-all-the-way-down @@ -1,8 +1,6 @@ [description] -Construct a chain of three trees, which don't point to anything else. - -This is hard! The `git mktree` command might be useful. +puzzletreesallthewaydown_description_298 [setup] @@ -19,11 +17,11 @@ TREES=$(git cat-file --batch-check='%(objectname) %(objecttype)' --batch-all-obj for TREE in $TREES; do if [ "$(git cat-file -p $TREE | wc -l)" -eq 1 ]; then if [ "$(git cat-file -p $TREE | cut -f1 | grep tree | wc -l)" -eq 1 ]; then - # So the tree has exactly one child, and it is a tree! + # puzzletreesallthewaydown_win_hint_299 TREE2=$(git cat-file -p $TREE | cut -f1 | grep tree | cut -f3 -d" ") if [ "$(git cat-file -p $TREE2 | wc -l)" -eq 1 ]; then if [ "$(git cat-file -p $TREE2 | cut -f1 | grep tree | wc -l)" -eq 1 ]; then - # Same for its child! \o/ + # puzzletreesallthewaydown_win_hint_300 return 0 fi fi diff --git a/levels/low-level/ref-create b/levels/low-level/ref-create index 1cc4bcfe..967aebee 100644 --- a/levels/low-level/ref-create +++ b/levels/low-level/ref-create @@ -1,14 +1,6 @@ [description] -Let's take a look at "refs" (short for "references")! Refs are not objects, but rather very simple *pointers* to objects! They can help you keep track of what's where. - -You can create or update a ref with - - git update-ref refs/ - -Make sure to always start a ref's name with "refs/"! That's a convention that helps Git find all refs you create. If you forget the "refs/", you will not see the ref. - -Create refs that point to all objects in this repository! +refcreate_description_305 [setup] diff --git a/levels/low-level/ref-move b/levels/low-level/ref-move index e3b29e34..98f40be8 100644 --- a/levels/low-level/ref-move +++ b/levels/low-level/ref-move @@ -1,10 +1,6 @@ [description] -You can point refs to a new location using the same command you use to create them: - - git update-ref refs/ - -As an exercise, make all refs in this repository point to the tree object! +refmove_description_282 [setup] diff --git a/levels/low-level/ref-remove b/levels/low-level/ref-remove index d1fa9825..b6ed3338 100644 --- a/levels/low-level/ref-remove +++ b/levels/low-level/ref-remove @@ -1,10 +1,6 @@ [description] -And finally, to delete a ref, use - - git update-ref -d refs/ - -Delete all refs! :P (Well, except for HEAD. HEAD is special.) +refremove_description_304 [setup] diff --git a/levels/low-level/symref-create b/levels/low-level/symref-create index da933cbd..7fc37f8a 100644 --- a/levels/low-level/symref-create +++ b/levels/low-level/symref-create @@ -1,12 +1,6 @@ [description] -Instead of pointing directly to objects, refs can also point to other refs! - -When that happens, they are called "symbolic refs". You can create or update a symbolic ref using - - git symbolic-ref - -Create a symbolic ref called "refs/rainbow"! +symrefcreate_description_285 [setup] diff --git a/levels/low-level/symref-no-deref b/levels/low-level/symref-no-deref index 458e6694..ea6f7677 100644 --- a/levels/low-level/symref-no-deref +++ b/levels/low-level/symref-no-deref @@ -1,28 +1,10 @@ [description] -When you have a symbolic ref (a ref pointing at another ref), and you decide you want it to be a regular ref again (pointing to an object), you're in for some trouble! :) - -What happens when you try pointing the symbolic ref directly to the blob using `git update-ref`? - -Oops! Turns out that when you reference a symbolic ref, it acts as if you had specified the ref it points to. To de-symbolic-ize it, use the `--no-deref` option directly after `update-ref`! - -Weird, huh? +symrefnoderef_description_301 [congrats] -Whew, we've covered a lot of things: Blobs! The index! Trees! Commits! Refs! - -You now know about almost everything about how Git repositories look like on the inside! We think that's pretty cool! :) - -Everything else is just convention and high-level commands that make interacting with the objects more convenient. - -We haven't covered: - -- tag objects (they are the fourth object type - a bit like refs with a description and an author) -- configuration (allows you to specify remote repositories, for example) -- working with local files (which is, uh, arguably pretty important :P) - -Thanks for playing! You're welcome to check out the "puzzle" levels in the dropdown, some of them are more advanced! +symrefnoderef_congrats_302 [setup] diff --git a/levels/low-level/tree-create b/levels/low-level/tree-create index 3da3618c..c2dbdeea 100644 --- a/levels/low-level/tree-create +++ b/levels/low-level/tree-create @@ -1,18 +1,10 @@ [description] -After carefully building the index we want, it would be nice to save a permanent snapshot of it, right? - -This is what the second type of objects is for: trees! You can convert the index into a tree using - - git write-tree - -Try it! :) +treecreate_description_289 [congrats] -Nice! - -Can you make a different tree? Modify the index, then call `git write-tree` again! +treecreate_congrats_290 [setup] diff --git a/levels/low-level/tree-nested b/levels/low-level/tree-nested index c7afce81..2ab69f82 100644 --- a/levels/low-level/tree-nested +++ b/levels/low-level/tree-nested @@ -1,10 +1,6 @@ [description] -Trees can also point to other trees! This way, they can describe nested directory structures. - -When you add a file inside of a directory to the index, and then call `git write-tree`, it will create a nested tree for the directory, and attach the blob to it. - -To solve this level, build a little stick figure, as shown on the left - a tree that points to two blobs, as well to a tree that points to two blobs. +treenested_description_274 [setup] diff --git a/levels/low-level/tree-read b/levels/low-level/tree-read index ba8c440d..6c8034c7 100644 --- a/levels/low-level/tree-read +++ b/levels/low-level/tree-read @@ -1,12 +1,6 @@ [description] -As soon as you have some tree objects, you can always read them and set the index exactly to their content! Unsurprisingly, the command is called - - git read-tree - -For , you can provide the hash of any tree object - you can right-click one to insert its hash into the terminal! - -Try reading some of the trees in this repository into the index! +treeread_description_279 [setup] diff --git a/levels/low-level/welcome b/levels/low-level/welcome index d669136b..06a770eb 100644 --- a/levels/low-level/welcome +++ b/levels/low-level/welcome @@ -1,22 +1,10 @@ [description] -This is prototype #1 for the Git learning game by @bleeptrack and @blinry. Thanks for checking it out! <3 - -You can interact with the repository labelled "yours" by typing Bash commands in the terminal below! The visualization will show you its internal status. - -Let's get started by initializing an empty Git repository in the current directory by typing: - - git init +welcome_description_291 [congrats] -Well done! - -An empty Git repository is... well, quite empty. The only thing that always exists is a reference called "HEAD" - we'll learn what that is later! - -But first, let's look at some basics! - -(Click "Next Level" as soon as you're ready!) +welcome_congrats_292 [setup] diff --git a/levels/merge/conflict b/levels/merge/conflict index 1a8b02b7..f535891c 100644 --- a/levels/merge/conflict +++ b/levels/merge/conflict @@ -1,15 +1,9 @@ -title = Contradictions +title = conflict_title_045 cards = checkout commit-auto merge reset-hard [description] -Sometimes, timelines will contradict each other. - -For example, in this case, one of our clients wants these timelines merged, but they ate different things for breakfast in both timelines. - -Try to merge them together! You'll notice that there will be a conflict! The time machine will leave it up to you how to proceed: you can edit the problematic item, it will show you the conflicting sections. You can keep either of the two versions - or create a combination of them! Remove the >>>, <<<, and === markers, and make a new commit to finalize the merge! - -Let your finalized timeline be the "main" one. +conflict_description_046 [setup] @@ -39,9 +33,9 @@ git checkout main [win] -# Make a breakfast compromise in the 'main' branch. +# conflict_win_hint_048 git rev-parse main^ && test "$(git rev-parse main^1^^)" = "$(git rev-parse main^2^^)" [congrats] -Yum, that sounds like a good breakfast! +conflict_congrats_047 diff --git a/levels/merge/merge b/levels/merge/merge index 8b45d06a..d1b59523 100644 --- a/levels/merge/merge +++ b/levels/merge/merge @@ -1,9 +1,9 @@ -title = Merging timelines +title = merge_title_040 cards = checkout commit-auto merge [description] -Here's a trick so that you can sleep a bit longer: just do all your morning activities in parallel universes, and then at the end, merge them together! +merge_description_041 [setup] @@ -71,12 +71,12 @@ git branch -D main [win] -# Build a situation where you consumed a baguette, a coffee, *and* a donut. +# merge_win_hint_043 { git show HEAD:you | grep "You ate.*baguette"; } && { git show HEAD:you | grep "You drank.*coffee"; } && { git show HEAD:you | grep "You ate.*donut"; } -# Be on a merge commit. +# merge_win_hint_044 test "$(git log --pretty=%P -n 1 HEAD | wc -w)" -ge 2 [congrats] -I wonder if you're more relaxed when you *sleep* in parallel timelines... +merge_congrats_042 diff --git a/levels/merge/merge-abort b/levels/merge/merge-abort index ce7190be..5cd9f5dd 100644 --- a/levels/merge/merge-abort +++ b/levels/merge/merge-abort @@ -1,15 +1,9 @@ -title = Abort a merge +title = mergeabort_title_049 cards = checkout commit-auto merge merge-abort [description] -Sometimes you want to merge two commits, but a merge conflict occurs that you currently don't want to resolve. - -In these situations you can abort the merge to merge later. Use - git merge --abort -when you are in a merge process. - -Try to merge both commits and abort the merge afterwards. +mergeabort_description_050 [setup] @@ -43,12 +37,12 @@ fi [win] -# You tried to merge? +# mergeabort_win_hint_052 test -f .git/secretfile -# You aborted to merge? +# mergeabort_win_hint_053 test -f .git/secretfile && ! test -f .git/MERGE_HEAD && ! git rev-parse HEAD^^ [congrats] -Aaah, let's merge later... +mergeabort_congrats_051 diff --git a/levels/remotes/friend b/levels/remotes/friend index 1b70f33a..8fb3ac0f 100644 --- a/levels/remotes/friend +++ b/levels/remotes/friend @@ -1,11 +1,9 @@ -title = Friend +title = friend_title_309 cards = pull push commit-auto checkout [description] -Your friend added another line to your essay! Get it, add a third one and send it to them! - -Take turns until you have five lines! +friend_description_310 [setup yours] @@ -32,10 +30,10 @@ fi [win] -# Got the second line from your friend +# friend_win_hint_311 git show HEAD:essay | grep gnihihi -# Got the fourth line from your friend. +# friend_win_hint_312 git show HEAD:essay | grep blurbblubb [win friend] diff --git a/levels/remotes/problems b/levels/remotes/problems index fab71c56..ccede0f9 100644 --- a/levels/remotes/problems +++ b/levels/remotes/problems @@ -1,9 +1,9 @@ -title = Problems +title = problems_title_306 cards = checkout add pull push commit-auto merge [description] -Both you and your friend have been working on the file, and want to sync up! +problems_description_307 [setup yours] @@ -24,7 +24,7 @@ git commit -a -m "friends version" [win] -# Commit your local changes. +# problems_win_hint_308 test "$(git status -s)" = "" [win friend] diff --git a/levels/sandbox/empty b/levels/sandbox/empty index 1f954a57..83922929 100644 --- a/levels/sandbox/empty +++ b/levels/sandbox/empty @@ -1,7 +1,7 @@ -title = Empty sandbox +title = empty_title_268 [description] -This is an empty sandbox you can play around in. +empty_description_269 [setup] diff --git a/levels/sandbox/remote b/levels/sandbox/remote index f0ca2c02..24d1dc42 100644 --- a/levels/sandbox/remote +++ b/levels/sandbox/remote @@ -1,11 +1,9 @@ -title = Sandbox with a remote +title = remote_title_272 cards = checkout commit-auto pull fetch push [description] -Here's a sandbox with a remote! Try pulling, fetching, or pushing! - -How can you push tags and branches on a remote? How can you delete them again? +remote_description_273 [setup yours] diff --git a/levels/sandbox/three-commits b/levels/sandbox/three-commits index 3e5308c4..09f68ac0 100644 --- a/levels/sandbox/three-commits +++ b/levels/sandbox/three-commits @@ -1,4 +1,4 @@ -title = Sandbox with three commits +title = threecommits_title_270 cards = checkout add reset-file checkout-file commit merge rebase [setup] @@ -17,10 +17,4 @@ git branch not_main [description] -Here's a sandbox you can play around in. - -You can use both the playing cards, as well as the terminal. This is a real Git terminal! Fun things to try: - -- Make a commit that merges three timelines together at once! -- Create and delete some tags! -- Make a timeline that's completely independent of the rest! +threecommits_description_271 diff --git a/levels/shit-happens/bad-commit b/levels/shit-happens/bad-commit index 10669be8..914ed492 100644 --- a/levels/shit-happens/bad-commit +++ b/levels/shit-happens/bad-commit @@ -1,16 +1,9 @@ -title = Undo a bad commit +title = badcommit_title_218 cards = reset commit-a [description] -Oh no, we made a bad commit! How can we undo making the commit, and go back to a point where we can try again? - -The answer is using `git reset [commit]`, which does two things: - -- It resets the current branch ref to the commit you specify. -- And it resets the index to that commit. - -It does not change your working directory in any way, which means that after that, you can try making the commit you want again. +badcommit_description_219 [setup] @@ -22,9 +15,9 @@ git commit -am "More numberrrrrs" [win] -# In the last main commit, the numbers file contains the numbers from 1 to 10. +# badcommit_win_hint_220 test "$(git show main:numbers)" = "1 2 3 4 5 6 7 8 9 10" -# The commit message of that commit is "More numbers". +# badcommit_win_hint_221 git log -1 --oneline | grep "More numbers" -# The commit with the typo is not part of the main branch anymore. +# badcommit_win_hint_222 git log --oneline | grep -v "rrrrr" diff --git a/levels/shit-happens/pushed-something-broken b/levels/shit-happens/pushed-something-broken index f8dce389..9b014c26 100644 --- a/levels/shit-happens/pushed-something-broken +++ b/levels/shit-happens/pushed-something-broken @@ -1,9 +1,9 @@ -title = I pushed something broken +title = pushedsomethingbroken_title_216 cards = revert push [description] -We were talking about how to undo a commit, and fix it. This only helps when you haven't already pushed it to a remote. When that has happened, and you want to undo the effects of the commit completely, your best option is `git revert` +pushedsomethingbroken_description_217 [setup] diff --git a/levels/shit-happens/reflog b/levels/shit-happens/reflog index 5ebb78f3..8d3dab30 100644 --- a/levels/shit-happens/reflog +++ b/levels/shit-happens/reflog @@ -1,15 +1,9 @@ -title = Go back to where you were before +title = reflog_title_213 cards = checkout reflog [description] -Say you were looking at something in the past, and then switched back to the main branch. - -But then, you got reaaally distracted, and after your lunch break, you can't remember which past commit you were on before. How can you find out? - -There's a convenient command that shows you all the places your HEAD has pointed to in the past: - - git reflog +reflog_description_214 [setup] @@ -22,5 +16,5 @@ git checkout main [win] -# Find out where you've been before, and go back there! +# reflog_win_hint_215 test "$(git rev-parse HEAD)" = "$(git rev-parse 3)" diff --git a/levels/shit-happens/restore-a-file b/levels/shit-happens/restore-a-file index 26450f0e..1cebb802 100644 --- a/levels/shit-happens/restore-a-file +++ b/levels/shit-happens/restore-a-file @@ -1,11 +1,9 @@ -title = Restore a deleted file +title = restoreafile_title_226 cards = checkout [description] -Oops - you deleted the "essay" file, which you worked on all night! - -Luckily, Git is here to help! You can use `git checkout` to restore the file! +restoreafile_description_227 [setup] @@ -18,5 +16,5 @@ rm essay [win] -# Restore the essay to contain "important content" +# restoreafile_win_hint_228 test "$(cat essay)" = "important content" diff --git a/levels/shit-happens/restore-a-file-from-the-past b/levels/shit-happens/restore-a-file-from-the-past index b51c1080..98c151e5 100644 --- a/levels/shit-happens/restore-a-file-from-the-past +++ b/levels/shit-happens/restore-a-file-from-the-past @@ -1,11 +1,9 @@ -title = Restore a file from the past +title = restoreafilefromthepast_title_223 cards = checkout checkout-from commit [description] -Here's a similar problem: you really liked the essay from the very first commit, and want to have it back! Well, checkout can also restore things from older commits, Here's how: - - git checkout [commit] [file] +restoreafilefromthepast_description_224 [setup] @@ -17,5 +15,5 @@ git commit -am "\"Improve\" essay" [win] -# Get the first version of your essay, and make a new commit with it. +# restoreafilefromthepast_win_hint_225 test "$(git show main:essay)" = "good version" diff --git a/levels/stash/stash b/levels/stash/stash index 6a4bc616..433184ee 100644 --- a/levels/stash/stash +++ b/levels/stash/stash @@ -1,19 +1,9 @@ -title = Stashing +title = stash_title_144 cards = checkout commit-auto merge reset-hard [description] -You will encounter situations in which you are working on your project but you need to -put your current changes aside temporarily. To do so, you can use the stash function. Use - git stash push -to add your current changes to the stash stack. - ---- -tipp1 ---- -tipp2 ---- -tipp3 +stash_description_145 [setup] @@ -33,7 +23,7 @@ git checkout main [win] -# Did you stash the current changes? +# stash_win_hint_147 test "$(git stash list | wc -l)" -ge 1 [actions] @@ -42,4 +32,4 @@ test "$(git stash list | wc -l)" -ge 1 [congrats] -Nice stash you got there! :) +stash_congrats_146 diff --git a/levels/stash/stash-branch b/levels/stash/stash-branch index 16c9eaec..71b67148 100644 --- a/levels/stash/stash-branch +++ b/levels/stash/stash-branch @@ -1,21 +1,9 @@ -title = Branch from stash +title = stashbranch_title_160 cards = checkout commit-auto merge reset-hard [description] -If you want to keep your changes but they don't belong to the main branch, you can easily -create a new branch from your stashed changes. Just use - git stash branch -If you just want to use the latest stash entry, you can leave the option empty. - -Create a new branch from the stashed changes! - ---- -tipp1 ---- -tipp2 ---- -tipp3 +stashbranch_description_161 [setup] @@ -36,7 +24,7 @@ git checkout main [win] -# Did you create a new branch from the stashed changes? +# stashbranch_win_hint_163 test "$(git branch --list| wc -l)" -ge 2 [actions] @@ -45,4 +33,4 @@ test "$(git branch --list| wc -l)" -ge 2 [congrats] -Stashed changes are in a new branch! :) +stashbranch_congrats_162 diff --git a/levels/stash/stash-clear b/levels/stash/stash-clear index 9a1b6977..280589e0 100644 --- a/levels/stash/stash-clear +++ b/levels/stash/stash-clear @@ -1,24 +1,9 @@ -title = Clear the Stash +title = stashclear_title_152 cards = checkout commit-auto merge reset-hard [description] -If you want to inspect your stash stack, use the command - git stash list - -Oh, you don't want to keep your stashed changes? There are way too many? Then go ahead and clear the stack with - git stash clear -If you only want to discard a certain stash entry, you can use - git stash drop - -Clear your stash stack! - ---- -tipp1 ---- -tipp2 ---- -tipp3 +stashclear_description_153 [setup] @@ -45,7 +30,7 @@ git checkout main [win] -# Did you clear your stash stack? +# stashclear_win_hint_155 test "$(git stash list | wc -l)" -eq 0 [actions] @@ -54,4 +39,4 @@ test "$(git stash list | wc -l)" -eq 0 [congrats] -All clear! :) +stashclear_congrats_154 diff --git a/levels/stash/stash-merge b/levels/stash/stash-merge index 14ef00f8..5cc74959 100644 --- a/levels/stash/stash-merge +++ b/levels/stash/stash-merge @@ -1,20 +1,9 @@ -title = Merging popped stash +title = stashmerge_title_156 cards = checkout commit-auto merge reset-hard [description] -When you want to re-apply your changes but you already continued working on your file, you might get -a merge conflict! Let's practice this situation. -Pop the changes from the stash with - git stash pop -and resolve the merge conflict. Commit the resolved changes and clear the stash stack afterwards. - ---- -tipp1 ---- -tipp2 ---- -tipp3 +stashmerge_description_157 [setup] @@ -39,10 +28,10 @@ git add recipe [win] -# Did you resolve the conflict and commit? +# stashmerge_win_hint_158 { git show HEAD | grep "Flour"; } && { git show HEAD | grep "Salt"; } -# Did you clear stash stack? +# stashmerge_win_hint_159 test "$(git stash list | wc -l)" -eq 0 [actions] @@ -51,4 +40,4 @@ test "$(git stash list | wc -l)" -eq 0 [congrats] -Yay, you got your changes back! :) +stashpop_congrats_150 diff --git a/levels/stash/stash-pop b/levels/stash/stash-pop index 5ac12d56..e4aa28bb 100644 --- a/levels/stash/stash-pop +++ b/levels/stash/stash-pop @@ -1,19 +1,9 @@ -title = Pop from Stash +title = stashpop_title_148 cards = checkout commit-auto merge reset-hard [description] -When you stashed your changes and you want to apply them back to your current working directory, you can use - git stash pop -This will remove the changes from the stash stack. If you also want to keep the changes on the stash stack, use - git stash apply - ---- -tipp1 ---- -tipp2 ---- -tipp3 +stashpop_description_149 [setup] @@ -34,7 +24,7 @@ git checkout main [win] -# Did you pop the changes from the stash stack? +# stashpop_win_hint_151 test "$(git stash list | wc -l)" -eq 0 [actions] @@ -43,4 +33,4 @@ test "$(git stash list | wc -l)" -eq 0 [congrats] -Yay, you got your changes back! :) +stashpop_congrats_150 diff --git a/levels/tags/add-tag b/levels/tags/add-tag index 9c5703a7..33774e18 100644 --- a/levels/tags/add-tag +++ b/levels/tags/add-tag @@ -1,24 +1,9 @@ -title = Creating tags +title = addtag_title_240 cards = checkout commit-auto merge reset-hard [description] -Some of your commits may be special commits. Maybe you reached a milestone or a new version number. - -You can mark these commits with a special flag called 'tag'. - -Write - - git tag - -to tag your commit. - ---- -tipp1 ---- -tipp2 ---- -tipp3 +addtag_description_241 [setup] @@ -41,7 +26,7 @@ git checkout --detach main [win] -# Did you create a new tag? +# addtaglater_win_hint_236 test "$(git tag -l | wc -l)" -ge 1 [actions] @@ -50,4 +35,4 @@ test "$(git tag -l | wc -l)" -ge 1 [congrats] -Nice! You tagged your first commit :) +addtag_congrats_242 diff --git a/levels/tags/add-tag-later b/levels/tags/add-tag-later index 905647c5..466aa5c2 100644 --- a/levels/tags/add-tag-later +++ b/levels/tags/add-tag-later @@ -1,21 +1,9 @@ -title = Tagging later +title = addtaglater_title_233 cards = checkout commit-auto merge reset-hard [description] -But what happens if you forgot to tag your current commit? -No Prob! You can also tag older commits via - - git tag - -Tag the commit "Adding feature 2" with the name "v1"! - ---- -tipp1 ---- -tipp2 ---- -tipp3 +addtaglater_description_234 [setup] @@ -38,7 +26,7 @@ git checkout --detach main [win] -# Did you create a new tag? +# addtaglater_win_hint_236 test "$(git show v1 -s --format=%h)" = "$(git show HEAD~1 -s --format=%h)" [actions] @@ -47,4 +35,4 @@ test "$(git show v1 -s --format=%h)" = "$(git show HEAD~1 -s --format=%h)" [congrats] -Well done :) +addtaglater_congrats_235 diff --git a/levels/tags/remote-tag b/levels/tags/remote-tag index 07269156..6ea65e17 100644 --- a/levels/tags/remote-tag +++ b/levels/tags/remote-tag @@ -1,23 +1,9 @@ -title = Remote Tags +title = remotetag_title_229 cards = pull push commit-auto checkout [description] -When you work with remote repositories, tags are not pushed or pulled automatically. - -You can push a tag with - git push -Or all tags with: - git push --tags - -Deleting tags on your remote works with: - git push --delete - -You can also sync - git fetch --prune --prune-tags - - -Add a tag named "v2" to the last commit and push it to the remote. Also pull the v1 tag to your local repository. +remotetag_description_230 [setup yours] git checkout main @@ -45,10 +31,10 @@ git branch -u friend/main main git tag v1 HEAD~1 [win] -# v1 tag in your repo +# remotetag_win_hint_231 test "$(git show v1 -s --format=%h)" = "$(git show HEAD~1 -s --format=%h)" -# v2 tag in your repo +# remotetag_win_hint_232 test "$(git show v2 -s --format=%h)" = "$(git show HEAD -s --format=%h)" diff --git a/levels/tags/remove-tag b/levels/tags/remove-tag index 98f2800d..bc88bccb 100644 --- a/levels/tags/remove-tag +++ b/levels/tags/remove-tag @@ -1,20 +1,9 @@ -title = Removing tags +title = removetag_title_237 cards = checkout commit-auto merge reset-hard [description] -You added way too many tags? No prob! Delete them with - - git tag -d - -Remove all tags in this repo! - ---- -tipp1 ---- -tipp2 ---- -tipp3 +removetag_description_238 [setup] @@ -41,7 +30,7 @@ git checkout --detach main [win] -# Did you remove all tags? +# removetag_win_hint_239 test "$(git tag -l | wc -l)" -eq 0 [actions] @@ -50,4 +39,4 @@ test "$(git tag -l | wc -l)" -eq 0 [congrats] -Well done :) +addtaglater_congrats_235 diff --git a/levels/unused/checkout b/levels/unused/checkout index 9d9c9574..e375ab04 100644 --- a/levels/unused/checkout +++ b/levels/unused/checkout @@ -1,11 +1,9 @@ -title = Getting the last version +title = checkout_title_204 cards = checkout-file [description] -You've been working on your essay for a while. But - ughh! Now your cat walks over your keyboard and "helps you", so now it's all messed up! :/ - -But Git is here to help! To discard all changes your cat made, and go back to the version in the last commit, use `checkout`! +checkout_description_205 [setup] @@ -27,5 +25,5 @@ blaaaargh" > essay.txt [win] -# Restore the version from the last commit. +# checkout_win_hint_206 cat essay.txt | grep D diff --git a/levels/unused/clone b/levels/unused/clone index 8459c082..84cba586 100644 --- a/levels/unused/clone +++ b/levels/unused/clone @@ -1,9 +1,9 @@ -title = Cloning a repo +title = clone_title_168 cards = clone commit-auto pull push [description] -Get your friend's repo using clone, change something, push it back. +clone_description_169 [setup] diff --git a/levels/unused/commit b/levels/unused/commit index fd84cc92..a32dd60e 100644 --- a/levels/unused/commit +++ b/levels/unused/commit @@ -1,9 +1,9 @@ -title = Make a commit \o/ +title = commit_title_188 cards = add reset checkout commit [description] -For practice, make a commit where all files contain an "x"! +commit_description_189 [setup] @@ -19,9 +19,9 @@ echo c > c [win] -# File a contains "x" in the last main commit. +# commit_win_hint_190 test "$(git show main:a)" = x -# File b contains "x" in the last main commit. +# commit_win_hint_191 test "$(git show main:b)" = x -# File c contains "x" in the last main commit. +# commit_win_hint_192 test "$(git show main:c)" = x diff --git a/levels/unused/commit-a b/levels/unused/commit-a index 747a0094..31baa75c 100644 --- a/levels/unused/commit-a +++ b/levels/unused/commit-a @@ -1,13 +1,9 @@ -title = Make a commit, but faster! +title = commita_title_176 cards = add reset checkout commit commit-a [description] -There is a time-saving trick, where instead of a plain `git commit`, you can use - - git commit -a - -This will automatically add all changes you made to local files! Very convenient. +commita_description_177 [setup] @@ -22,5 +18,5 @@ echo x > c [win] -# Make a commit where all files contain "x". +# commita_win_hint_178 test "$(git show main:a)" = x && test "$(git show main:b)" = x && test "$(git show main:c)" = x diff --git a/levels/unused/fetch b/levels/unused/fetch index 377355ab..ae08fd61 100644 --- a/levels/unused/fetch +++ b/levels/unused/fetch @@ -1,13 +1,9 @@ -title = Fetching from remotes +title = fetch_title_196 cards = checkout fetch commit-auto [description] -Here, you already have two remotes configured! You can list them using `git remote`. - -Fetch from both, and look at the suggestions. - -Then, make a new commit on top of your original one that introduces a compromise. +fetch_description_197 [setup] @@ -29,7 +25,7 @@ git commit -am "Blue" [win] -# Your proposal is acceptable for friend1. +# fetch_win_hint_198 git show main:proposal | git grep green -# Your proposal is acceptable for friend2. +# fetch_win_hint_199 git show main:proposal | git grep blue diff --git a/levels/unused/files-move b/levels/unused/files-move index 8f657102..8f620427 100644 --- a/levels/unused/files-move +++ b/levels/unused/files-move @@ -1,11 +1,9 @@ -title = No sleep required +title = filesmove_title_179 cards = file-new file-delete file-rename [description] -Actually, you decide that you don't need any sleep. - -Because of that, you won't require a bed, and can build some other piece of furniture from the wood! +filesmove_description_180 [setup] @@ -16,12 +14,10 @@ echo A comfortable, yellow bed with yellow cushions. > bed [win] -# Rename the bed into something else, and give it a new description! +# filesmove_win_hint_182 NUM_FILES="$(ls | wc -l)" ! test -f bed && test "$NUM_FILES" -ge 3 && ! grep -r "yellow bed" . [congrats] -Neat! It even still looks a bit comfortable! - -You head out, eager for your first lesson at time travel school! +filesmove_congrats_181 diff --git a/levels/unused/index-mv b/levels/unused/index-mv index 9ff72704..014d86b3 100644 --- a/levels/unused/index-mv +++ b/levels/unused/index-mv @@ -1,13 +1,9 @@ -title = Rename a file in the next commit +title = indexmv_title_210 cards = add reset-file checkout-file mv commit [description] -Other times, you might want to rename a file in the next commit. Use - - git mv [file] [new name] - -for that. The effect is very similar as if you had created a copy with a new name, and removed the old version. +indexmv_description_211 [setup] @@ -22,5 +18,5 @@ git add b [win] -# Make a commit where you rename the file b to "x". +# indexmv_win_hint_212 test "$(git ls-tree --name-only main)" = "$(echo -e "a\nc\nx")" diff --git a/levels/unused/init b/levels/unused/init index c76daa5e..de6b0a11 100644 --- a/levels/unused/init +++ b/levels/unused/init @@ -1,4 +1,4 @@ -title = Welcome! +title = init_title_170 cards = init [description] @@ -10,5 +10,5 @@ rm -rf .git [win] -# Again, initialize your time machine! +# init_win_hint_171 test -d .git diff --git a/levels/unused/pull-push b/levels/unused/pull-push index 71ce61d3..c2884772 100644 --- a/levels/unused/pull-push +++ b/levels/unused/pull-push @@ -1,15 +1,9 @@ -title = Helping each other +title = pullpush_title_193 cards = checkout commit-auto reset-hard pull push [description] -The events and timelines you see are always only what your own time machine knows about! - -Of course, time agents don't have to work alone! Here, your sidekick has already prepared a merge for you! You can use the "pull" card to transfer it to your own time machine. - -Then, add another event on top (what does Sam have for dinner?), and `push` the result, to transfer it back to your sidekick! - -You can only ever manipulate things in your own time machine (the one on the bottom). +pullpush_description_194 [setup yours] @@ -48,4 +42,4 @@ git rev-parse main^^ && test "$(git rev-parse main^^1^)" = "$(git rev-parse main [congrats] -In reality, in many cases, a lot of time agents work together to build a really good future together! :) +pullpush_congrats_195 diff --git a/levels/unused/remotes-add b/levels/unused/remotes-add index db24b7da..d98608dd 100644 --- a/levels/unused/remotes-add +++ b/levels/unused/remotes-add @@ -1,19 +1,9 @@ -title = Adding a remote +title = remotesadd_title_200 cards = checkout [description] -Let's work together with others! Your friend has their own repo at the URL `../friend` - you can add it using - - git remote add [name] [URL] - -where `[name]` is an arbitrary, short name you pick for the remote. - -When you've done that, you can get all commits from that remote using - - git pull friend - -There's a letter for you! +remotesadd_description_201 [setup] @@ -27,7 +17,7 @@ git commit -m "Write a letter" [win] -# Add a remote that points to ../friend. +# remotesadd_win_hint_202 git remote -v | grep '../friend' -# Pull from the remote. +# remotesadd_win_hint_203 git show HEAD:love_letter | grep committed diff --git a/levels/unused/remotes-delete b/levels/unused/remotes-delete index c0262047..2827239b 100644 --- a/levels/unused/remotes-delete +++ b/levels/unused/remotes-delete @@ -1,9 +1,9 @@ -title = Deleting and renaming a remote +title = remotesdelete_title_183 cards = checkout [description] -Here, you already have two remotes configured! You can list them using `git remote`. +remotesdelete_description_184 [setup] @@ -15,9 +15,9 @@ git remote rename friend frend [win] -# Rename the remote with the typo (using `git remote rename [old name] [new name]`) +# remotesdelete_win_hint_185 git remote | grep friend -# The remote with the typo is gone. +# remotesdelete_win_hint_186 ! grep 'frend' <(git remote) -# Delete the remote you don't want to keep (using `git remote remove [remote]`) +# remotesdelete_win_hint_187 ! grep 'enemy' <(git remote) diff --git a/levels/unused/restore b/levels/unused/restore index 1f9961e7..bbca6ac9 100644 --- a/levels/unused/restore +++ b/levels/unused/restore @@ -1,11 +1,9 @@ -title = Looking into the past +title = restore_title_207 cards = checkout-from [description] -You've been working on your essay for a while. But you're not happy with the changes you've made recently. You want to go back to the version called "Best version"! - -No problem, you can use the `checkout` card to restore your essay from an older commit! +restore_description_208 [setup] @@ -24,5 +22,5 @@ git commit -a -m "Less-good version" [win] -# For nostalgic reasons, restore the very first backup you made! +# restore_win_hint_209 diff essay.txt <(echo "Best version") diff --git a/levels/unused/split b/levels/unused/split index 274b792b..77a38046 100644 --- a/levels/unused/split +++ b/levels/unused/split @@ -1,9 +1,9 @@ -title = Split a commit! +title = split_title_172 cards = checkout commit reset-hard reset add rebase-interactive rebase-continue show [description] -Here, both changes happened in one commit! Split them to be in two commits instead. +split_description_173 [setup] diff --git a/levels/unused/steps b/levels/unused/steps index cb848615..c336a842 100644 --- a/levels/unused/steps +++ b/levels/unused/steps @@ -1,11 +1,9 @@ -title = One step after another +title = steps_title_174 cards = checkout commit reset-hard add [description] -Sometimes, you might want to record the order in which things changed, instead of making a single commit. - -What happened here? Make two commits from the changes (using the "add" card), in an order that makes sense! +steps_description_175 [setup] diff --git a/levels/unused/who-are-you b/levels/unused/who-are-you index f06137ca..0d2dd568 100644 --- a/levels/unused/who-are-you +++ b/levels/unused/who-are-you @@ -1,12 +1,9 @@ -title = Nice to meet you! +title = whoareyou_title_164 cards = config-name config-email [description] -Introduce yourself using - - git config --global user.name Firstname - git config --global user.email "your@mail.com" +whoareyou_description_165 [setup] @@ -16,8 +13,8 @@ test "$(git config user.name)" != "You" && hint "Hey $(git config user.name), ni [win] -# Have a name configured. +# whoareyou_win_hint_166 test "$(git config user.name)" != "You" -# Have an email address configured. +# whoareyou_win_hint_167 test "$(git config user.email)" != "you@time.agency" diff --git a/levels/workflows/gitignore b/levels/workflows/gitignore index dc55243c..d59b11f4 100644 --- a/levels/workflows/gitignore +++ b/levels/workflows/gitignore @@ -1,10 +1,8 @@ -title = Ignoring files +title = gitignore_title_265 [description] -That chicken is running around a lot, and changing often. We don't want to have it in our commits. - -Add it to the file .gitignore, and try using `git add .`! +gitignore_description_266 [setup] diff --git a/levels/workflows/pr b/levels/workflows/pr index 2496c1fd..5d54b54e 100644 --- a/levels/workflows/pr +++ b/levels/workflows/pr @@ -1,9 +1,9 @@ -title = Cloning a repo +title = clone_title_168 cards = clone commit-auto reset-hard checkout file-new branch [description] -Your friend has a problem! Clone the repo located in `../friend`, create a branch called "solution", and fix the problem in this branch. When you're ready, make a "Pull Request" by using `git tag pr`. +pr_description_267 [setup] diff --git a/nodes/blob.svg.import b/nodes/blob.svg.import index 725b562c..bcb068aa 100644 --- a/nodes/blob.svg.import +++ b/nodes/blob.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/nodes/commit.svg.import b/nodes/commit.svg.import index d47ebc67..86b4574d 100644 --- a/nodes/commit.svg.import +++ b/nodes/commit.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/nodes/document.svg.import b/nodes/document.svg.import index 4c5b7391..d038a7ff 100644 --- a/nodes/document.svg.import +++ b/nodes/document.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/nodes/head.svg.import b/nodes/head.svg.import index f0116190..db9e9e9f 100644 --- a/nodes/head.svg.import +++ b/nodes/head.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/nodes/head1.svg.import b/nodes/head1.svg.import index 0888d00d..6ad89b10 100644 --- a/nodes/head1.svg.import +++ b/nodes/head1.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/nodes/head2.svg.import b/nodes/head2.svg.import index 92a04d20..f1fd364c 100644 --- a/nodes/head2.svg.import +++ b/nodes/head2.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/nodes/head3.svg.import b/nodes/head3.svg.import index 7ba33f45..1641097d 100644 --- a/nodes/head3.svg.import +++ b/nodes/head3.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/nodes/pop.wav.import b/nodes/pop.wav.import index f7152c58..e59a702a 100644 --- a/nodes/pop.wav.import +++ b/nodes/pop.wav.import @@ -17,5 +17,7 @@ force/max_rate=false force/max_rate_hz=44100 edit/trim=false edit/normalize=false -edit/loop=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 compress/mode=0 diff --git a/nodes/ref.svg.import b/nodes/ref.svg.import index 1ad858de..a7b3421c 100644 --- a/nodes/ref.svg.import +++ b/nodes/ref.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/nodes/tree.svg.import b/nodes/tree.svg.import index 8192b20a..f613eafb 100644 --- a/nodes/tree.svg.import +++ b/nodes/tree.svg.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/project.godot b/project.godot index ce54de4f..d91ca6c0 100644 --- a/project.godot +++ b/project.godot @@ -105,22 +105,22 @@ down={ } click={ "deadzone": 0.5, -"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"doubleclick":false,"script":null) ] } zoom_in={ "deadzone": 0.5, -"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":4,"pressed":false,"doubleclick":false,"script":null) +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"doubleclick":false,"script":null) ] } zoom_out={ "deadzone": 0.5, -"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":5,"pressed":false,"doubleclick":false,"script":null) +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"doubleclick":false,"script":null) ] } right_click={ "deadzone": 0.5, -"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"pressed":false,"doubleclick":false,"script":null) +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"doubleclick":false,"script":null) ] } tab_complete={ @@ -149,6 +149,10 @@ mute={ ] } +[locale] + +translations=PoolStringArray( "res://translations.en.translation", "res://translations.ru.translation" ) + [network] limits/debugger_stdout/max_chars_per_second=100000 diff --git a/resources/cards.json b/resources/cards.json index 631a7e59..8c8e683a 100644 --- a/resources/cards.json +++ b/resources/cards.json @@ -2,181 +2,181 @@ { "id": "init", "command": "git init", - "description": "Drag this card into the empty space above to initialize the time machine!" + "description": "card_init_desc_313" }, { "id": "clone", "command": "git clone ../[remote] .", - "description": "Create your own copy of someone else's repo." + "description": "card_clone_desc_314" }, { "id": "config-name", "command": "git config --global user.name [string]", - "description": "Set your name.\n\n(Will not change anything outside of this game.)" + "description": "card_configname_desc_315" }, { "id": "config-email", "command": "git config --global user.email [string]", - "description": "Set your email address." + "description": "card_configemail_desc_316" }, { "id": "checkout", "command": "git checkout [commit, ref]", - "description": "Drag this card to a commit or to a branch to travel to it!" + "description": "card_checkout_desc_317" }, { "id": "checkout-file", "command": "git checkout [file]", - "description": "Reset changes in a local file." + "description": "card_checkoutfile_desc_318" }, { "id": "checkout-from", "command": "git checkout [commit, ref] [file]", - "description": "Get the file contents from the specified commits, and reset both the working directory, as well as the index, to it." + "description": "card_checkoutfrom_desc_319" }, { "id": "commit-a", "command": "git commit -a", - "description": "Make a new commit, after automatically adding all changes to the index.\nYou'll be asked to enter a short description of what you changed." + "description": "card_commita_desc_320" }, { "id": "commit-auto", "command": "git add .; git commit", - "description": "Make a new commit containing your current environment! Type in a description of what changed!" + "description": "card_commitauto_desc_321" }, { "id": "merge", "command": "git merge [commit, ref]", - "description": "Merge the specified timeline into yours. If necessary, will create a merge commit." + "description": "card_merge_desc_322" }, { "id": "merge-abort", "command": "git merge --abort", - "description": "Abort the current merge attempt, and reconstruct the previous state." + "description": "card_mergeabort_desc_323" }, { "id": "rebase", "command": "git rebase [commit]", - "description": "Put the events in your current timeline on top of the specified one." + "description": "card_rebase_desc_324" }, { "id": "pull", "command": "git pull", - "description": "Get someone else's version of the current timeline, and try to merge it into yours." + "description": "card_pull_desc_325" }, { "id": "fetch", "command": "git fetch [remote]", - "description": "Get a someone else's version of the current timeline." + "description": "card_fetch_desc_326" }, { "id": "push", "command": "git push", - "description": "Give the current timeline to someone else." + "description": "card_push_desc_327" }, { "id": "rebase-interactive", "command": "git rebase -i [commit]", - "description": "Make changes to the events in your current timeline, back to the commit you drag this to." + "description": "card_rebaseinteractive_desc_328" }, { "id": "rebase-continue", "command": "git rebase --continue", - "description": "Continue the current rebasing process." + "description": "card_rebasecontinue_desc_329" }, { "id": "reset-hard", "command": "git reset --hard [commit]", - "description": "Move the branch you're on to the specified commit." + "description": "card_resethard_desc_330" }, { "id": "reset", "command": "git reset [commit]", - "description": "Jump to the commit, and update the index. Keep the current environment." + "description": "card_reset_desc_331" }, { "id": "reset-file", "command": "git reset [file]", - "description": "Reset the index version of a file to the version in the commit you're on." + "description": "card_resetfile_desc_332" }, { "id": "cherry-pick", "command": "git cherry-pick [commit]", - "description": "Repeat the specified action on top of your current timeline." + "description": "card_cherrypick_desc_333" }, { "id": "revert", "command": "git revert [commit]", - "description": "Make a new commit that reverts the changes of the specified commit." + "description": "card_revert_desc_334" }, { "id": "bisect-start", "command": "git bisect start", - "description": "Start looking for the commit where things got bad." + "description": "card_bisectstart_desc_335" }, { "id": "bisect-good", "command": "git bisect good", - "description": "State that the current commit is good! When you're automatically transferred, keep playing the `good` and `bad` cards!" + "description": "card_bisectgood_desc_336" }, { "id": "bisect-bad", "command": "git bisect bad", - "description": "State that the current commit is bad! When you're automatically transferred, keep playing the `good` and `bad` cards!" + "description": "card_bisectbad_desc_337" }, { "id": "add", "command": "git add [file]", - "description": "Update the index version of the file to its current real content." + "description": "card_add_desc_338" }, { "id": "rm", "command": "git rm [file]", - "description": "Delete a file both in the working directory, as well as the index." + "description": "card_rm_desc_339" }, { "id": "commit", "command": "git commit", - "description": "Make a commit from the current index." + "description": "card_commit_desc_340" }, { "id": "show", "command": "git show [commit]", - "description": "Show what changed in the commit." + "description": "card_show_desc_341" }, { "id": "branch", "command": "git branch [string]", - "description": "Create a new branch at your current location." + "description": "card_branch_desc_342" }, { "id": "branch-delete", "command": "git branch -D [ref]", - "description": "Delete a branch." + "description": "card_branchdelete_desc_343" }, { "id": "reflog", "command": "git reflog [ref, head]", - "description": "Display a log of where the ref pointed to in the past." + "description": "card_reflog_desc_344" }, { "id": "file-new", "command": "touch [string]", - "description": "Create a new file." + "description": "card_filenew_desc_345" }, { "id": "file-delete", "command": "rm [file]", - "description": "Delete a file." + "description": "card_filedelete_desc_346" }, { "id": "file-rename", "command": "mv [file] [string]", - "description": "Rename a file." + "description": "card_filerename_desc_347" }, { "id": "file-copy", "command": "cp [file] [string]", - "description": "Make a copy of a file." + "description": "card_filecopy_desc_348" } -] +] \ No newline at end of file diff --git a/scenes/arrow.tscn b/scenes/arrow.tscn index 53c1d62c..dc40d3ea 100644 --- a/scenes/arrow.tscn +++ b/scenes/arrow.tscn @@ -32,7 +32,7 @@ margin_right = 20.626 margin_bottom = 8.06915 custom_fonts/font = ExtResource( 1 ) custom_colors/font_color = Color( 1, 1, 1, 1 ) -text = "label" +text = "arrow_id_004" align = 1 __meta__ = { "_edit_use_anchors_": false @@ -45,7 +45,7 @@ margin_right = 231.16 margin_bottom = 68.1225 custom_fonts/font = ExtResource( 1 ) custom_colors/font_color = Color( 0.356863, 0.356863, 0.356863, 1 ) -text = "label" +text = "arrow_id_004" align = 1 __meta__ = { "_edit_use_anchors_": false diff --git a/scenes/card.gd b/scenes/card.gd index 8c97c5a7..c1cea7c1 100644 --- a/scenes/card.gd +++ b/scenes/card.gd @@ -104,7 +104,7 @@ func set_command(new_command): #$Label.text = command func set_description(new_description): - description = new_description + description = game.tr_custom(new_description) $Description.text = description func set_energy(new_energy): diff --git a/scenes/card.tscn b/scenes/card.tscn index 55c230fc..1bfe8a53 100644 --- a/scenes/card.tscn +++ b/scenes/card.tscn @@ -122,7 +122,7 @@ margin_right = 90.0 margin_bottom = -14.0 custom_fonts/font = ExtResource( 7 ) custom_colors/font_color = Color( 0, 0, 0, 1 ) -text = "Description" +text = "card_description_001" autowrap = true __meta__ = { "_edit_use_anchors_": false @@ -141,7 +141,7 @@ margin_right = -17.1637 margin_bottom = -16.4558 rect_scale = Vector2( 3, 3 ) custom_fonts/font = ExtResource( 1 ) -text = "0" +text = "card_energy_002" align = 1 valign = 1 __meta__ = { diff --git a/scenes/cards.tscn b/scenes/cards.tscn index 1fc2fcc0..33344c37 100644 --- a/scenes/cards.tscn +++ b/scenes/cards.tscn @@ -31,7 +31,7 @@ margin_top = 16.0 margin_right = -16.0 margin_bottom = 47.0 custom_fonts/font = ExtResource( 1 ) -text = "Draw new cards" +text = "cards_button_005" __meta__ = { "_edit_use_anchors_": false } @@ -45,7 +45,7 @@ margin_right = 68.2219 margin_bottom = 65.6766 rect_scale = Vector2( 2, 2 ) custom_fonts/font = ExtResource( 2 ) -text = "3" +text = "cards_energy_006" __meta__ = { "_edit_use_anchors_": false } diff --git a/scenes/file_browser.tscn b/scenes/file_browser.tscn index cbc6bec7..562ae1ab 100644 --- a/scenes/file_browser.tscn +++ b/scenes/file_browser.tscn @@ -4,9 +4,7 @@ [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=2] [ext_resource path="res://styles/theme.tres" type="Theme" id=3] -[node name="FileBrowser" type="Control" groups=[ -"editors", -]] +[node name="FileBrowser" type="Control" groups=["editors"]] anchor_right = 1.0 anchor_bottom = 1.0 rect_min_size = Vector2( 0, 142 ) @@ -48,7 +46,7 @@ __meta__ = { visible = false margin_right = 1904.0 margin_bottom = 29.0 -text = "title" +text = "file_browser_title_033" align = 1 [node name="Breadcrumbs" type="HBoxContainer" parent="Panel/Margin/Rows"] @@ -61,13 +59,13 @@ custom_constants/separation = 8 [node name="Button" type="Button" parent="Panel/Margin/Rows/Breadcrumbs"] margin_right = 55.0 margin_bottom = 50.0 -text = "root" +text = "file_browser_button_034" [node name="Button2" type="Button" parent="Panel/Margin/Rows/Breadcrumbs"] margin_left = 63.0 margin_right = 104.0 margin_bottom = 50.0 -text = "dir" +text = "file_browser_button2_035" [node name="Scroll" type="ScrollContainer" parent="Panel/Margin/Rows"] margin_right = 1904.0 @@ -108,7 +106,7 @@ margin_bottom = -14.399 focus_mode = 0 custom_fonts/font = ExtResource( 2 ) enabled_focus_mode = 0 -text = "Save" +text = "file_browser_savebutton_036" __meta__ = { "_edit_use_anchors_": false } @@ -131,5 +129,6 @@ __meta__ = { [node name="PopupMenu" type="PopupMenu" parent="."] margin_right = 20.0 margin_bottom = 20.0 + [connection signal="pressed" from="Panel/TextEdit/SaveButton" to="." method="save"] [connection signal="pressed" from="Panel/TextEdit/CloseButton" to="." method="close"] diff --git a/scenes/file_browser_item.tscn b/scenes/file_browser_item.tscn index d623e756..bd60114f 100644 --- a/scenes/file_browser_item.tscn +++ b/scenes/file_browser_item.tscn @@ -115,7 +115,7 @@ rect_min_size = Vector2( 0, 40 ) size_flags_vertical = 7 size_flags_stretch_ratio = 0.0 custom_fonts/font = ExtResource( 2 ) -text = "filename" +text = "file_browser_item_label_039" align = 1 autowrap = true diff --git a/scenes/game.gd b/scenes/game.gd index 5c62ab3f..fec9255f 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -12,6 +12,9 @@ var current_chapter = 0 var current_level = 0 var skipped_title = false +var translations = {} +var current_locale = "en" + var _file = "user://savegame.json" var state = {} @@ -21,6 +24,8 @@ func _ready(): mutex = Mutex.new() load_state() + TranslationServer.set_locale("en") + if OS.has_feature("standalone"): get_tree().set_auto_accept_quit(false) else: @@ -160,3 +165,49 @@ func new_shell(): return BetterShell.new() else: return Shell.new() + +# --- ДОБАВИТЬ ЭТИ ДВЕ ФУНКЦИИ В КОНЕЦ ФАЙЛА --- + +# Загружает наш CSV в словарь для быстрого доступа +func _load_translations(): + var file = File.new() + if not file.file_exists("res://translations.csv"): + print_debug("Локализация: Файл translations.csv не найден.") + return + + file.open("res://translations.csv", File.READ) + var headers = file.get_csv_line() # Пропускаем первую строку с заголовками + + while not file.eof_reached(): + var line = file.get_csv_line() + # Проверяем, что в строке есть все нужные столбцы + if line != null and line.size() >= 3: + var key = line[0] + var en_text = line[1] + var ru_text = line[2] + translations[key] = {"en": en_text, "ru": ru_text} + file.close() + +# Наша собственная функция перевода +# Улучшенная, "безопасная" версия функции +func tr_custom(key): + # Если ключ - это не строка, всегда возвращаем ПУСТУЮ СТРОКУ, а не Nil. + if typeof(key) != TYPE_STRING: + return "" + + if translations.has(key) and translations[key].has(current_locale): + var translated_text = translations[key][current_locale] + # Эта проверка гарантирует, что мы не вернем null/Nil + if translated_text != null and translated_text != "": + return translated_text + # Если перевод пустой, возвращаем английский текст + var en_text = translations[key]["en"] + return en_text if en_text != null else "" + + # Если ключ не найден, возвращаем сам ключ (или пустую строку, если ключ пустой) + return key if key != null else "" + +func _init(): + # --- ПРИВЕСТИ ФУНКЦИЮ _init() К ТАКОМУ ВИДУ --- + _load_translations() + current_locale = "ru" diff --git a/scenes/level.gd b/scenes/level.gd index 97c17466..9c24606d 100644 --- a/scenes/level.gd +++ b/scenes/level.gd @@ -20,14 +20,24 @@ func load(path): # This is a new-style level. var config = helpers.parse(path) - title = config.get("title", slug) - description = config.get("description", "(no description)") + # --- НАЧАЛО БЛОКА ЛОКАЛИЗАЦИИ --- + # 1. Сначала получаем КЛЮЧИ из файла уровня. + # "default_..." - это запасные ключи, если в файле уровня чего-то нет. + var title_key = config.get("title", "default_title_key") + var description_key = config.get("description", "default_description_key") + var congrats_key = config.get("congrats", "default_congrats_key") - # Surround all lines indented with four spaces with [code] tags. + # 2. Теперь ПЕРЕВОДИМ ключи с помощью нашего глобального переводчика из game.gd. + title = game.tr_custom(title_key) + var description_text = game.tr_custom(description_key) + congrats = game.tr_custom(congrats_key) + # --- КОНЕЦ БЛОКА ЛОКАЛИЗАЦИИ --- + + # 3. Дальше идет оригинальная обработка УЖЕ ПЕРЕВЕДЕННОГО текста description. var monospace_regex = RegEx.new() monospace_regex.compile("\\n ([^\\n]*)") - description = monospace_regex.sub(description, "\n [code][color=#e1e160]$1[/color][/code]", true) - description = description.split("---") + description_text = monospace_regex.sub(description_text, "\n [code][color=#e1e160]$1[/color][/code]", true) + description = description_text.split("---") var cli_hints = config.get("cli", "") # Also do this substitution in the CLI hints. @@ -42,7 +52,7 @@ func load(path): if cli_hints != "": description[0] = description[0] + "\n\n[color=#787878]"+cli_hints+"[/color]" - congrats = config.get("congrats", "Good job, you solved the level!\n\nFeel free to try a few more things or click 'Next level'.") + # Этот код остается без изменений, так как он не работает с переводимым текстом cards = Array(config.get("cards", "").split(" ")) if cards == [""]: cards = [] @@ -78,10 +88,16 @@ func load(path): else: repo = "yours" - var desc = "Complete the goal of this level" + # Наш "защитный" код от ошибки, которую мы исправили ранее + if not repos.has(repo): + repos[repo] = LevelRepo.new() + + var desc = game.tr_custom(config.get("win_desc", "default_win_desc_key")) for line in Array(config[k].split("\n")): if line.length() > 0 and line[0] == "#": - desc = line.substr(1).strip_edges(true, true) + # --- ДОПОЛНИТЕЛЬНОЕ ИЗМЕНЕНИЕ: ПЕРЕВОДИМ ПОДСКАЗКИ В [WIN] --- + var hint_key = line.substr(1).strip_edges(true, true) + desc = game.tr_custom(hint_key) else: if not repos[repo].win_conditions.has(desc): repos[repo].win_conditions[desc] = "" @@ -96,9 +112,6 @@ func load(path): repos[repo].action_commands = config[k] -# for desc in repos[repo].win_conditions: -# print("Desc: " + desc) -# print("Commands: " + repos[repo].win_conditions[desc]) else: helpers.crash("Level %s does not exist." % path) @@ -106,7 +119,6 @@ func load(path): repos[repo].path = game.tmp_prefix+"repos/%s/" % repo repos[repo].slug = repo - func construct(): for r in repos: diff --git a/scenes/level_select.tscn b/scenes/level_select.tscn index 2f8e4f3a..132ec447 100644 --- a/scenes/level_select.tscn +++ b/scenes/level_select.tscn @@ -47,7 +47,7 @@ margin_left = 61.0902 margin_top = 59.0538 margin_right = 126.09 margin_bottom = 98.0538 -text = "Back" +text = "main_backbutton_016" __meta__ = { "_edit_use_anchors_": false } @@ -59,7 +59,7 @@ margin_right = 226.588 margin_bottom = 98.3009 focus_mode = 0 enabled_focus_mode = 0 -text = "Reload" +text = "main_reloadbutton2_017" __meta__ = { "_edit_use_anchors_": false } @@ -86,7 +86,7 @@ margin_bottom = 118.0 custom_styles/hover = SubResource( 1 ) custom_styles/focus = ExtResource( 3 ) custom_styles/normal = ExtResource( 3 ) -text = "To the survey /o/" +text = "level_select_button3_029" __meta__ = { "_edit_use_anchors_": false } diff --git a/scenes/main.tscn b/scenes/main.tscn index e19dec2e..cc8e4865 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -102,7 +102,7 @@ margin_bottom = 60.0 rect_min_size = Vector2( 0, 60 ) size_flags_stretch_ratio = 0.0 custom_fonts/normal_font = ExtResource( 7 ) -text = "Level name here!" +text = "main_levelname_014" fit_content_height = true scroll_active = false __meta__ = { @@ -120,8 +120,8 @@ anchor_right = 1.0 anchor_bottom = 1.0 size_flags_vertical = 3 bbcode_enabled = true -bbcode_text = "Level description here!" -text = "Level description here!" +bbcode_text = "main_leveldescription_015" +text = "main_leveldescription_015" __meta__ = { "_edit_use_anchors_": false } @@ -132,8 +132,8 @@ anchor_right = 1.0 anchor_bottom = 1.0 size_flags_vertical = 3 bbcode_enabled = true -bbcode_text = "Level description here!" -text = "Level description here!" +bbcode_text = "main_leveldescription_015" +text = "main_leveldescription_015" __meta__ = { "_edit_use_anchors_": false } @@ -211,7 +211,7 @@ margin_right = 65.0 margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 -text = "Back" +text = "main_backbutton_016" __meta__ = { "_edit_use_anchors_": false } @@ -222,7 +222,7 @@ margin_right = 161.0 margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 -text = "Reload" +text = "main_reloadbutton2_017" __meta__ = { "_edit_use_anchors_": false } @@ -234,7 +234,7 @@ margin_right = 539.0 margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 -text = "Cards!" +text = "main_cardsbutton_018" __meta__ = { "_edit_use_anchors_": false } @@ -246,7 +246,7 @@ margin_right = 225.0 margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 -text = "Tip!" +text = "main_tip_019" __meta__ = { "_edit_use_anchors_": false } @@ -272,7 +272,7 @@ focus_mode = 0 custom_styles/hover = SubResource( 2 ) custom_styles/normal = ExtResource( 4 ) enabled_focus_mode = 0 -text = "Next level" +text = "main_nextlevelbutton_020" __meta__ = { "_edit_use_anchors_": false } diff --git a/scenes/music_button.tscn b/scenes/music_button.tscn index 70f47b04..9dc422e3 100644 --- a/scenes/music_button.tscn +++ b/scenes/music_button.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=2 format=2] +[gd_scene load_steps=3 format=2] -[ext_resource path="res://scenes/music_button.gd" type="Script" id=1] +[ext_resource path="res://scripts/translator.gd" type="Script" id=1] +[ext_resource path="res://scenes/music_button.gd" type="Script" id=2] [node name="Button3" type="Button"] margin_left = 241.005 @@ -9,9 +10,10 @@ margin_right = 387.005 margin_bottom = 97.856 focus_mode = 0 enabled_focus_mode = 0 -text = "Toggle music" +text = "music_button_button3_003" +script = ExtResource( 2 ) + +[node name="translator" type="Node" parent="."] script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} + [connection signal="pressed" from="." to="." method="toggle_music"] diff --git a/scenes/no_git.tscn b/scenes/no_git.tscn index b4cad7c8..8938f988 100644 --- a/scenes/no_git.tscn +++ b/scenes/no_git.tscn @@ -30,7 +30,7 @@ margin_right = 1138.2 margin_bottom = 601.117 custom_fonts/font = ExtResource( 5 ) custom_colors/font_color = Color( 0.533333, 0.392157, 0.392157, 1 ) -text = "by bleeptrack & blinry" +text = "title_label2_007" align = 1 __meta__ = { "_edit_use_anchors_": false @@ -43,7 +43,7 @@ margin_right = 1216.13 margin_bottom = 628.398 custom_fonts/font = ExtResource( 5 ) custom_colors/font_color = Color( 0.533333, 0.392157, 0.392157, 1 ) -text = "Original score by winniehell" +text = "title_label3_008" align = 1 __meta__ = { "_edit_use_anchors_": false @@ -62,18 +62,18 @@ __meta__ = { visible = false margin_right = 351.0 margin_bottom = 39.0 -text = "Levels" +text = "title_button_009" [node name="Button3" type="Button" parent="VBoxContainer"] visible = false margin_right = 351.0 margin_bottom = 39.0 -text = "Sandbox" +text = "title_button3_010" [node name="Button2" type="Button" parent="VBoxContainer"] margin_right = 351.0 margin_bottom = 39.0 -text = "Sure, I'll install it!" +text = "no_git_button2_030" [node name="Sprite" type="Sprite" parent="."] diff --git a/scenes/node.tscn b/scenes/node.tscn index 643a44cf..ff22ad0b 100644 --- a/scenes/node.tscn +++ b/scenes/node.tscn @@ -52,7 +52,7 @@ margin_right = 129.073 margin_bottom = 40.9903 custom_fonts/font = ExtResource( 1 ) custom_colors/font_color = Color( 1, 1, 1, 1 ) -text = "object_id" +text = "node_id_028" __meta__ = { "_edit_use_anchors_": false } diff --git a/scenes/notification.tscn b/scenes/notification.tscn index 5d944e0d..2278e0d6 100644 --- a/scenes/notification.tscn +++ b/scenes/notification.tscn @@ -34,7 +34,7 @@ margin_top = 13.0 margin_right = -15.0 margin_bottom = -15.0 custom_fonts/font = ExtResource( 1 ) -text = "This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint!" +text = "notification_label_031" autowrap = true __meta__ = { "_edit_use_anchors_": false @@ -56,7 +56,7 @@ margin_right = 282.0 margin_bottom = 48.0 focus_mode = 0 enabled_focus_mode = 0 -text = "Got it!" +text = "notification_ok_032" __meta__ = { "_edit_use_anchors_": false } diff --git a/scenes/repository.tscn b/scenes/repository.tscn index 566b5e88..74e490b6 100644 --- a/scenes/repository.tscn +++ b/scenes/repository.tscn @@ -53,7 +53,7 @@ margin_top = -64.5048 margin_right = 229.063 margin_bottom = -8.50476 custom_fonts/font = ExtResource( 3 ) -text = "Repo name" +text = "repository_label_024" __meta__ = { "_edit_use_anchors_": false } @@ -64,7 +64,7 @@ margin_left = 21.0 margin_top = 65.0 margin_right = 377.0 margin_bottom = 108.0 -text = "Index:" +text = "repository_indexlabel_025" __meta__ = { "_edit_use_anchors_": false } @@ -75,7 +75,7 @@ margin_left = 36.5602 margin_top = 67.9891 margin_right = 119.56 margin_bottom = 109.989 -text = "Update" +text = "repository_button_026" __meta__ = { "_edit_use_anchors_": false } @@ -90,7 +90,7 @@ margin_right = -15.7146 margin_bottom = 42.9594 focus_mode = 0 enabled_focus_mode = 0 -text = "Hide trees and blobs" +text = "repository_simplifycheckbox_027" __meta__ = { "_edit_use_anchors_": false } diff --git a/scenes/survey.tscn b/scenes/survey.tscn index 4a0d95f9..25deab82 100644 --- a/scenes/survey.tscn +++ b/scenes/survey.tscn @@ -27,7 +27,7 @@ margin_top = 234.592 margin_right = 1034.46 margin_bottom = 290.592 custom_fonts/font = ExtResource( 4 ) -text = "Oh My Git!" +text = "survey_label_012" __meta__ = { "_edit_use_anchors_": false } @@ -39,7 +39,7 @@ margin_right = 1115.7 margin_bottom = 353.059 custom_colors/font_color = Color( 0.533333, 0.392157, 0.392157, 1 ) custom_fonts/font = ExtResource( 5 ) -text = "by bleeptrack & blinry" +text = "title_label2_007" align = 1 __meta__ = { "_edit_use_anchors_": false @@ -64,7 +64,7 @@ __meta__ = { [node name="Button2" type="Button" parent="VBoxContainer"] margin_right = 351.0 margin_bottom = 39.0 -text = "Quit" +text = "title_button2_011" [node name="VBoxContainer2" type="VBoxContainer" parent="."] anchor_left = 0.5 @@ -101,7 +101,7 @@ custom_styles/pressed = ExtResource( 7 ) custom_styles/focus = ExtResource( 7 ) custom_styles/normal = ExtResource( 6 ) enabled_focus_mode = 0 -text = "Support us! (Open two browser tabs)" +text = "survey_button_013" __meta__ = { "_edit_use_anchors_": false } diff --git a/scenes/terminal.tscn b/scenes/terminal.tscn index 2e8d6fa9..2605816d 100644 --- a/scenes/terminal.tscn +++ b/scenes/terminal.tscn @@ -83,21 +83,21 @@ margin_bottom = 1052.0 [node name="Button" type="Button" parent="Rows/VBoxContainer"] margin_right = 1920.0 margin_bottom = 20.0 -text = "git commit --allow-empty -m \"$RANDOM\"" +text = "terminal_button_021" script = SubResource( 2 ) [node name="Button2" type="Button" parent="Rows/VBoxContainer"] margin_top = 24.0 margin_right = 1920.0 margin_bottom = 44.0 -text = "git checkout HEAD^" +text = "terminal_button2_022" script = SubResource( 2 ) [node name="Button3" type="Button" parent="Rows/VBoxContainer"] margin_top = 48.0 margin_right = 1920.0 margin_bottom = 68.0 -text = "git checkout -b \"$RANDOM\"" +text = "terminal_button3_023" script = SubResource( 2 ) [node name="InputLine" type="HBoxContainer" parent="Rows"] diff --git a/scenes/text_editor.tscn b/scenes/text_editor.tscn index 732784fe..28c11ecf 100644 --- a/scenes/text_editor.tscn +++ b/scenes/text_editor.tscn @@ -9,7 +9,7 @@ anchor_right = 1.0 anchor_bottom = 1.0 custom_colors/background_color = Color( 0, 0, 0, 1 ) -text = "Text here" +text = "text_editor_texteditor_038" syntax_highlighting = true wrap_enabled = true script = ExtResource( 2 ) @@ -29,7 +29,7 @@ margin_bottom = -14.399 focus_mode = 0 custom_fonts/font = ExtResource( 1 ) enabled_focus_mode = 0 -text = "Save" +text = "file_browser_savebutton_036" __meta__ = { "_edit_use_anchors_": false } diff --git a/scenes/title.tscn b/scenes/title.tscn index 17aa86f1..8fa9c61b 100644 --- a/scenes/title.tscn +++ b/scenes/title.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=6 format=2] [ext_resource path="res://styles/theme.tres" type="Theme" id=1] [ext_resource path="res://images/oh-my-git.png" type="Texture" id=2] [ext_resource path="res://scenes/title.gd" type="Script" id=3] +[ext_resource path="res://scripts/translator.gd" type="Script" id=4] [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=5] [node name="Title" type="Control"] @@ -18,12 +19,15 @@ margin_right = 1131.78 margin_bottom = 650.135 custom_colors/font_color = Color( 0.533333, 0.392157, 0.392157, 1 ) custom_fonts/font = ExtResource( 5 ) -text = "by bleeptrack & blinry" +text = "title_label2_007" align = 1 __meta__ = { "_edit_use_anchors_": false } +[node name="translator" type="Node" parent="Label2"] +script = ExtResource( 4 ) + [node name="Label3" type="Label" parent="."] margin_left = 709.713 margin_top = 621.416 @@ -31,11 +35,11 @@ margin_right = 1209.71 margin_bottom = 677.416 custom_colors/font_color = Color( 0.533333, 0.392157, 0.392157, 1 ) custom_fonts/font = ExtResource( 5 ) -text = "Original score by winniehell" +text = "title_label3_008" align = 1 -__meta__ = { -"_edit_use_anchors_": false -} + +[node name="translator" type="Node" parent="Label3"] +script = ExtResource( 4 ) [node name="VBoxContainer" type="VBoxContainer" parent="."] margin_left = 784.553 @@ -49,19 +53,28 @@ __meta__ = { [node name="Button" type="Button" parent="VBoxContainer"] margin_right = 351.0 margin_bottom = 39.0 -text = "Levels" +text = "title_button_009" + +[node name="translator" type="Node" parent="VBoxContainer/Button"] +script = ExtResource( 4 ) [node name="Button3" type="Button" parent="VBoxContainer"] margin_top = 44.0 margin_right = 351.0 margin_bottom = 83.0 -text = "Sandbox" +text = "title_button3_010" + +[node name="translator" type="Node" parent="VBoxContainer/Button3"] +script = ExtResource( 4 ) [node name="Button2" type="Button" parent="VBoxContainer"] margin_top = 88.0 margin_right = 351.0 margin_bottom = 127.0 -text = "Quit" +text = "title_button2_011" + +[node name="translator" type="Node" parent="VBoxContainer/Button2"] +script = ExtResource( 4 ) [node name="Sprite" type="Sprite" parent="."] diff --git a/scenes/translator.gd b/scenes/translator.gd new file mode 100644 index 00000000..1eccaec1 --- /dev/null +++ b/scenes/translator.gd @@ -0,0 +1,16 @@ +extends Node + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/scripts/translator.gd b/scripts/translator.gd new file mode 100644 index 00000000..ae680ebc --- /dev/null +++ b/scripts/translator.gd @@ -0,0 +1,20 @@ +extends Node + +# Свойство, которое нужно перевести (например, "text" или "window_title") +export var property_to_translate : String = "text" + +func _ready(): + var parent = get_parent() + if not parent: + return + + # Проверяем, существует ли у родителя такое свойство + if parent.get(property_to_translate) != null: + # Получаем ключ из свойства + var key = parent.get(property_to_translate) + + # Переводим ключ с помощью нашей глобальной функции + var translated_text = game.tr_custom(key) + + # Устанавливаем переведенный текст обратно в свойство + parent.set(property_to_translate, translated_text) diff --git a/sounds/buzzer.wav.import b/sounds/buzzer.wav.import index 0df076df..081434c2 100644 --- a/sounds/buzzer.wav.import +++ b/sounds/buzzer.wav.import @@ -17,5 +17,7 @@ force/max_rate=false force/max_rate_hz=44100 edit/trim=false edit/normalize=false -edit/loop=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 compress/mode=0 diff --git a/sounds/poof.wav.import b/sounds/poof.wav.import index 57110c6f..0eba4d0a 100644 --- a/sounds/poof.wav.import +++ b/sounds/poof.wav.import @@ -17,5 +17,7 @@ force/max_rate=false force/max_rate_hz=44100 edit/trim=false edit/normalize=false -edit/loop=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 compress/mode=0 diff --git a/sounds/success.wav.import b/sounds/success.wav.import index b6da387e..4f12acd1 100644 --- a/sounds/success.wav.import +++ b/sounds/success.wav.import @@ -17,5 +17,7 @@ force/max_rate=false force/max_rate_hz=44100 edit/trim=false edit/normalize=false -edit/loop=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 compress/mode=0 diff --git a/sounds/swish.wav.import b/sounds/swish.wav.import index 6eda4c47..1a6b4120 100644 --- a/sounds/swish.wav.import +++ b/sounds/swish.wav.import @@ -17,5 +17,7 @@ force/max_rate=false force/max_rate_hz=44100 edit/trim=false edit/normalize=false -edit/loop=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 compress/mode=0 diff --git a/sounds/swoosh.wav.import b/sounds/swoosh.wav.import index 78d86f82..f71cf6aa 100644 --- a/sounds/swoosh.wav.import +++ b/sounds/swoosh.wav.import @@ -17,5 +17,7 @@ force/max_rate=false force/max_rate_hz=44100 edit/trim=false edit/normalize=false -edit/loop=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 compress/mode=0 diff --git a/sounds/typewriter_ding.wav.import b/sounds/typewriter_ding.wav.import index 59f1cf7a..922ee3db 100644 --- a/sounds/typewriter_ding.wav.import +++ b/sounds/typewriter_ding.wav.import @@ -17,5 +17,7 @@ force/max_rate=false force/max_rate_hz=44100 edit/trim=false edit/normalize=false -edit/loop=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 compress/mode=0 diff --git a/styles/theme.tres b/styles/theme.tres index 35315aa3..a56c333f 100644 --- a/styles/theme.tres +++ b/styles/theme.tres @@ -193,7 +193,7 @@ Button/colors/font_color_disabled = Color( 0.9, 0.9, 0.9, 0.2 ) Button/colors/font_color_hover = Color( 0.94, 0.94, 0.94, 1 ) Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) Button/constants/hseparation = 2 -Button/fonts/font = null +Button/fonts/font = ExtResource( 1 ) Button/styles/disabled = SubResource( 1 ) Button/styles/focus = SubResource( 2 ) Button/styles/hover = SubResource( 3 ) @@ -206,7 +206,7 @@ CheckBox/colors/font_color_hover_pressed = Color( 1, 1, 1, 1 ) CheckBox/colors/font_color_pressed = Color( 1, 1, 1, 1 ) CheckBox/constants/check_vadjust = 0 CheckBox/constants/hseparation = 4 -CheckBox/fonts/font = null +CheckBox/fonts/font = ExtResource( 1 ) CheckBox/icons/checked = null CheckBox/icons/radio_checked = null CheckBox/icons/radio_unchecked = null @@ -238,7 +238,7 @@ PopupMenu/colors/font_color_disabled = Color( 0.4, 0.4, 0.4, 0.8 ) PopupMenu/colors/font_color_hover = Color( 0.88, 0.88, 0.88, 1 ) PopupMenu/constants/hseparation = 4 PopupMenu/constants/vseparation = 4 -PopupMenu/fonts/font = null +PopupMenu/fonts/font = ExtResource( 1 ) PopupMenu/icons/checked = null PopupMenu/icons/radio_checked = null PopupMenu/icons/radio_unchecked = null @@ -261,11 +261,11 @@ RichTextLabel/constants/shadow_offset_x = 1 RichTextLabel/constants/shadow_offset_y = 1 RichTextLabel/constants/table_hseparation = 3 RichTextLabel/constants/table_vseparation = 3 -RichTextLabel/fonts/bold_font = null -RichTextLabel/fonts/bold_italics_font = null -RichTextLabel/fonts/italics_font = null +RichTextLabel/fonts/bold_font = ExtResource( 1 ) +RichTextLabel/fonts/bold_italics_font = ExtResource( 1 ) +RichTextLabel/fonts/italics_font = ExtResource( 1 ) RichTextLabel/fonts/mono_font = ExtResource( 2 ) -RichTextLabel/fonts/normal_font = null +RichTextLabel/fonts/normal_font = ExtResource( 1 ) RichTextLabel/styles/focus = null RichTextLabel/styles/normal = null TextEdit/colors/background_color = Color( 0, 0, 0, 0 ) @@ -322,8 +322,8 @@ Tree/constants/item_margin = 0 Tree/constants/scroll_border = 4 Tree/constants/scroll_speed = 12 Tree/constants/vseparation = 4 -Tree/fonts/font = null -Tree/fonts/title_button_font = null +Tree/fonts/font = ExtResource( 1 ) +Tree/fonts/title_button_font = ExtResource( 1 ) Tree/icons/arrow = null Tree/icons/arrow_collapsed = null Tree/icons/checked = null diff --git a/tr_localization.py b/tr_localization.py new file mode 100644 index 00000000..e1735e33 --- /dev/null +++ b/tr_localization.py @@ -0,0 +1,166 @@ +import os +import re +import csv +import json +from collections import OrderedDict + +# ... (секция конфигурации и глобальных переменных остается той же) ... +CSV_FILENAME = 'translations.csv' +DIRS_TO_PROCESS = ['scenes', 'levels'] +CARDS_JSON_PATH = 'resources/cards.json' +text_to_key_map = OrderedDict() +key_counter = 1 + +def sanitize_for_key(text): + return re.sub(r'[^a-zA-Z0-9_]+', '', text.lower()) + +def generate_key(base_name): + global key_counter + key = f"{base_name}_{str(key_counter).zfill(3)}" + key_counter += 1 + return key + +def add_text(text, base_name): + cleaned_text = text.strip() + if not cleaned_text or cleaned_text in text_to_key_map: + return cleaned_text + key = generate_key(base_name) + text_to_key_map[cleaned_text] = key + print(f" Найден текст: \"{cleaned_text[:60].replace(chr(10), ' ')}...\" -> Ключ: {key}") + return cleaned_text + +# --- ИСПРАВЛЕННАЯ ЛОГИКА СБОРА ДЛЯ УРОВНЕЙ --- +def collect_from_level_file(filepath, base_key): + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + + title_regex = re.compile(r'^\s*title\s*=\s*(.*)', re.MULTILINE) + match = title_regex.search(content) + if match: add_text(match.group(1), f"{base_key}_title") + + # Собираем description и congrats как единые блоки + for section_name in ['description', 'congrats']: + regex = re.compile(rf'\[{section_name}\]\n(.*?)(?=\n\[|$)', re.DOTALL) + match = regex.search(content) + if match: add_text(match.group(1), f"{base_key}_{section_name}") + + # Собираем подсказки из [win] построчно + win_hint_regex = re.compile(r'^\s*#\s*(.*)', re.MULTILINE) + win_regex = re.compile(r'\[win\]\n(.*?)(?=\n\[|$)', re.DOTALL) + win_match = win_regex.search(content) + if win_match: + for match in win_hint_regex.finditer(win_match.group(1)): + add_text(match.group(1), f"{base_key}_win_hint") + +# --- ИСПРАВЛЕННАЯ ЛОГИКА ЗАМЕНЫ ДЛЯ УРОВНЕЙ --- +def replace_in_level_file(filepath): + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + original_content = content + + # Заменяем в обратном порядке, чтобы избежать замены частей ключей + for text, key in reversed(list(text_to_key_map.items())): + # Используем re.escape для безопасной замены текста со спецсимволами + escaped_text = re.escape(text) + content = re.sub(f'^{escaped_text}$', key, content, flags=re.MULTILINE) # Для блоков + content = re.sub(f'(?<=title = ){escaped_text}', key, content) # Для title + content = re.sub(f'(?<=# ){escaped_text}', key, content) # Для win hints + + if content != original_content: + with open(filepath, 'w', encoding='utf-8') as f: f.write(content) + print(f" Замена в уровне: {filepath}") + +# ... (остальной код скрипта, включая main, tscn, cards.json, остается таким же, как в localize_final.py) +# ... Я вставлю его целиком ниже для удобства. +def collect_from_tscn(filepath, base_key): + node_name_regex = re.compile(r'^\[node name="([^"]+)"') + text_regex = re.compile(r'^\s*(text|bbcode_text)\s*=\s*"((?:\\"|[^"])*)"') + current_node_name = "node" + with open(filepath, 'r', encoding='utf-8') as f: + for line in f: + match = node_name_regex.match(line) + if match: current_node_name = match.group(1) + match = text_regex.match(line) + if match: add_text(match.group(2).replace('\\"', '"'), f"{base_key}_{sanitize_for_key(current_node_name)}") + +def collect_from_cards_json(): + if not os.path.exists(CARDS_JSON_PATH): return + base_key = sanitize_for_key(os.path.splitext(os.path.basename(CARDS_JSON_PATH))[0]) + with open(CARDS_JSON_PATH, 'r', encoding='utf-8') as f: data = json.load(f) + for card in data: + card_id = card.get('id', 'card') + add_text(card.get('description'), f"card_{sanitize_for_key(card_id)}_desc") + +def replace_in_tscn(filepath): + text_regex = re.compile(r'^\s*(text|bbcode_text)\s*=\s*"((?:\\"|[^"])*)"') + with open(filepath, 'r', encoding='utf-8') as f: lines = f.readlines() + new_lines, changed = [], False + for line in lines: + match = text_regex.match(line) + if match: + prop, text = match.group(1), match.group(2).replace('\\"', '"').strip() + if text in text_to_key_map: + key = text_to_key_map[text] + indent = line[:line.find(prop)] + new_lines.append(f'{indent}{prop} = "{key}"\n') + changed = True + else: new_lines.append(line) + else: new_lines.append(line) + if changed: + with open(filepath, 'w', encoding='utf-8') as f: f.writelines(new_lines) + print(f" Замена в сцене: {filepath}") + +def replace_in_cards_json(): + if not os.path.exists(CARDS_JSON_PATH): return + with open(CARDS_JSON_PATH, 'r', encoding='utf-8') as f: + data = json.load(f, object_pairs_hook=OrderedDict) + changed = False + for card in data: + desc = card.get('description', "").strip() + if desc in text_to_key_map: + card['description'] = text_to_key_map[desc] + changed = True + if changed: + with open(CARDS_JSON_PATH, 'w', encoding='utf-8') as f: + json.dump(data, f, indent=4, ensure_ascii=False) + print(f" Замена в карточках: {CARDS_JSON_PATH}") + +def main(): + print("--- Фаза 1: Сбор всего текста ---") + for directory in DIRS_TO_PROCESS: + for root, _, files in os.walk(directory): + for filename in files: + filepath = os.path.join(root, filename) + base_key = sanitize_for_key(os.path.splitext(filename)[0]) + if filename.endswith('.tscn'): + collect_from_tscn(filepath, base_key) + elif directory == 'levels' and filename != 'sequence': + collect_from_level_file(filepath, base_key) + collect_from_cards_json() + if not text_to_key_map: + print("\nНовый текст для перевода не найден.") + return + print(f"\nНайдено {len(text_to_key_map)} уникальных строк. Запись в {CSV_FILENAME}...") + with open(CSV_FILENAME, 'w', newline='', encoding='utf-8') as f: + writer = csv.writer(f) + writer.writerow(['keys', 'en', 'ru']) + for text, key in text_to_key_map.items(): + writer.writerow([key, text, '']) + print("\n--- Фаза 2: Замена текста на ключи ---") + for directory in DIRS_TO_PROCESS: + for root, _, files in os.walk(directory): + for filename in files: + filepath = os.path.join(root, filename) + if filename.endswith('.tscn'): + replace_in_tscn(filepath) + elif directory == 'levels' and filename != 'sequence': + replace_in_level_file(filepath) + replace_in_cards_json() + print("\nСкрипт успешно завершил работу!") + print("ВАЖНО: Теперь внесите ручные изменения в game.gd и level.gd, как было описано.") + +if __name__ == '__main__': + print("Запуск ИСПРАВЛЕННОГО v2 скрипта локализации.") + print("ВАЖНО: Сделайте коммит или резервную копию перед запуском!") + input("Нажмите Enter для продолжения...") + main() diff --git a/translations.csv b/translations.csv new file mode 100644 index 00000000..ad716532 --- /dev/null +++ b/translations.csv @@ -0,0 +1,808 @@ +keys,en,ru +card_description_001,Description, +card_energy_002,0, +music_button_button3_003,Toggle music, +arrow_id_004,label, +cards_button_005,Draw new cards, +cards_energy_006,3, +title_label2_007,by bleeptrack & blinry, +title_label3_008,Original score by winniehell, +title_button_009,Levels, +title_button3_010,Sandbox, +title_button2_011,Quit, +survey_label_012,Oh My Git!, +survey_button_013,Support us! (Open two browser tabs), +main_levelname_014,Level name here!, +main_leveldescription_015,Level description here!, +main_backbutton_016,Back, +main_reloadbutton2_017,Reload, +main_cardsbutton_018,Cards!, +main_tip_019,Tip!, +main_nextlevelbutton_020,Next level, +terminal_button_021,"git commit --allow-empty -m ""$RANDOM""", +terminal_button2_022,git checkout HEAD^, +terminal_button3_023,"git checkout -b ""$RANDOM""", +repository_label_024,Repo name, +repository_indexlabel_025,Index:, +repository_button_026,Update, +repository_simplifycheckbox_027,Hide trees and blobs, +node_id_028,object_id, +level_select_button3_029,To the survey /o/, +no_git_button2_030,"Sure, I'll install it!", +notification_label_031,This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint!, +notification_ok_032,Got it!, +file_browser_title_033,title, +file_browser_button_034,root, +file_browser_button2_035,dir, +file_browser_savebutton_036,Save, +text_editor_texteditor_038,Text here, +file_browser_item_label_039,filename, +merge_title_040,Merging timelines, +merge_description_041,"Here's a trick so that you can sleep a bit longer: just do all your morning activities in parallel universes, and then at the end, merge them together!", +merge_congrats_042,I wonder if you're more relaxed when you *sleep* in parallel timelines..., +merge_win_hint_043,"Build a situation where you consumed a baguette, a coffee, *and* a donut.", +merge_win_hint_044,Be on a merge commit., +conflict_title_045,Contradictions, +conflict_description_046,"Sometimes, timelines will contradict each other. + +For example, in this case, one of our clients wants these timelines merged, but they ate different things for breakfast in both timelines. + +Try to merge them together! You'll notice that there will be a conflict! The time machine will leave it up to you how to proceed: you can edit the problematic item, it will show you the conflicting sections. You can keep either of the two versions - or create a combination of them! Remove the >>>, <<<, and === markers, and make a new commit to finalize the merge! + +Let your finalized timeline be the ""main"" one.", +conflict_congrats_047,"Yum, that sounds like a good breakfast!", +conflict_win_hint_048,Make a breakfast compromise in the 'main' branch., +mergeabort_title_049,Abort a merge, +mergeabort_description_050,"Sometimes you want to merge two commits, but a merge conflict occurs that you currently don't want to resolve. + +In these situations you can abort the merge to merge later. Use + git merge --abort +when you are in a merge process. + +Try to merge both commits and abort the merge afterwards.", +mergeabort_congrats_051,"Aaah, let's merge later...", +mergeabort_win_hint_052,You tried to merge?, +mergeabort_win_hint_053,You aborted to merge?, +reset_title_054,Resetting files in the index, +reset_description_055,"See the dark shadow behind the icons? That's the version of the file in the last commit! + +For example, these candles have been blown out, and that change has been added. + +But you decide that this was a mistake! You only want to blow out the red candle in the next commit! + +If you already have updated the index to a changed file, but want to reset it, you can use `git reset`!", +reset_win_hint_056,Reset the changes in the green and blue candles!, +reset_win_hint_057,And make a commit!, +change_title_058,Update files in the index, +change_description_059,"When we change files, the index won't change on its own. We have to use `git add` to update the index to the changed version of the file. + +Let's try that! + +The icons in the file browser show you when the actual file (white) and the version in the index (blue) are different, and when they are the same!", +rm_title_060,Delete a file in the next commit, +rm_description_061,"If you want to remove a file in the next commit, you can use `git rm`! This will both delete the file locally, and in the index. + +If a file is modified, you'll need to reset these changes first/reset the files.", +rm_win_hint_062,Make a commit where all files are deleted ¯\_(^_^)_/¯, +steps_title_063,Adding changes step by step, +steps_description_064,"The index is really useful, because it allows us to be precise about which changes we want to include in each commit!", +steps_win_hint_065,"Make changes to all three objects, to form a logical sequence of events!", +steps_win_hint_066,Only add one of these changes!, +steps_win_hint_067,And make a commit., +steps_win_hint_068,Make a second commit that only records a single change., +steps_win_hint_069,And a third one., +compare_title_070,Step by step, +compare_description_071,"Welcome to today's lesson! We're going to learn how to make commits with more precision! + +Have a look at these two timelines. They have exactly the same outcome. But one of them makes it much easier to figure out what happened.", +compare_win_hint_072,Right! Having each change in its own commit makes it easier to understand what's going on! Let's learn how to do that!, +checkout_title_073,Checking out files from the index, +checkout_description_074,"So you've made changes to your files, but you decide that you don't want to keep them! You can use `git checkout` for that! + +What happens if you have already update the index, like in file c? You have to reset the index first!", +checkout_win_hint_075,Remove all changes in your local files!, +add_title_076,Updating files in the index, +add_description_077,"So you start working, and make changes to your files! Git lets you choose which of these changes you want to put in the next commit. This is like updating the index version of that file to the new version. + +This allows you to have smaller commits, that describe better what you changed! + +The command for this is the same - `git add`!", +add_congrats_078,"Well done! Try travelling between the commits using `git checkout`, so you can look at their contents again!", +add_win_hint_079,Make changes to all files!, +add_win_hint_080,"Add only the changes of a and c, and make a commit! Finally, make a commit which captures the changes in b!", +new_title_081,Add new files to the index, +new_description_082,"So far, when we made a commit, we've always recorded the current status of all objects, right? + +But Git allows you to pick which changes you want to put in a commit! + +To learn how that works, we need to learn about the ""index""! In the index, we can prepare what will be in the next commit. In this game, the index is represented by a blue aura around icons in the file browser! + +Initially, the index is empty. To make a commit that contains a new file, we need to add it!", +new_win_hint_083,Add the candle., +new_win_hint_084,Make a commit., +checkoutcommit_title_085,Moving111 through time,Двигаюсьч +checkoutcommit_description_086,"The yellow boxes are frozen points in time, we call them ""commits""! You can travel between them using the ""checkout"" card! (Try it!) + +Can you find out what happened here? Then, while on the last commit, edit the files to fix the problem, and make a new commit!", +checkoutcommit_congrats_087,"Wonderful! Now that you're getting familiar with the time machine, let's look at some more complicated situations...", +checkoutcommit_win_hint_088,Restore sisterly peace., +branchcreate_title_089,Creating branches, +branchcreate_description_090,"You were invited to two parties! At one of them, your favorite band is playing - and the other one is your best friend's birthday party. Where should you go? No worries - as a time travel agent in training, you can go to both parties! + +To make it easier to tell which timeline is which, you can create time portals! (We call these ""branches"".)", +branchcreate_congrats_091,"Now you can travel between those branches easily (using `git checkout`) - try it! + +Your friend is happy that you made it to the birthday party and you also got your concert ticket signed. Yay!", +branchcreate_win_hint_092,Create a branch called 'birthday' that points to the birthday timeline., +branchcreate_win_hint_093,Create a branch called 'concert' that points to the concert timeline., +grow_title_094,Branches grow with you!, +grow_description_095,"Note that there are two options to ""travel to the end of a timeline"": + +First, you can directly travel to the commit, like we've done it before. + +And second, you can travel to the branch label. In this case, when you make a new commit, the branch will grow with you, and still point at the end of the timeline!", +grow_win_hint_096,"Travel directly to the last yellow commit of the birthday timeline, make a change to 'you', and make a commit", +grow_win_hint_097,"Travel to the blue 'concert' branch, make a change to 'you', and a commit.", +reorder_title_098,Moving branches around, +reorder_description_099,"One of your colleagues messed up here, and put the branches in the wrong timelines! + +You could delete and re-create these branches - but you can also directly move them to different commits, by using + + git checkout + +on the branch names, and then using + + git reset --hard + +on the commit where you want the branch to be. + +The donut branch is in the right place, but the timeline is still incomplete - make you actually *eat* the donut in that branch!", +reorder_win_hint_100,Did you eat a baguette on the baguette branch?, +reorder_win_hint_101,Did you drink a coffee on the coffee branch?, +reorder_win_hint_102,Did you eat a donut on the donut branch?, +fork_title_103,Make parallel commits, +fork_description_104,"Did you know that creating parallel timelines is perfectly legal and safe? It's true! + +Can you find out when things went wrong in this zoo? Then, go back to the last good commit and create a parallel universe where everyone is happy!", +fork_congrats_105,"Whew, good job! This seems like a *much* better outcome. + +Feel free to add more parallel timelines, or make them longer. + +If you're ready, our next mission is already waiting...", +fork_win_hint_106,Make sure that the child is happy., +fork_win_hint_107,Make sure that the lion gets something to eat., +branchremove_title_108,Deleting branches, +branchremove_description_109,"Life is full of dangers, right? Even when walking to school, it seems like there's a lot of risks! + +This Monday is especially bad. You made it to school, but there's some timelines you definitely don't want to keep around.", +branchremove_congrats_110,"On second thought, maybe you even prefer the ice cream timeline to the main one? :)", +branchremove_win_hint_111,Find the bad branches and delete them. Keep only the best one., +cli_title_112,The command line, +cli_description_113,These playing cards are designed to be easy to use and to remember! We'd suggest sticking to them if you don't have a lot of experience with Git!, +cli_congrats_114,"Cool! Instead of using the playing cards, you can also do everything via the command line! + +The command line is pretty powerful! Often, you can use it to solve tasks faster compared to using a graphical interface.", +cli_win_hint_115,Initialize the time machine!, +whoareyou_title_116,Welcome to time travel school!, +whoareyou_description_117,"You're still pretty confused by everything that's going on. The next day, you decide to enroll in time travel school! + +Your time travel teacher welcomes you: ""Hello there! Wanna tell us your name?""", +whoareyou_congrats_118,"""We're so glad to have you! + +Git can help you fix problems in the past! It allows you to collaborate with other students of time travel! It's really powerful, and it's really popular! I'll see you for your first lesson tomorrow!""", +whoareyou_win_hint_119,Introduce yourself., +whoareyou_win_hint_120,"Fill out the enrollment form, and commit it!", +init_title_121,Enter the time machine, +init_description_122,"You've been accepted to time travel school! Yay! It's your first day! Your teacher explains: + +""To do anything with a time machine, you first need to initialize it!"" + +Drag that blue card up to play it!", +init_congrats_123,"Nice! See that little owl squirrel that appeared? It will be your companion, and always show you where you are in time!", +risky_title_124,Living dangerously, +risky_description_125,"So you have decided to apply for time travel school, to learn how to use this time machine called ""Git""! + +How exciting! + +You're almost done with the paperwork! You just need to fill in one more reason why you want to learn Git.", +risky_congrats_126,"Suddenly, your cat jumps on the table, snatches away the form, and runs away! Oh no. All your hard work, gone! + +You clearly need a better solution. + +(Click ""Next Level"" as soon as you're ready!)", +risky_win_hint_127,Add another line to form.txt!, +remote_title_128,Working together, +remote_description_129,"Let's add your name to our list of students! + +I already have a second commit of it in my time machine - let's work together!", +remote_congrats_130,Welcome to time travel school! :) I'll see you for your first class tomorrow!, +remote_win_hint_131,Get the second commit from your teacher using `git pull`., +remote_win_hint_132,Add your name to the list of students, +remote_win_hint_133,Commit your result., +commit_title_134,Your first commit, +commit_description_135,"You can use your time machine to make snapshots of objects around you! Here, let's practice this! + +(Your teacher pours some water into a glass.)", +commit_congrats_136,"Nice! You can try making some additional commits. When you feel comfortable, click on ""Next Level"".", +commit_win_hint_137,"Make a snapshot of the glass (a ""commit"")", +commit_win_hint_138,Change the contents of the glass!, +commit_win_hint_139,And make a second commit!, +copies_title_140,Making backups, +copies_description_141,"This time, you're making a lot of backup copies - you can look at them by clicking on them!", +copies_congrats_142,"Okay, this kind of works. + +But you're a bit worried that you'll end up with hundreds of copies of this form, and it will be hard to keep track of all of them. + +And especially when working with other people, sending copies back and forth doesn't seem ideal. + +You can't wait to try these time machines!", +copies_win_hint_143,Add another line to form2_really_final.txt!, +stash_title_144,Stashing, +stash_description_145,"You will encounter situations in which you are working on your project but you need to +put your current changes aside temporarily. To do so, you can use the stash function. Use + git stash push +to add your current changes to the stash stack. + +--- +tipp1 +--- +tipp2 +--- +tipp3", +stash_congrats_146,Nice stash you got there! :), +stash_win_hint_147,Did you stash the current changes?, +stashpop_title_148,Pop from Stash, +stashpop_description_149,"When you stashed your changes and you want to apply them back to your current working directory, you can use + git stash pop +This will remove the changes from the stash stack. If you also want to keep the changes on the stash stack, use + git stash apply + +--- +tipp1 +--- +tipp2 +--- +tipp3", +stashpop_congrats_150,"Yay, you got your changes back! :)", +stashpop_win_hint_151,Did you pop the changes from the stash stack?, +stashclear_title_152,Clear the Stash, +stashclear_description_153,"If you want to inspect your stash stack, use the command + git stash list + +Oh, you don't want to keep your stashed changes? There are way too many? Then go ahead and clear the stack with + git stash clear +If you only want to discard a certain stash entry, you can use + git stash drop + +Clear your stash stack! + +--- +tipp1 +--- +tipp2 +--- +tipp3", +stashclear_congrats_154,All clear! :), +stashclear_win_hint_155,Did you clear your stash stack?, +stashmerge_title_156,Merging popped stash, +stashmerge_description_157,"When you want to re-apply your changes but you already continued working on your file, you might get +a merge conflict! Let's practice this situation. +Pop the changes from the stash with + git stash pop +and resolve the merge conflict. Commit the resolved changes and clear the stash stack afterwards. + +--- +tipp1 +--- +tipp2 +--- +tipp3", +stashmerge_win_hint_158,Did you resolve the conflict and commit?, +stashmerge_win_hint_159,Did you clear stash stack?, +stashbranch_title_160,Branch from stash, +stashbranch_description_161,"If you want to keep your changes but they don't belong to the main branch, you can easily +create a new branch from your stashed changes. Just use + git stash branch +If you just want to use the latest stash entry, you can leave the option empty. + +Create a new branch from the stashed changes! + +--- +tipp1 +--- +tipp2 +--- +tipp3", +stashbranch_congrats_162,Stashed changes are in a new branch! :), +stashbranch_win_hint_163,Did you create a new branch from the stashed changes?, +whoareyou_title_164,Nice to meet you!, +whoareyou_description_165,"Introduce yourself using + + git config --global user.name Firstname + git config --global user.email ""your@mail.com""", +whoareyou_win_hint_166,Have a name configured., +whoareyou_win_hint_167,Have an email address configured., +clone_title_168,Cloning a repo, +clone_description_169,"Get your friend's repo using clone, change something, push it back.", +init_title_170,Welcome!, +init_win_hint_171,"Again, initialize your time machine!", +split_title_172,Split a commit!, +split_description_173,"Here, both changes happened in one commit! Split them to be in two commits instead.", +steps_title_174,One step after another, +steps_description_175,"Sometimes, you might want to record the order in which things changed, instead of making a single commit. + +What happened here? Make two commits from the changes (using the ""add"" card), in an order that makes sense!", +commita_title_176,"Make a commit, but faster!", +commita_description_177,"There is a time-saving trick, where instead of a plain `git commit`, you can use + + git commit -a + +This will automatically add all changes you made to local files! Very convenient.", +commita_win_hint_178,"Make a commit where all files contain ""x"".", +filesmove_title_179,No sleep required, +filesmove_description_180,"Actually, you decide that you don't need any sleep. + +Because of that, you won't require a bed, and can build some other piece of furniture from the wood!", +filesmove_congrats_181,"Neat! It even still looks a bit comfortable! + +You head out, eager for your first lesson at time travel school!", +filesmove_win_hint_182,"Rename the bed into something else, and give it a new description!", +remotesdelete_title_183,Deleting and renaming a remote, +remotesdelete_description_184,"Here, you already have two remotes configured! You can list them using `git remote`.", +remotesdelete_win_hint_185,Rename the remote with the typo (using `git remote rename [old name] [new name]`), +remotesdelete_win_hint_186,The remote with the typo is gone., +remotesdelete_win_hint_187,Delete the remote you don't want to keep (using `git remote remove [remote]`), +commit_title_188,Make a commit \o/, +commit_description_189,"For practice, make a commit where all files contain an ""x""!", +commit_win_hint_190,"File a contains ""x"" in the last main commit.", +commit_win_hint_191,"File b contains ""x"" in the last main commit.", +commit_win_hint_192,"File c contains ""x"" in the last main commit.", +pullpush_title_193,Helping each other, +pullpush_description_194,"The events and timelines you see are always only what your own time machine knows about! + +Of course, time agents don't have to work alone! Here, your sidekick has already prepared a merge for you! You can use the ""pull"" card to transfer it to your own time machine. + +Then, add another event on top (what does Sam have for dinner?), and `push` the result, to transfer it back to your sidekick! + +You can only ever manipulate things in your own time machine (the one on the bottom).", +pullpush_congrats_195,"In reality, in many cases, a lot of time agents work together to build a really good future together! :)", +fetch_title_196,Fetching from remotes, +fetch_description_197,"Here, you already have two remotes configured! You can list them using `git remote`. + +Fetch from both, and look at the suggestions. + +Then, make a new commit on top of your original one that introduces a compromise.", +fetch_win_hint_198,Your proposal is acceptable for friend1., +fetch_win_hint_199,Your proposal is acceptable for friend2., +remotesadd_title_200,Adding a remote, +remotesadd_description_201,"Let's work together with others! Your friend has their own repo at the URL `../friend` - you can add it using + + git remote add [name] [URL] + +where `[name]` is an arbitrary, short name you pick for the remote. + +When you've done that, you can get all commits from that remote using + + git pull friend + +There's a letter for you!", +remotesadd_win_hint_202,Add a remote that points to ../friend., +remotesadd_win_hint_203,Pull from the remote., +checkout_title_204,Getting the last version, +checkout_description_205,"You've been working on your essay for a while. But - ughh! Now your cat walks over your keyboard and ""helps you"", so now it's all messed up! :/ + +But Git is here to help! To discard all changes your cat made, and go back to the version in the last commit, use `checkout`!", +checkout_win_hint_206,Restore the version from the last commit., +restore_title_207,Looking into the past, +restore_description_208,"You've been working on your essay for a while. But you're not happy with the changes you've made recently. You want to go back to the version called ""Best version""! + +No problem, you can use the `checkout` card to restore your essay from an older commit!", +restore_win_hint_209,"For nostalgic reasons, restore the very first backup you made!", +indexmv_title_210,Rename a file in the next commit, +indexmv_description_211,"Other times, you might want to rename a file in the next commit. Use + + git mv [file] [new name] + +for that. The effect is very similar as if you had created a copy with a new name, and removed the old version.", +indexmv_win_hint_212,"Make a commit where you rename the file b to ""x"".", +reflog_title_213,Go back to where you were before, +reflog_description_214,"Say you were looking at something in the past, and then switched back to the main branch. + +But then, you got reaaally distracted, and after your lunch break, you can't remember which past commit you were on before. How can you find out? + +There's a convenient command that shows you all the places your HEAD has pointed to in the past: + + git reflog", +reflog_win_hint_215,"Find out where you've been before, and go back there!", +pushedsomethingbroken_title_216,I pushed something broken, +pushedsomethingbroken_description_217,"We were talking about how to undo a commit, and fix it. This only helps when you haven't already pushed it to a remote. When that has happened, and you want to undo the effects of the commit completely, your best option is `git revert`", +badcommit_title_218,Undo a bad commit, +badcommit_description_219,"Oh no, we made a bad commit! How can we undo making the commit, and go back to a point where we can try again? + +The answer is using `git reset [commit]`, which does two things: + +- It resets the current branch ref to the commit you specify. +- And it resets the index to that commit. + +It does not change your working directory in any way, which means that after that, you can try making the commit you want again.", +badcommit_win_hint_220,"In the last main commit, the numbers file contains the numbers from 1 to 10.", +badcommit_win_hint_221,"The commit message of that commit is ""More numbers"".", +badcommit_win_hint_222,The commit with the typo is not part of the main branch anymore., +restoreafilefromthepast_title_223,Restore a file from the past, +restoreafilefromthepast_description_224,"Here's a similar problem: you really liked the essay from the very first commit, and want to have it back! Well, checkout can also restore things from older commits, Here's how: + + git checkout [commit] [file]", +restoreafilefromthepast_win_hint_225,"Get the first version of your essay, and make a new commit with it.", +restoreafile_title_226,Restore a deleted file, +restoreafile_description_227,"Oops - you deleted the ""essay"" file, which you worked on all night! + +Luckily, Git is here to help! You can use `git checkout` to restore the file!", +restoreafile_win_hint_228,"Restore the essay to contain ""important content""", +remotetag_title_229,Remote Tags, +remotetag_description_230,"When you work with remote repositories, tags are not pushed or pulled automatically. + +You can push a tag with + git push +Or all tags with: + git push --tags + +Deleting tags on your remote works with: + git push --delete + +You can also sync + git fetch --prune --prune-tags + + +Add a tag named ""v2"" to the last commit and push it to the remote. Also pull the v1 tag to your local repository.", +remotetag_win_hint_231,v1 tag in your repo, +remotetag_win_hint_232,v2 tag in your repo, +addtaglater_title_233,Tagging later, +addtaglater_description_234,"But what happens if you forgot to tag your current commit? +No Prob! You can also tag older commits via + + git tag + +Tag the commit ""Adding feature 2"" with the name ""v1""! + +--- +tipp1 +--- +tipp2 +--- +tipp3", +addtaglater_congrats_235,Well done :), +addtaglater_win_hint_236,Did you create a new tag?, +removetag_title_237,Removing tags, +removetag_description_238,"You added way too many tags? No prob! Delete them with + + git tag -d + +Remove all tags in this repo! + +--- +tipp1 +--- +tipp2 +--- +tipp3", +removetag_win_hint_239,Did you remove all tags?, +addtag_title_240,Creating tags, +addtag_description_241,"Some of your commits may be special commits. Maybe you reached a milestone or a new version number. + +You can mark these commits with a special flag called 'tag'. + +Write + + git tag + +to tag your commit. + +--- +tipp1 +--- +tipp2 +--- +tipp3", +addtag_congrats_242,Nice! You tagged your first commit :), +filesdelete_title_243,Unexpected Roommates, +filesdelete_description_244,"The first day at Time Travel School comes to an end and you receive the key to your room. +Full of excitement you open the door just to find... spider webs! Spider webs everywhere! + +Remove all the spider webs you can find with the remove card!", +filesdelete_congrats_245,Your room looks now very tidy and cozy! Time to unpack your stuff!, +filesdelete_win_hint_246,Remove all spider webs., +filesdelete_win_hint_247,But make sure you keep your bed!, +filesadd_title_248,Interior design, +filesadd_description_249,"Now that your room looks tidy, you can start to unpack your stuff. You brought two new pieces of furniture with you and with a bright smile, +you see that their colors match the color of your bed! + +Build up your two pieces of furniture by playing the touch card. +Then name your furniture - you can choose whatever you like. + +Make sure the colors match! You can find the bed's color in its description. +Don't forget to add a color and description to your new furnitures, too!", +filesadd_congrats_250,Don't you immediately feel more at home?, +filesadd_win_hint_251,Add two more pieces of furniture, +filesadd_win_hint_252,Make sure the colors match your bed's color., +rebase_title_253,Rebasing, +rebase_description_254,"Okay - turns out that saving time in the morning by utilizing parallel universes is against the regulations of the International Time Travel Association. You'll have to do your tasks in sequence after all. + +See the ""rebase"" card? When you drag it to a commit, it will copy the events in your current timeline after the specified one! This way, make a clean, linear timeline where you visit all three shops. + +Again, we want to make that our base reality - the ""main"" branch should point to that timeline!", +rebase_congrats_255,"Notice how the other timelines and commits are still there - if anything goes wrong, you can also travel back to them. + +It's really hard to actually *destroy* stuff with your time machine.", +rebase_win_hint_256,Order all tree branches into one and move the main branch ref, +reorder_title_257,Reordering events, +reorder_description_258,"Oops, looks like there's something messed up here. Can you put the events back into their correct order? + +There are two ways to do this: You can drag the ""interactive rebase"" card to the commit before the one you want to change, then reorder the lines in the file that opens, and save it. + +Or you can reset the main tag to the very first commit, and then cherry-pick single commits in the order you want. You have cards for both approaches!", +reorder_congrats_259,Feel free to reset the level and try the other strategy! Which one do you like better?, +reorder_win_hint_260,Reorder the commits to dress yourself in the correct way, +bisect_title_261,Yellow brick road, +bisect_description_262,"(Please zoom out a bit using your mouse wheel! :D) + +Oh no! You have lost your key at some point during the day! + +Sure, you could look at every single commit in an attempt to find it - but there's a better way: your time machine has a built-in way to find the point in time where things went wrong quickly! + +First, play the ""bisect start"" card. Then, go to a commit where you don't have the key, and play the ""bisect bad"" card. Likewise, go to a commit early on where you have the key *in your pocket*, and play the ""bisect good"" card. + +After you've found the last good commit, reset the main branch to it. What happened to the key after you lost it?", +bisect_congrats_263,"Well done! :) The only problem is that you now have to walk all the way back home, again...", +bisect_win_hint_264,Find the last good commit, +gitignore_title_265,Ignoring files, +gitignore_description_266,"That chicken is running around a lot, and changing often. We don't want to have it in our commits. + +Add it to the file .gitignore, and try using `git add .`!", +pr_description_267,"Your friend has a problem! Clone the repo located in `../friend`, create a branch called ""solution"", and fix the problem in this branch. When you're ready, make a ""Pull Request"" by using `git tag pr`.", +empty_title_268,Empty sandbox, +empty_description_269,This is an empty sandbox you can play around in., +threecommits_title_270,Sandbox with three commits, +threecommits_description_271,"Here's a sandbox you can play around in. + +You can use both the playing cards, as well as the terminal. This is a real Git terminal! Fun things to try: + +- Make a commit that merges three timelines together at once! +- Create and delete some tags! +- Make a timeline that's completely independent of the rest!", +remote_title_272,Sandbox with a remote, +remote_description_273,"Here's a sandbox with a remote! Try pulling, fetching, or pushing! + +How can you push tags and branches on a remote? How can you delete them again?", +treenested_description_274,"Trees can also point to other trees! This way, they can describe nested directory structures. + +When you add a file inside of a directory to the index, and then call `git write-tree`, it will create a nested tree for the directory, and attach the blob to it. + +To solve this level, build a little stick figure, as shown on the left - a tree that points to two blobs, as well to a tree that points to two blobs.", +indexupdate_description_275,"Instead of removing an entry from the index and adding one with the same name, you can also directly update that entry! + +Put the content you want in a file with a matching name, and then run + + git update-index + +This will create a new blob, and update the hash of the entry to that blob. + +Update an entry in the index!", +indexupdate_win_hint_276,This is not really a good test for the winning condition..., +indexremove_description_277,"To remove an entry from the index, use a command like this: + + git update-index --force-remove + +Remove all entries from the index!", +commitcreate_description_278,"So a tree describes a directory structure at a specific point in time. + +It would be nice if we could remember when that state existed, and who authored it, right? + +Enter: commits. They are objects that point to a tree and contain some additional metadata. You can create a commit using + + git commit-tree -m ""Description of your commit"" + +Make a commit from the tree in this repository!", +treeread_description_279,"As soon as you have some tree objects, you can always read them and set the index exactly to their content! Unsurprisingly, the command is called + + git read-tree + +For , you can provide the hash of any tree object - you can right-click one to insert its hash into the terminal! + +Try reading some of the trees in this repository into the index!", +commitrhombus_description_280,"A commit can have multiple parents! You can specify the -p option multiple times, like this: + + git commit-tree -m ""Description"" -p -p + +Build a rhombus shape from commits, where two commits point to the same parent, and then a fourth commit points to both of them.", +commitrhombus_win_hint_281,My first parent's parents has to be the same as my second parent's parent., +refmove_description_282,"You can point refs to a new location using the same command you use to create them: + + git update-ref refs/ + +As an exercise, make all refs in this repository point to the tree object!", +blobremove_description_283,"There's a simple command to remove all objects that are not referenced by anything: + + git prune + +Remove all blobs in this repository.", +blobremove_congrats_284,"Generally, `git prune` will be useful if you want to clean up some objects you made. + +Alternatively, you can also click the ""Reload"" button to restart a level.", +symrefcreate_description_285,"Instead of pointing directly to objects, refs can also point to other refs! + +When that happens, they are called ""symbolic refs"". You can create or update a symbolic ref using + + git symbolic-ref + +Create a symbolic ref called ""refs/rainbow""!", +commitparents_description_286,"When using the commit-tree command, you can optionally specify a parent: + + git commit-tree -m ""Description"" -p + +Make a string of three commits! + +Hint: You'll need a tree object. What could be the easiest way to obtain one?", +blobcreate_description_287,"At its core, Git is very simple. It stores ""objects"", which are basically files identified by an ""identifier"" (short: ID). + +There are four types of objects: blobs, trees, commits, and tags. The simplest type is a ""blob"", which is just a piece of text. + +Let's create some blobs! To do that, create a file with the desired content, and then use + + git hash-object -w + +The flag -w means ""write"", and tells Git to actually write the new blob to the disk. + +Create three new blobs!", +blobcreate_congrats_288,"Tip: You can also use a command like this to create a blob in a single line: + + echo ""awesome content"" | git hash-object -w --stdin + +Did you already notice that you can drag and drop all objects? :)", +treecreate_description_289,"After carefully building the index we want, it would be nice to save a permanent snapshot of it, right? + +This is what the second type of objects is for: trees! You can convert the index into a tree using + + git write-tree + +Try it! :)", +treecreate_congrats_290,"Nice! + +Can you make a different tree? Modify the index, then call `git write-tree` again!", +welcome_description_291,"This is prototype #1 for the Git learning game by @bleeptrack and @blinry. Thanks for checking it out! <3 + +You can interact with the repository labelled ""yours"" by typing Bash commands in the terminal below! The visualization will show you its internal status. + +Let's get started by initializing an empty Git repository in the current directory by typing: + + git init", +welcome_congrats_292,"Well done! + +An empty Git repository is... well, quite empty. The only thing that always exists is a reference called ""HEAD"" - we'll learn what that is later! + +But first, let's look at some basics! + +(Click ""Next Level"" as soon as you're ready!)", +basics_description_293,"For this prototype, we assume you have some experience with the command line. Here are some commands that will be useful: + +- ls +- echo content > file +- cat file +- mkdir dir + +Find the riddle in your current directory and put the answer into the file ""answer""!", +basics_congrats_294,"Omnomnom! + +For technical reasons, you can't use `cd` in this prototype yet. But there won't be a lot of interaction with the file system anyways. :)", +puzzlepreciousblob_description_295,Create two trees pointing to the same blob!, +indexadd_description_296,"Blobs usually represent the content of a file. But on their own, they don't have any metadata, not even a name! + +Git has a very powerful concept to store metadata related to blobs: the index! It's a list that relates blobs to filenames and access permissions. + +The most convenient option to add an entry to the index is via an existing file: + + echo ""my content"" > file + git update-index --add file + +Add three entries to the index! For a bonus challenge: can you add a file that is inside of a directory, like ""directory/file""?", +indexadd_congrats_297,"There's another way to add an entry to the index directly: + + git update-index --add --cacheinfo ,, + +The first three numbers of the mode describe the type of the entry, ""100"" is a regular file. + +The second three number describe the permissions. Only ""644"" (non-executable) and ""755"" (executable) are supported. + +You can insert the hash of an object into the terminal by right-clicking on it! :)", +puzzletreesallthewaydown_description_298,"Construct a chain of three trees, which don't point to anything else. + +This is hard! The `git mktree` command might be useful.", +puzzletreesallthewaydown_win_hint_299,"So the tree has exactly one child, and it is a tree!", +puzzletreesallthewaydown_win_hint_300,Same for its child! \o/, +symrefnoderef_description_301,"When you have a symbolic ref (a ref pointing at another ref), and you decide you want it to be a regular ref again (pointing to an object), you're in for some trouble! :) + +What happens when you try pointing the symbolic ref directly to the blob using `git update-ref`? + +Oops! Turns out that when you reference a symbolic ref, it acts as if you had specified the ref it points to. To de-symbolic-ize it, use the `--no-deref` option directly after `update-ref`! + +Weird, huh?", +symrefnoderef_congrats_302,"Whew, we've covered a lot of things: Blobs! The index! Trees! Commits! Refs! + +You now know about almost everything about how Git repositories look like on the inside! We think that's pretty cool! :) + +Everything else is just convention and high-level commands that make interacting with the objects more convenient. + +We haven't covered: + +- tag objects (they are the fourth object type - a bit like refs with a description and an author) +- configuration (allows you to specify remote repositories, for example) +- working with local files (which is, uh, arguably pretty important :P) + +Thanks for playing! You're welcome to check out the ""puzzle"" levels in the dropdown, some of them are more advanced!", +puzzleapocalypse_description_303,"Delete all objects in this repository using git commands only! + +Useful commands: + + git prune + git reflog expire", +refremove_description_304,"And finally, to delete a ref, use + + git update-ref -d refs/ + +Delete all refs! :P (Well, except for HEAD. HEAD is special.)", +refcreate_description_305,"Let's take a look at ""refs"" (short for ""references"")! Refs are not objects, but rather very simple *pointers* to objects! They can help you keep track of what's where. + +You can create or update a ref with + + git update-ref refs/ + +Make sure to always start a ref's name with ""refs/""! That's a convention that helps Git find all refs you create. If you forget the ""refs/"", you will not see the ref. + +Create refs that point to all objects in this repository!", +problems_title_306,Problems, +problems_description_307,"Both you and your friend have been working on the file, and want to sync up!", +problems_win_hint_308,Commit your local changes., +friend_title_309,Friend, +friend_description_310,"Your friend added another line to your essay! Get it, add a third one and send it to them! + +Take turns until you have five lines!", +friend_win_hint_311,Got the second line from your friend, +friend_win_hint_312,Got the fourth line from your friend., +card_init_desc_313,Drag this card into the empty space above to initialize the time machine!, +card_clone_desc_314,Create your own copy of someone else's repo., +card_configname_desc_315,"Set your name. + +(Will not change anything outside of this game.)", +card_configemail_desc_316,Set your email address., +card_checkout_desc_317,Drag this card to a commit or to a branch to travel to it!, +card_checkoutfile_desc_318,Reset changes in a local file., +card_checkoutfrom_desc_319,"Get the file contents from the specified commits, and reset both the working directory, as well as the index, to it.", +card_commita_desc_320,"Make a new commit, after automatically adding all changes to the index. +You'll be asked to enter a short description of what you changed.", +card_commitauto_desc_321,Make a new commit containing your current environment! Type in a description of what changed!, +card_merge_desc_322,"Merge the specified timeline into yours. If necessary, will create a merge commit.", +card_mergeabort_desc_323,"Abort the current merge attempt, and reconstruct the previous state.", +card_rebase_desc_324,Put the events in your current timeline on top of the specified one., +card_pull_desc_325,"Get someone else's version of the current timeline, and try to merge it into yours.", +card_fetch_desc_326,Get a someone else's version of the current timeline., +card_push_desc_327,Give the current timeline to someone else., +card_rebaseinteractive_desc_328,"Make changes to the events in your current timeline, back to the commit you drag this to.", +card_rebasecontinue_desc_329,Continue the current rebasing process., +card_resethard_desc_330,Move the branch you're on to the specified commit., +card_reset_desc_331,"Jump to the commit, and update the index. Keep the current environment.", +card_resetfile_desc_332,Reset the index version of a file to the version in the commit you're on., +card_cherrypick_desc_333,Repeat the specified action on top of your current timeline., +card_revert_desc_334,Make a new commit that reverts the changes of the specified commit., +card_bisectstart_desc_335,Start looking for the commit where things got bad., +card_bisectgood_desc_336,"State that the current commit is good! When you're automatically transferred, keep playing the `good` and `bad` cards!", +card_bisectbad_desc_337,"State that the current commit is bad! When you're automatically transferred, keep playing the `good` and `bad` cards!", +card_add_desc_338,Update the index version of the file to its current real content., +card_rm_desc_339,"Delete a file both in the working directory, as well as the index.", +card_commit_desc_340,Make a commit from the current index., +card_show_desc_341,Show what changed in the commit., +card_branch_desc_342,Create a new branch at your current location., +card_branchdelete_desc_343,Delete a branch., +card_reflog_desc_344,Display a log of where the ref pointed to in the past., +card_filenew_desc_345,Create a new file., +card_filedelete_desc_346,Delete a file., +card_filerename_desc_347,Rename a file., +card_filecopy_desc_348,Make a copy of a file., diff --git a/translations.csv.import b/translations.csv.import new file mode 100644 index 00000000..5eaaa1fc --- /dev/null +++ b/translations.csv.import @@ -0,0 +1,16 @@ +[remap] + +importer="csv_translation" +type="Translation" + +[deps] + +files=[ "res://translations.en.translation", "res://translations.ru.translation" ] + +source_file="res://translations.csv" +dest_files=[ "res://translations.en.translation", "res://translations.ru.translation" ] + +[params] + +compress=true +delimiter=0 diff --git a/translations.en.translation b/translations.en.translation new file mode 100644 index 0000000000000000000000000000000000000000..1966ccaaec08dae91116e7705778a511f53d7a13 GIT binary patch literal 31293 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 literal 0 HcmV?d00001 diff --git a/translations.ru.translation b/translations.ru.translation new file mode 100644 index 0000000000000000000000000000000000000000..91241ec98e88293d5a8e956d70c70146369fd039 GIT binary patch literal 9648 zcmd^_c~s477spSETTz-MaY;g@NvMR#B{NBbA(Dzps(VfmLQ=_;P@-$7MQYa4e;{w1@!N3ve2#p5_?Ge0>y3~E4_^cJ4)xc6BG7T5*pDnxOhh#@UdxX{P0S;tSe9>CN= z{Xp6vU62vT0z|D=P){XnHsto8g`lM%>RnE1f5-Jft=*8!#vvH)3;^+`fL9ilC0A;=x% z4Pw3i5LXL%h!7(n?gZ@>YTV-h)JdR|Kk*Exvjmne#6pO-KzBg3phggz(;~!HAu`qm zxoj7aND-t4(gbONhJe_*0Yp%^tFUvO%z&}Im z0zaIxAVtvsTpb-6koPCG4&?eE6Ob8bEQon+gou4Jp>`x}sgN%hqCdpdpkPoaC=wI} z!u}Y@kARXvsh}$$Tq}UQ1XKa4BK#5LZ$KXf#$I>iK}sM^kQQhN2RAF$r`Mlr1o} zj<+ko3P2^G3SqqpVy%!jLTmxGg4zTo18+9iFE8Xu5Y<8b$eKRM(GQnHqy-uYYw+^X zsgHWyMyd!oG8Xr!Ji2QN2{QQc>&$1hWookbCFD0toJ-mJ2i6!LKi;F}NPNi4uNbAs zbNJ!w6>;o634Iv#^9Ci3Abvc@r$@R|W)q$_XG4Gusj=V5yLjsi!m(fZ(aWHRWWNK= zW=9)Hjs2QA63s^(o|0IX^peBVZM|(ja`=|)I;jcd960}z+Nx1oi674wusx?`FX0jA z`@A+JHN2#BUaMULmBz65J)BpSXy@6N?6dcD`(qzcqp$mjWJ_fZHwd(L8qVRd}w>jN~&oOk)L&8Im&xf2D>hY4@o=Tvlt)Hv^6u=ObRevbQe zFFSnGoA{7t*JzCFO?=3Y`z0sTbNsF8HyzJ$c<9x}9QHW|`!S~NH?CYtI6e;V%5Nx| z5MF2g#vz2%??24*RUqfW`{jJ&mYgc_-BCNx{({u#TMWK=gx>`p`^Al36eK>pua5FL& z{byd4evah$k8RVauOS@IU$FB_7cIh@<(9LLR6p*&w(-)``=rLTSKz}L$XGNQ@GSKi z$FJP@e8DI%P%q1?i&u)-XJzDgeXTBJtb)5EfzpU<(sr9MZUeObU7 zW6q+He>ZaY#jDSo)yZ7+2M(zgT_AqkZ_Sy9hUUcYYnypYiqzPzHz84OG@KLg(yQsa5M zMEIt&uW&zVA)jsd&+5fwKWXr>&-dv25rK~&{m3;u)4ojO_@md|3+_%hp4avC>_9KV zQ|y#O?{enm9{D}ak;6?s#`hmd`f+ZAxXEAu;n615m&b7Wqtp+~ok@K7+}{O!7U8|0 z$+Zq4{q5}28!PX;0nq{j2qsvq2OmT;UGJj+~EN_awxr-~A(&wW&D`jza5^NKe< zt+M3s0kQcTZjpYxe;F$G-TonbO^sD?7O8Qrm-jlo!Gz;E4~2V=z{i$(z1_+^?1^vK zH3vUwavt1QH$-t;9PybJhQ|L&YTS2=Wbd*S9PUsl{l=a%w>YP^(3S9sUtbs6ks9X) zpAGr4oHJLcX6{Qh4qtSA!B{beC)oY9#+fsJVyGnc5XWCHTP?+YM~LUZsN`H&@rH1` zP62Y!G9L(c)}QP;n(T*G`U`&UQ}4LDAC$3g#7vSjY2p60Fp zA?tWuB%_1ov=Tlo@j_BHsnO>$WWj`N!nNVtuSkvOaG2z@iTw@~&zpbCEb20;2SFc{ zKh|-6L-H&8QG^c!p9?uZ&fBID)l-+l&$hT)2Q#N zM)11l8gcmCJ_*zD4 zJa_!j52lw0$Ns-n71HGh&)CsiWkl`=`py9#OZcCenl)ERAMP`6rgBUM;n<(w_v{8I z!e11xNWV^M>{nGUl3q^sK^`^SI%7Y_AEzVV^8tr1*tAw*J%vkvYgk;lGVL!10&3mrHJQc-kO0&s~J$^|<@t zj|=Q?2sk&+WZzXeQsd9}?HWy$Ii%ldVtcFx@eS6Qn;uHmah}nd)Z;4&$9=oKnqWPb z^hd+Ke{p=ZD!EVQ6JPl4gtoQBhx@datMofXIPNo7oTs^n^f!lT)F=}l_TPV;oj;NI zkQ?c4y}6F#HwM0&!^vwrd>b$pv`-;Ep4IuRZ@50Mzq{jUdHO#MXAsp}5 zuR7n;h7*2dWq7q3=lrrxht6vfAD$;mX8)pY#BUv`xo=h3CgO5Uy7u@!|cjACsoLg!sRP8QfS%eAqwhrj+zj;zQn6*xs~< z<3H*0E?Po3p1*F4tcf$>_d;A;*>=fT{7*JK?(zpEvA%l9I_aP@SxA*9~XtK4D( z=~I0g6KYJ>alY2dX_NmZKD-Wh;T-!2-)&=*WK3%8ckN~)^5D!hiFdR(#_6sW7)olq9^+w-Kj9HG?p1n`TIs#q*FaL^xuPtK(u+Af zMcL+F1c!_MI@(^x;k#f?5r;>;=y;t=I9@m7%Wr2?5-u~XHc^|@c)lK|osDl0j{Tt$ zr}!qqTSjk8@Fdp_`?ogSy>Ny2kbjEnE%TYfyDoh2mWYlzDJc@%sD*Ybgta*9IpS*>NCqYe7nxg z!u}jC{^OhFKn@?Yr8Igcho2cAtNt4~KR!>AJC2xn6RtV^s;wKR|IxI%2@b@E{bS>E zwXF$%48AH(e*w*Gz;mqy*$ZYZbvNb{-bbtELmsKwYtI1CDwzFmZe=lL8D&{z=gQK{qsljz?=0W?Z>If! K^xDDy)%q_Cvxooy literal 0 HcmV?d00001 From 3bcc4125ffced3e423e374f5eb30660752d4e75b Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 02/15] Add basic english translations --- levels/branches/branch-create | 2 +- levels/branches/checkout-commit | 4 +- levels/branches/fork | 10 +-- levels/branches/grow | 4 +- levels/cli_translations_for_csv.txt | 18 +++++ levels/files/files-delete | 4 +- levels/index/new | 2 +- levels/intro/cli | 4 +- levels/intro/commit | 4 +- levels/intro/remote | 2 +- levels/py_levels.py | 119 ++++++++++++++++++++++++++++ scenes/file_browser.tscn | 2 - scenes/game.gd | 2 +- scenes/global_menu.tscn | 109 +++++++++++++++++++++++++ scenes/level.gd | 62 +++++++++------ scenes/main.tscn | 3 +- translations.csv | 18 +++++ translations.en.translation | Bin 31293 -> 32601 bytes translations.ru.translation | Bin 9648 -> 10008 bytes 19 files changed, 321 insertions(+), 48 deletions(-) create mode 100644 levels/cli_translations_for_csv.txt create mode 100644 levels/py_levels.py create mode 100644 scenes/global_menu.tscn diff --git a/levels/branches/branch-create b/levels/branches/branch-create index 2941736e..f11b30f1 100644 --- a/levels/branches/branch-create +++ b/levels/branches/branch-create @@ -7,7 +7,7 @@ branchcreate_description_090 [cli] -Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called "birthday", you can type `git checkout birthday` to travel to it! +cli_branchcreate_009 [setup] diff --git a/levels/branches/checkout-commit b/levels/branches/checkout-commit index d3f336de..d76d6944 100644 --- a/levels/branches/checkout-commit +++ b/levels/branches/checkout-commit @@ -7,9 +7,9 @@ checkoutcommit_description_086 [cli] -To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want! +cli_checkoutcommit_015 -This will insert the commit's unique identifier! +cli_checkoutcommit_016 [setup] diff --git a/levels/branches/fork b/levels/branches/fork index 340ee5db..adaec340 100644 --- a/levels/branches/fork +++ b/levels/branches/fork @@ -7,15 +7,15 @@ fork_description_104 [cli] -The blue animal represents a concept known as the "HEAD pointer" in Git: It shows you which commit is the current one. +cli_fork_010 -Here's a cool trick to go to the previous commit: +cli_fork_011 - git checkout HEAD^ + cli_fork_012 -You can also go back two commits by typing, for example: +cli_fork_013 - git checkout HEAD~2 + cli_fork_014 [setup] diff --git a/levels/branches/grow b/levels/branches/grow index 9b9f3c54..c75df78b 100644 --- a/levels/branches/grow +++ b/levels/branches/grow @@ -7,9 +7,9 @@ grow_description_095 [cli] -To travel to a branch, type `git checkout name_of_the_branch`. +cli_grow_007 -And to travel to the last commit, type `git checkout --detach name_of_the_branch`. +cli_grow_008 [setup] diff --git a/levels/cli_translations_for_csv.txt b/levels/cli_translations_for_csv.txt new file mode 100644 index 00000000..fbc4fa81 --- /dev/null +++ b/levels/cli_translations_for_csv.txt @@ -0,0 +1,18 @@ +cli_remote_001,"To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice.", +cli_commit_002,"Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below!", +cli_commit_003,"This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :)", +cli_cli_004,"But there's another way to interact with Git:", +cli_cli_005,"Try typing `git init` into the black terminal below, and pressing the enter key!", +cli_new_006,"You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time!", +cli_grow_007,"To travel to a branch, type `git checkout name_of_the_branch`.", +cli_grow_008,"And to travel to the last commit, type `git checkout --detach name_of_the_branch`.", +cli_branchcreate_009,"Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called ""birthday"", you can type `git checkout birthday` to travel to it!", +cli_fork_010,"The blue animal represents a concept known as the ""HEAD pointer"" in Git: It shows you which commit is the current one.", +cli_fork_011,"Here's a cool trick to go to the previous commit:", +cli_fork_012,"git checkout HEAD^", +cli_fork_013,"You can also go back two commits by typing, for example:", +cli_fork_014,"git checkout HEAD~2", +cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want!", +cli_checkoutcommit_016,"This will insert the commit's unique identifier!", +cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:", +cli_filesdelete_018,"rm *web", diff --git a/levels/files/files-delete b/levels/files/files-delete index fbc07970..b0adf76e 100644 --- a/levels/files/files-delete +++ b/levels/files/files-delete @@ -7,9 +7,9 @@ filesdelete_description_244 [cli] -On the command line, you can easily delete all files ending in -web using this command: +cli_filesdelete_017 - rm *web + cli_filesdelete_018 [setup] diff --git a/levels/index/new b/levels/index/new index 4ff583d7..18c64e72 100644 --- a/levels/index/new +++ b/levels/index/new @@ -7,7 +7,7 @@ new_description_082 [cli] -You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time! +cli_new_006 [setup] diff --git a/levels/intro/cli b/levels/intro/cli index 419205c6..31a03760 100644 --- a/levels/intro/cli +++ b/levels/intro/cli @@ -7,9 +7,9 @@ cli_description_113 [cli] -But there's another way to interact with Git: +cli_cli_004 -Try typing `git init` into the black terminal below, and pressing the enter key! +cli_cli_005 [setup] diff --git a/levels/intro/commit b/levels/intro/commit index b986e5c2..268d91d3 100644 --- a/levels/intro/commit +++ b/levels/intro/commit @@ -7,9 +7,9 @@ commit_description_135 [cli] -Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below! +cli_commit_002 -This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :) +cli_commit_003 [setup] diff --git a/levels/intro/remote b/levels/intro/remote index 9215a669..d0889a89 100644 --- a/levels/intro/remote +++ b/levels/intro/remote @@ -7,7 +7,7 @@ remote_description_129 [cli] -To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice. +cli_remote_001 [congrats] diff --git a/levels/py_levels.py b/levels/py_levels.py new file mode 100644 index 00000000..e51bab0a --- /dev/null +++ b/levels/py_levels.py @@ -0,0 +1,119 @@ +import os +import re +import csv + +# --- Конфигурация --- +# Имя файла, в который будут сохранены пары ключ-текст +OUTPUT_FILENAME = "cli_translations_for_csv.txt" + +# --- Глобальные переменные --- +# Список для хранения всех найденных пар [ключ, текст] +key_text_pairs = [] +# Глобальный счетчик для обеспечения уникальности ключей +key_counter = 1 + +def sanitize_for_key(text): + """Превращает имя файла в безопасную часть ключа.""" + return re.sub(r'[^a-zA-Z0-9_]+', '', text.lower()) + +def process_level_file(filepath): + """ + Обрабатывает один файл уровня: находит секции [cli], + извлекает текст, генерирует ключи и готовит новые строки файла. + """ + global key_counter + + # Создаем базовое имя для ключей из имени файла + base_filename = sanitize_for_key(os.path.splitext(os.path.basename(filepath))[0]) + + try: + with open(filepath, 'r', encoding='utf-8') as f: + lines = f.readlines() + except Exception as e: + print(f" ОШИБКА: Не удалось прочитать файл {filepath}. Пропуск. {e}") + return + + new_lines = [] + in_cli_section = False + file_changed = False + + for line in lines: + stripped_line = line.strip() + + # Проверяем, не находимся ли мы в новой секции + if stripped_line.startswith('[') and stripped_line.endswith(']'): + in_cli_section = (stripped_line == '[cli]') + new_lines.append(line) + continue + + # Если мы в секции [cli] и строка не пустая + if in_cli_section and stripped_line: + original_text = stripped_line + + # Генерируем новый ключ + key = f"cli_{base_filename}_{str(key_counter).zfill(3)}" + key_counter += 1 + + # Сохраняем пару для будущего TXT-файла + key_text_pairs.append([key, original_text]) + + # Заменяем оригинальную строку на ключ + # Сохраняем исходные отступы, заменяя только текст + indentation = line[:len(line) - len(line.lstrip())] + new_lines.append(f"{indentation}{key}\n") + + file_changed = True + print(f" Найден текст в {os.path.basename(filepath)}: \"{original_text[:60]}...\" -> {key}") + else: + # Если мы не в секции [cli] или строка пустая, оставляем ее как есть + new_lines.append(line) + + # Если в файле были изменения, перезаписываем его + if file_changed: + try: + with open(filepath, 'w', encoding='utf-8') as f: + f.writelines(new_lines) + print(f" -> Файл {os.path.basename(filepath)} успешно изменен.") + except Exception as e: + print(f" ОШИБКА: Не удалось записать в файл {filepath}. {e}") + +def main(): + """Главная функция скрипта.""" + print("Запуск скрипта для перевода секций [cli]...") + print(f"Рабочая директория: {os.getcwd()}") + print("ВАЖНО: Убедитесь, что вы сделали резервную копию (коммит в Git)!") + input("Нажмите Enter для продолжения...") + + # Рекурсивно обходим все файлы и папки, начиная с текущей ('.') + for root, _, files in os.walk('.'): + for filename in files: + # Пропускаем файлы 'sequence' + if filename == 'sequence': + continue + + filepath = os.path.join(root, filename) + process_level_file(filepath) + + # Если мы нашли хотя бы один текст для перевода + if key_text_pairs: + print(f"\nНайдено {len(key_text_pairs)} строк текста.") + print(f"Сохранение пар ключ-текст в файл '{OUTPUT_FILENAME}'...") + try: + with open(OUTPUT_FILENAME, 'w', newline='', encoding='utf-8') as f: + # Используем csv.writer для корректной обработки кавычек и запятых + writer = csv.writer(f, quoting=csv.QUOTE_ALL) + for key, text in key_text_pairs: + # Записываем в формате: "ключ","английский текст", + # Пустая строка в конце добавляет ту самую висячую запятую + writer.writerow([key, text, '']) + print(f" Файл '{OUTPUT_FILENAME}' успешно создан.") + print("\nТеперь скопируйте содержимое этого файла и вставьте в конец вашего основного translations.csv") + except Exception as e: + print(f" ОШИБКА: Не удалось создать файл '{OUTPUT_FILENAME}'. {e}") + else: + print("\nТекст в секциях [cli] для перевода не найден.") + + print("\nСкрипт завершил работу.") + +if __name__ == "__main__": + main() diff --git a/scenes/file_browser.tscn b/scenes/file_browser.tscn index 562ae1ab..0e0e7850 100644 --- a/scenes/file_browser.tscn +++ b/scenes/file_browser.tscn @@ -74,8 +74,6 @@ size_flags_horizontal = 3 size_flags_vertical = 3 [node name="Grid" type="GridContainer" parent="Panel/Margin/Rows/Scroll"] -margin_right = 1904.0 -margin_bottom = 1064.0 size_flags_horizontal = 3 size_flags_vertical = 3 custom_constants/vseparation = 16 diff --git a/scenes/game.gd b/scenes/game.gd index fec9255f..d9d604af 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -210,4 +210,4 @@ func tr_custom(key): func _init(): # --- ПРИВЕСТИ ФУНКЦИЮ _init() К ТАКОМУ ВИДУ --- _load_translations() - current_locale = "ru" + current_locale = "en" diff --git a/scenes/global_menu.tscn b/scenes/global_menu.tscn new file mode 100644 index 00000000..a1306eb3 --- /dev/null +++ b/scenes/global_menu.tscn @@ -0,0 +1,109 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://images/cli-badge.svg" type="Texture" id=1] +[ext_resource path="res://scenes/cli_badge.gd" type="Script" id=2] +[ext_resource path="res://scenes/music_button.tscn" type="PackedScene" id=3] +[ext_resource path="res://scenes/cli_badge.tscn" type="PackedScene" id=4] +[ext_resource path="res://styles/alert_button.tres" type="StyleBox" id=5] +[ext_resource path="res://scenes/music_button.gd" type="Script" id=6] + +[sub_resource type="StyleBoxFlat" id=2] +content_margin_left = 10.0 +content_margin_right = 10.0 +content_margin_top = 5.0 +content_margin_bottom = 5.0 +bg_color = Color( 0.847059, 0.0666667, 0.0666667, 1 ) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 + +[node name="Menu" type="HBoxContainer"] +margin_left = 3.86392 +margin_top = 5.13129 +margin_right = 636.864 +margin_bottom = 44.1313 +custom_constants/separation = 8 + +[node name="BackButton" type="Button" parent="."] +margin_right = 264.0 +margin_bottom = 39.0 +focus_mode = 0 +enabled_focus_mode = 0 +text = "main_backbutton_016" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ReloadButton2" type="Button" parent="."] +margin_left = 272.0 +margin_right = 567.0 +margin_bottom = 39.0 +focus_mode = 0 +enabled_focus_mode = 0 +text = "main_reloadbutton2_017" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CardsButton" type="Button" parent="."] +visible = false +margin_left = 458.0 +margin_right = 539.0 +margin_bottom = 39.0 +focus_mode = 0 +enabled_focus_mode = 0 +text = "main_cardsbutton_018" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Tip!" type="Button" parent="."] +visible = false +margin_left = 169.0 +margin_right = 225.0 +margin_bottom = 39.0 +focus_mode = 0 +enabled_focus_mode = 0 +text = "main_tip_019" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button3" type="Button" parent="." instance=ExtResource( 3 )] +margin_left = 575.0 +margin_right = 896.0 +margin_bottom = 39.0 +focus_mode = 0 +enabled_focus_mode = 0 +text = "music_button_button3_003" +script = ExtResource( 6 ) + +[node name="CLIBadge" type="TextureRect" parent="." instance=ExtResource( 4 )] +margin_left = 904.0 +margin_right = 949.0 +margin_bottom = 39.0 +rect_min_size = Vector2( 45, 0 ) +size_flags_stretch_ratio = 0.0 +texture = ExtResource( 1 ) +expand = true +stretch_mode = 6 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="NextLevelButton" type="Button" parent="."] +margin_left = 957.0 +margin_right = 1273.0 +margin_bottom = 39.0 +focus_mode = 0 +custom_styles/hover = SubResource( 2 ) +custom_styles/normal = ExtResource( 5 ) +enabled_focus_mode = 0 +text = "main_nextlevelbutton_020" +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="pressed" from="Button3" to="Button3" method="toggle_music"] diff --git a/scenes/level.gd b/scenes/level.gd index 9c24606d..8dfddee7 100644 --- a/scenes/level.gd +++ b/scenes/level.gd @@ -17,42 +17,52 @@ func load(path): var dir = Directory.new() if dir.file_exists(path): - # This is a new-style level. var config = helpers.parse(path) - # --- НАЧАЛО БЛОКА ЛОКАЛИЗАЦИИ --- - # 1. Сначала получаем КЛЮЧИ из файла уровня. - # "default_..." - это запасные ключи, если в файле уровня чего-то нет. - var title_key = config.get("title", "default_title_key") - var description_key = config.get("description", "default_description_key") - var congrats_key = config.get("congrats", "default_congrats_key") + # --- Перевод однострочных ключей --- + title = game.tr_custom(config.get("title", "default_title_key")) + var description_text = game.tr_custom(config.get("description", "default_description_key")) + congrats = game.tr_custom(config.get("congrats", "default_congrats_key")) + + # --- ПРАВИЛЬНАЯ ОБРАБОТКА МНОГОСТРОЧНОГО [CLI] --- + var cli_hints_keys_block = config.get("cli", "") # Получаем блок с ключами + var translated_cli_lines = [] # Массив для переведенных строк + + if cli_hints_keys_block != "": + # Разбиваем блок на отдельные ключи по символу переноса строки + for key in cli_hints_keys_block.split("\n"): + var stripped_key = key.strip_edges(true, true) + if stripped_key != "": + # Переводим каждый ключ индивидуально + translated_cli_lines.push_back(game.tr_custom(stripped_key)) + else: + # Сохраняем пустые строки для форматирования + translated_cli_lines.push_back("") - # 2. Теперь ПЕРЕВОДИМ ключи с помощью нашего глобального переводчика из game.gd. - title = game.tr_custom(title_key) - var description_text = game.tr_custom(description_key) - congrats = game.tr_custom(congrats_key) - # --- КОНЕЦ БЛОКА ЛОКАЛИЗАЦИИ --- + # Собираем переведенные строки обратно в единый текст + var cli_hints_text = PoolStringArray(translated_cli_lines).join("\n") + # --------------------------------------------------------- - # 3. Дальше идет оригинальная обработка УЖЕ ПЕРЕВЕДЕННОГО текста description. + # --- Дальше идет блок форматирования, он остается без изменений --- var monospace_regex = RegEx.new() monospace_regex.compile("\\n ([^\\n]*)") - description_text = monospace_regex.sub(description_text, "\n [code][color=#e1e160]$1[/color][/code]", true) - description = description_text.split("---") - - var cli_hints = config.get("cli", "") - # Also do this substitution in the CLI hints. - cli_hints = monospace_regex.sub(cli_hints, "\n [code][color=#bbbb5d]$1[/color][/code]", true) - - # Also replace `code` with [code] tags. var monospace_inline_regex = RegEx.new() monospace_inline_regex.compile("`([^`]+)`") - description[0] = monospace_inline_regex.sub(description[0], "[code][color=#e1e160]$1[/color][/code]") - cli_hints = monospace_inline_regex.sub(cli_hints, "[code][color=#bbbb5d]$1[/color][/code]", true) + + if description_text != null: + description_text = monospace_regex.sub(description_text, "\n [code][color=#e1e160]$1[/color][/code]", true) + description_text = monospace_inline_regex.sub(description_text, "[code][color=#e1e160]$1[/color][/code]") + else: + description_text = "" - if cli_hints != "": - description[0] = description[0] + "\n\n[color=#787878]"+cli_hints+"[/color]" + description = description_text.split("---") - # Этот код остается без изменений, так как он не работает с переводимым текстом + if cli_hints_text != null and cli_hints_text != "": + cli_hints_text = monospace_regex.sub(cli_hints_text, "\n [code][color=#bbbb5d]$1[/color][/code]", true) + cli_hints_text = monospace_inline_regex.sub(cli_hints_text, "[code][color=#bbbb5d]$1[/color][/code]", true) + if description.size() > 0: + description[0] = description[0] + "\n\n[color=#787878]"+cli_hints_text+"[/color]" + cards = Array(config.get("cards", "").split(" ")) if cards == [""]: cards = [] diff --git a/scenes/main.tscn b/scenes/main.tscn index cc8e4865..efd901aa 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -189,9 +189,9 @@ position = Vector2( 68.6342, 59.1206 ) script = ExtResource( 9 ) [node name="Area2D" type="Area2D" parent="Cursor"] -input_pickable = false collision_layer = 524288 collision_mask = 0 +input_pickable = false [node name="CollisionShape2D" type="CollisionShape2D" parent="Cursor/Area2D"] shape = SubResource( 1 ) @@ -276,6 +276,7 @@ text = "main_nextlevelbutton_020" __meta__ = { "_edit_use_anchors_": false } + [connection signal="saved" from="Rows/Columns/RightSide/FileBrowser" to="." method="update_repos"] [connection signal="command_done" from="Rows/Controls/Terminal" to="." method="update_repos"] [connection signal="pressed" from="Menu/BackButton" to="." method="back"] diff --git a/translations.csv b/translations.csv index ad716532..5b2f0cbf 100644 --- a/translations.csv +++ b/translations.csv @@ -806,3 +806,21 @@ card_filenew_desc_345,Create a new file., card_filedelete_desc_346,Delete a file., card_filerename_desc_347,Rename a file., card_filecopy_desc_348,Make a copy of a file., +cli_remote_001,"To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice.", +cli_commit_002,"Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below!", +cli_commit_003,"This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :)", +cli_cli_004,"But there's another way to interact with Git:", +cli_cli_005,"Try typing `git init` into the black terminal below, and pressing the enter key!", +cli_new_006,"You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time!", +cli_grow_007,"To travel to a branch, type `git checkout name_of_the_branch`.", +cli_grow_008,"And to travel to the last commit, type `git checkout --detach name_of_the_branch`.", +cli_branchcreate_009,"Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called ""birthday"", you can type `git checkout birthday` to travel to it!", +cli_fork_010,"The blue animal represents a concept known as the ""HEAD pointer"" in Git: It shows you which commit is the current one.", +cli_fork_011,"Here's a cool trick to go to the previous commit:", +cli_fork_012,"`git checkout HEAD^`", +cli_fork_013,"You can also go back two commits by typing, for example:", +cli_fork_014,"`git checkout HEAD~2`", +cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want!", +cli_checkoutcommit_016,"This will insert the commit's unique identifier!", +cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:", +cli_filesdelete_018," `rm *web`", diff --git a/translations.en.translation b/translations.en.translation index 1966ccaaec08dae91116e7705778a511f53d7a13..d01cad1338928b656f1e7b1f6e328145748fcb78 100644 GIT binary patch delta 10894 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 diff --git a/translations.ru.translation b/translations.ru.translation index 91241ec98e88293d5a8e956d70c70146369fd039..715496aa8db039147c113bbef1ab287518c730bd 100644 GIT binary patch literal 10008 zcmdU#dsvNW7shu=Qz4xsF(jeVNhlMdoN^{5(nuFHzK}BRD3Pt3U!w^&7dYgC6cVBZo-(TNfvoH6x*7`m7TF>*oyIp%1 in74k!! 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 K^xDDy)%q_Cvxooy From cef0d81a13093d2f680722f7fa818526062f4ffc Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 03/15] Add global_menu scene. Put the menu in one place on level_select and main scenes --- scenes/global_menu.gd | 32 +++++++++++ scenes/global_menu.tscn | 59 +++++++++------------ scenes/level_select.tscn | 39 +++++--------- scenes/main.gd | 2 + scenes/main.tscn | 112 +++++---------------------------------- scenes/music_button.gd | 1 - scenes/music_button.tscn | 6 +-- scenes/title.tscn | 18 +------ 8 files changed, 86 insertions(+), 183 deletions(-) create mode 100644 scenes/global_menu.gd diff --git a/scenes/global_menu.gd b/scenes/global_menu.gd new file mode 100644 index 00000000..a5af5c2f --- /dev/null +++ b/scenes/global_menu.gd @@ -0,0 +1,32 @@ +extends HBoxContainer + +signal back_pressed +signal reload_pressed +signal cards_toggle_pressed +signal new_tip_pressed +signal next_level_pressed +signal hide_cli +signal hide_next_level + +export var show_next_level_button = true +export var show_cli_badge = true + +func _ready(): + $NextLevelButton.visible = show_next_level_button + $CLIBadge.visible = show_cli_badge + +func _on_BackButton_pressed(): + emit_signal("back_pressed") + +func _on_ReloadButton2_pressed(): + emit_signal("reload_pressed") + +func _on_Tip_pressed(): + emit_signal("new_tip_pressed") + +func _on_CardsButton_pressed(): + emit_signal("cards_toggle_pressed") + +func _on_NextLevelButton_pressed(): + emit_signal("next_level_pressed") + diff --git a/scenes/global_menu.tscn b/scenes/global_menu.tscn index a1306eb3..47103b09 100644 --- a/scenes/global_menu.tscn +++ b/scenes/global_menu.tscn @@ -1,11 +1,9 @@ -[gd_scene load_steps=8 format=2] +[gd_scene load_steps=6 format=2] -[ext_resource path="res://images/cli-badge.svg" type="Texture" id=1] -[ext_resource path="res://scenes/cli_badge.gd" type="Script" id=2] +[ext_resource path="res://scenes/global_menu.gd" type="Script" id=1] [ext_resource path="res://scenes/music_button.tscn" type="PackedScene" id=3] [ext_resource path="res://scenes/cli_badge.tscn" type="PackedScene" id=4] [ext_resource path="res://styles/alert_button.tres" type="StyleBox" id=5] -[ext_resource path="res://scenes/music_button.gd" type="Script" id=6] [sub_resource type="StyleBoxFlat" id=2] content_margin_left = 10.0 @@ -24,9 +22,10 @@ margin_top = 5.13129 margin_right = 636.864 margin_bottom = 44.1313 custom_constants/separation = 8 +script = ExtResource( 1 ) [node name="BackButton" type="Button" parent="."] -margin_right = 264.0 +margin_right = 151.0 margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 @@ -36,8 +35,8 @@ __meta__ = { } [node name="ReloadButton2" type="Button" parent="."] -margin_left = 272.0 -margin_right = 567.0 +margin_left = 159.0 +margin_right = 329.0 margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 @@ -48,8 +47,8 @@ __meta__ = { [node name="CardsButton" type="Button" parent="."] visible = false -margin_left = 458.0 -margin_right = 539.0 +margin_left = 337.0 +margin_right = 493.0 margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 @@ -60,8 +59,8 @@ __meta__ = { [node name="Tip!" type="Button" parent="."] visible = false -margin_left = 169.0 -margin_right = 225.0 +margin_left = 501.0 +margin_right = 598.0 margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 @@ -70,32 +69,22 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="Button3" type="Button" parent="." instance=ExtResource( 3 )] -margin_left = 575.0 -margin_right = 896.0 +[node name="Button3" parent="." instance=ExtResource( 3 )] +margin_left = 337.0 +margin_top = 0.0 +margin_right = 522.0 margin_bottom = 39.0 -focus_mode = 0 -enabled_focus_mode = 0 -text = "music_button_button3_003" -script = ExtResource( 6 ) -[node name="CLIBadge" type="TextureRect" parent="." instance=ExtResource( 4 )] -margin_left = 904.0 -margin_right = 949.0 +[node name="CLIBadge" parent="." instance=ExtResource( 4 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 530.0 +margin_right = 575.0 margin_bottom = 39.0 -rect_min_size = Vector2( 45, 0 ) -size_flags_stretch_ratio = 0.0 -texture = ExtResource( 1 ) -expand = true -stretch_mode = 6 -script = ExtResource( 2 ) -__meta__ = { -"_edit_use_anchors_": false -} [node name="NextLevelButton" type="Button" parent="."] -margin_left = 957.0 -margin_right = 1273.0 +margin_left = 583.0 +margin_right = 772.0 margin_bottom = 39.0 focus_mode = 0 custom_styles/hover = SubResource( 2 ) @@ -106,4 +95,8 @@ __meta__ = { "_edit_use_anchors_": false } -[connection signal="pressed" from="Button3" to="Button3" method="toggle_music"] +[connection signal="pressed" from="BackButton" to="." method="_on_BackButton_pressed"] +[connection signal="pressed" from="ReloadButton2" to="." method="_on_ReloadButton2_pressed"] +[connection signal="pressed" from="CardsButton" to="." method="_on_CardsButton_pressed"] +[connection signal="pressed" from="Tip!" to="." method="_on_Tip_pressed"] +[connection signal="pressed" from="NextLevelButton" to="." method="_on_NextLevelButton_pressed"] diff --git a/scenes/level_select.tscn b/scenes/level_select.tscn index 132ec447..fb653f11 100644 --- a/scenes/level_select.tscn +++ b/scenes/level_select.tscn @@ -3,7 +3,7 @@ [ext_resource path="res://styles/theme.tres" type="Theme" id=1] [ext_resource path="res://scenes/level_select.gd" type="Script" id=2] [ext_resource path="res://styles/alert_button.tres" type="StyleBox" id=3] -[ext_resource path="res://scenes/music_button.tscn" type="PackedScene" id=4] +[ext_resource path="res://scenes/global_menu.tscn" type="PackedScene" id=4] [sub_resource type="StyleBoxFlat" id=1] bg_color = Color( 0.54902, 0.0392157, 0.0392157, 1 ) @@ -42,30 +42,6 @@ margin_right = 1320.0 margin_bottom = 1080.0 size_flags_horizontal = 3 -[node name="Button" type="Button" parent="."] -margin_left = 61.0902 -margin_top = 59.0538 -margin_right = 126.09 -margin_bottom = 98.0538 -text = "main_backbutton_016" -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Button2" type="Button" parent="."] -margin_left = 138.588 -margin_top = 59.3009 -margin_right = 226.588 -margin_bottom = 98.3009 -focus_mode = 0 -enabled_focus_mode = 0 -text = "main_reloadbutton2_017" -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Button3" parent="." instance=ExtResource( 4 )] - [node name="HelpLabel" type="Label" parent="."] visible = false margin_left = 63.0 @@ -90,6 +66,15 @@ text = "level_select_button3_029" __meta__ = { "_edit_use_anchors_": false } -[connection signal="pressed" from="Button" to="." method="back"] -[connection signal="pressed" from="Button2" to="." method="reload"] + +[node name="Menu" parent="." instance=ExtResource( 4 )] +margin_left = 15.0 +margin_top = 15.0 +margin_right = 1288.0 +margin_bottom = 54.0 +show_next_level_button = false +show_cli_badge = false + [connection signal="pressed" from="HelpLabel/Button3" to="." method="onSurveyPressed"] +[connection signal="back_pressed" from="Menu" to="." method="back"] +[connection signal="reload_pressed" from="Menu" to="." method="reload"] diff --git a/scenes/main.gd b/scenes/main.gd index 0e401342..4a845709 100644 --- a/scenes/main.gd +++ b/scenes/main.gd @@ -227,3 +227,5 @@ func new_tip(): func back(): get_tree().change_scene("res://scenes/level_select.tscn") + + diff --git a/scenes/main.tscn b/scenes/main.tscn index efd901aa..4e2d658d 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -1,31 +1,18 @@ -[gd_scene load_steps=14 format=2] +[gd_scene load_steps=11 format=2] [ext_resource path="res://scenes/terminal.tscn" type="PackedScene" id=1] [ext_resource path="res://scenes/main.gd" type="Script" id=2] [ext_resource path="res://scenes/cards.tscn" type="PackedScene" id=3] -[ext_resource path="res://styles/alert_button.tres" type="StyleBox" id=4] +[ext_resource path="res://scenes/global_menu.tscn" type="PackedScene" id=4] [ext_resource path="res://scenes/file_browser.tscn" type="PackedScene" id=5] [ext_resource path="res://styles/theme.tres" type="Theme" id=6] [ext_resource path="res://fonts/big.tres" type="DynamicFont" id=7] [ext_resource path="res://sounds/success.wav" type="AudioStream" id=8] [ext_resource path="res://scenes/cursor.gd" type="Script" id=9] -[ext_resource path="res://scenes/cli_badge.tscn" type="PackedScene" id=10] -[ext_resource path="res://scenes/music_button.tscn" type="PackedScene" id=11] [sub_resource type="CircleShape2D" id=1] radius = 1.0 -[sub_resource type="StyleBoxFlat" id=2] -content_margin_left = 10.0 -content_margin_right = 10.0 -content_margin_top = 5.0 -content_margin_bottom = 5.0 -bg_color = Color( 0.847059, 0.0666667, 0.0666667, 1 ) -corner_radius_top_left = 3 -corner_radius_top_right = 3 -corner_radius_bottom_right = 3 -corner_radius_bottom_left = 3 - [node name="Main" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 @@ -196,91 +183,16 @@ input_pickable = false [node name="CollisionShape2D" type="CollisionShape2D" parent="Cursor/Area2D"] shape = SubResource( 1 ) -[node name="Menu" type="HBoxContainer" parent="."] -margin_left = 3.86392 -margin_top = 5.13129 -margin_right = 636.864 -margin_bottom = 44.1313 -custom_constants/separation = 8 -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="BackButton" type="Button" parent="Menu"] -margin_right = 65.0 -margin_bottom = 39.0 -focus_mode = 0 -enabled_focus_mode = 0 -text = "main_backbutton_016" -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="ReloadButton2" type="Button" parent="Menu"] -margin_left = 73.0 -margin_right = 161.0 -margin_bottom = 39.0 -focus_mode = 0 -enabled_focus_mode = 0 -text = "main_reloadbutton2_017" -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="CardsButton" type="Button" parent="Menu"] -visible = false -margin_left = 458.0 -margin_right = 539.0 -margin_bottom = 39.0 -focus_mode = 0 -enabled_focus_mode = 0 -text = "main_cardsbutton_018" -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Tip!" type="Button" parent="Menu"] -visible = false -margin_left = 169.0 -margin_right = 225.0 -margin_bottom = 39.0 -focus_mode = 0 -enabled_focus_mode = 0 -text = "main_tip_019" -__meta__ = { -"_edit_use_anchors_": false -} - -[node name="Button3" parent="Menu" instance=ExtResource( 11 )] -margin_left = 169.0 -margin_top = 0.0 -margin_right = 315.0 -margin_bottom = 39.0 - -[node name="CLIBadge" parent="Menu" instance=ExtResource( 10 )] -anchor_right = 0.0 -anchor_bottom = 0.0 -margin_left = 323.0 -margin_right = 368.0 -margin_bottom = 39.0 - -[node name="NextLevelButton" type="Button" parent="Menu"] -margin_left = 376.0 -margin_right = 493.0 -margin_bottom = 39.0 -focus_mode = 0 -custom_styles/hover = SubResource( 2 ) -custom_styles/normal = ExtResource( 4 ) -enabled_focus_mode = 0 -text = "main_nextlevelbutton_020" -__meta__ = { -"_edit_use_anchors_": false -} +[node name="Menu" parent="." instance=ExtResource( 4 )] +margin_left = 7.0 +margin_top = 7.0 +margin_right = 1280.0 +margin_bottom = 46.0 [connection signal="saved" from="Rows/Columns/RightSide/FileBrowser" to="." method="update_repos"] [connection signal="command_done" from="Rows/Controls/Terminal" to="." method="update_repos"] -[connection signal="pressed" from="Menu/BackButton" to="." method="back"] -[connection signal="pressed" from="Menu/ReloadButton2" to="." method="reload_level"] -[connection signal="pressed" from="Menu/CardsButton" to="." method="toggle_cards"] -[connection signal="pressed" from="Menu/Tip!" to="." method="new_tip"] -[connection signal="pressed" from="Menu/NextLevelButton" to="." method="load_next_level"] +[connection signal="back_pressed" from="Menu" to="." method="back"] +[connection signal="cards_toggle_pressed" from="Menu" to="." method="toggle_cards"] +[connection signal="new_tip_pressed" from="Menu" to="." method="new_tip"] +[connection signal="next_level_pressed" from="Menu" to="." method="load_next_level"] +[connection signal="reload_pressed" from="Menu" to="." method="reload_level"] diff --git a/scenes/music_button.gd b/scenes/music_button.gd index 6cc4e03e..4d8fdc81 100644 --- a/scenes/music_button.gd +++ b/scenes/music_button.gd @@ -4,6 +4,5 @@ extends Button func _ready(): pass - func toggle_music(): game.toggle_music() diff --git a/scenes/music_button.tscn b/scenes/music_button.tscn index 9dc422e3..5208743f 100644 --- a/scenes/music_button.tscn +++ b/scenes/music_button.tscn @@ -1,6 +1,5 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=2 format=2] -[ext_resource path="res://scripts/translator.gd" type="Script" id=1] [ext_resource path="res://scenes/music_button.gd" type="Script" id=2] [node name="Button3" type="Button"] @@ -13,7 +12,4 @@ enabled_focus_mode = 0 text = "music_button_button3_003" script = ExtResource( 2 ) -[node name="translator" type="Node" parent="."] -script = ExtResource( 1 ) - [connection signal="pressed" from="." to="." method="toggle_music"] diff --git a/scenes/title.tscn b/scenes/title.tscn index 8fa9c61b..94d0c547 100644 --- a/scenes/title.tscn +++ b/scenes/title.tscn @@ -1,9 +1,8 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://styles/theme.tres" type="Theme" id=1] [ext_resource path="res://images/oh-my-git.png" type="Texture" id=2] [ext_resource path="res://scenes/title.gd" type="Script" id=3] -[ext_resource path="res://scripts/translator.gd" type="Script" id=4] [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=5] [node name="Title" type="Control"] @@ -25,9 +24,6 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="translator" type="Node" parent="Label2"] -script = ExtResource( 4 ) - [node name="Label3" type="Label" parent="."] margin_left = 709.713 margin_top = 621.416 @@ -38,9 +34,6 @@ custom_fonts/font = ExtResource( 5 ) text = "title_label3_008" align = 1 -[node name="translator" type="Node" parent="Label3"] -script = ExtResource( 4 ) - [node name="VBoxContainer" type="VBoxContainer" parent="."] margin_left = 784.553 margin_top = 702.517 @@ -55,27 +48,18 @@ margin_right = 351.0 margin_bottom = 39.0 text = "title_button_009" -[node name="translator" type="Node" parent="VBoxContainer/Button"] -script = ExtResource( 4 ) - [node name="Button3" type="Button" parent="VBoxContainer"] margin_top = 44.0 margin_right = 351.0 margin_bottom = 83.0 text = "title_button3_010" -[node name="translator" type="Node" parent="VBoxContainer/Button3"] -script = ExtResource( 4 ) - [node name="Button2" type="Button" parent="VBoxContainer"] margin_top = 88.0 margin_right = 351.0 margin_bottom = 127.0 text = "title_button2_011" -[node name="translator" type="Node" parent="VBoxContainer/Button2"] -script = ExtResource( 4 ) - [node name="Sprite" type="Sprite" parent="."] [node name="oh-my-git" type="Sprite" parent="Sprite"] From b1651787edac9a1df4f8b7eacfdf1cfb2e30e726 Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 04/15] Add translation to: card descriptions, level names, title.tscn and global_menu All these nodes translated without godot default localization mechanisms, just by scripts --- project.godot | 2 +- scenes/card.gd | 2 +- scenes/card.tscn | 17 +- scenes/game.gd | 6 +- scenes/global_menu.gd | 7 + scenes/global_menu.tscn | 4 +- scenes/level_select.tscn | 6 - scenes/levels.gd | 1 + scenes/main.tscn | 13 +- scenes/title.gd | 7 + translations.csv | 1670 +++++++++++++++++++++++++---------- translations.en.translation | Bin 32601 -> 1077 bytes translations.ru.translation | Bin 10008 -> 1392 bytes 13 files changed, 1234 insertions(+), 501 deletions(-) diff --git a/project.godot b/project.godot index d91ca6c0..b06a33d0 100644 --- a/project.godot +++ b/project.godot @@ -151,7 +151,7 @@ mute={ [locale] -translations=PoolStringArray( "res://translations.en.translation", "res://translations.ru.translation" ) +translations=PoolStringArray( ) [network] diff --git a/scenes/card.gd b/scenes/card.gd index c1cea7c1..7c8771d6 100644 --- a/scenes/card.gd +++ b/scenes/card.gd @@ -106,7 +106,7 @@ func set_command(new_command): func set_description(new_description): description = game.tr_custom(new_description) $Description.text = description - + func set_energy(new_energy): energy = new_energy if energy_label: diff --git a/scenes/card.tscn b/scenes/card.tscn index 1bfe8a53..03f5055a 100644 --- a/scenes/card.tscn +++ b/scenes/card.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=2] +[gd_scene load_steps=14 format=2] [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=1] [ext_resource path="res://nodes/blob.svg" type="Texture" id=2] @@ -6,7 +6,7 @@ [ext_resource path="res://sounds/swish.wav" type="AudioStream" id=4] [ext_resource path="res://sounds/swoosh.wav" type="AudioStream" id=5] [ext_resource path="res://sounds/poof.wav" type="AudioStream" id=6] -[ext_resource path="res://fonts/small.tres" type="DynamicFont" id=7] +[ext_resource path="res://fonts/iosevka-regular.ttf" type="DynamicFontData" id=7] [sub_resource type="StyleBoxFlat" id=1] bg_color = Color( 0.45098, 0.584314, 0.843137, 1 ) @@ -49,9 +49,10 @@ corner_radius_top_right = 10 corner_radius_bottom_right = 10 corner_radius_bottom_left = 10 -[node name="Card" type="Node2D" groups=[ -"cards", -]] +[sub_resource type="DynamicFont" id=6] +font_data = ExtResource( 7 ) + +[node name="Card" type="Node2D" groups=["cards"]] script = ExtResource( 3 ) [node name="Panel" type="Panel" parent="."] @@ -120,13 +121,10 @@ margin_left = -92.0 margin_top = -98.0 margin_right = 90.0 margin_bottom = -14.0 -custom_fonts/font = ExtResource( 7 ) custom_colors/font_color = Color( 0, 0, 0, 1 ) +custom_fonts/font = SubResource( 6 ) text = "card_description_001" autowrap = true -__meta__ = { -"_edit_use_anchors_": false -} [node name="Sprite" type="Sprite" parent="."] visible = false @@ -170,5 +168,6 @@ stretch_mode = 6 __meta__ = { "_edit_use_anchors_": false } + [connection signal="mouse_entered" from="Area2D" to="." method="_mouse_entered"] [connection signal="mouse_exited" from="Area2D" to="." method="_mouse_exited"] diff --git a/scenes/game.gd b/scenes/game.gd index d9d604af..2e82faf9 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -13,7 +13,7 @@ var current_level = 0 var skipped_title = false var translations = {} -var current_locale = "en" +var current_locale = "ru" var _file = "user://savegame.json" var state = {} @@ -164,7 +164,7 @@ func new_shell(): if OS.get_name() == "Windows": return BetterShell.new() else: - return Shell.new() + return Shell.new() # --- ДОБАВИТЬ ЭТИ ДВЕ ФУНКЦИИ В КОНЕЦ ФАЙЛА --- @@ -210,4 +210,4 @@ func tr_custom(key): func _init(): # --- ПРИВЕСТИ ФУНКЦИЮ _init() К ТАКОМУ ВИДУ --- _load_translations() - current_locale = "en" + current_locale = "ru" diff --git a/scenes/global_menu.gd b/scenes/global_menu.gd index a5af5c2f..2a25c8e0 100644 --- a/scenes/global_menu.gd +++ b/scenes/global_menu.gd @@ -14,6 +14,13 @@ export var show_cli_badge = true func _ready(): $NextLevelButton.visible = show_next_level_button $CLIBadge.visible = show_cli_badge + + $BackButton.text = game.tr_custom("main_backbutton_016") + $ReloadButton2.text = game.tr_custom("main_reloadbutton2_017") + $CardsButton.text = game.tr_custom("main_cardsbutton_018") + $"Tip!".text = game.tr_custom("main_tip_019") + $Button3.text = game.tr_custom("music_button_button3_003") + $NextLevelButton.text = game.tr_custom("main_nextlevelbutton_020") func _on_BackButton_pressed(): emit_signal("back_pressed") diff --git a/scenes/global_menu.tscn b/scenes/global_menu.tscn index 47103b09..9fccf5d3 100644 --- a/scenes/global_menu.tscn +++ b/scenes/global_menu.tscn @@ -59,8 +59,8 @@ __meta__ = { [node name="Tip!" type="Button" parent="."] visible = false -margin_left = 501.0 -margin_right = 598.0 +margin_left = 337.0 +margin_right = 434.0 margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 diff --git a/scenes/level_select.tscn b/scenes/level_select.tscn index fb653f11..1d863a63 100644 --- a/scenes/level_select.tscn +++ b/scenes/level_select.tscn @@ -17,16 +17,10 @@ anchor_right = 1.0 anchor_bottom = 1.0 theme = ExtResource( 1 ) script = ExtResource( 2 ) -__meta__ = { -"_edit_use_anchors_": false -} [node name="ScrollContainer" type="ScrollContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -__meta__ = { -"_edit_use_anchors_": false -} [node name="MarginContainer" type="MarginContainer" parent="ScrollContainer"] margin_right = 1920.0 diff --git a/scenes/levels.gd b/scenes/levels.gd index 593b728b..2753e4d9 100644 --- a/scenes/levels.gd +++ b/scenes/levels.gd @@ -23,6 +23,7 @@ func reload(): dir.list_dir_end() chapter_names.sort() + print_debug(chapter_names) var final_chapter_sequence = [] diff --git a/scenes/main.tscn b/scenes/main.tscn index 4e2d658d..888c0c1b 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=2] +[gd_scene load_steps=12 format=2] [ext_resource path="res://scenes/terminal.tscn" type="PackedScene" id=1] [ext_resource path="res://scenes/main.gd" type="Script" id=2] @@ -6,10 +6,14 @@ [ext_resource path="res://scenes/global_menu.tscn" type="PackedScene" id=4] [ext_resource path="res://scenes/file_browser.tscn" type="PackedScene" id=5] [ext_resource path="res://styles/theme.tres" type="Theme" id=6] -[ext_resource path="res://fonts/big.tres" type="DynamicFont" id=7] +[ext_resource path="res://fonts/Moderustic-VariableFont_wght.ttf" type="DynamicFontData" id=7] [ext_resource path="res://sounds/success.wav" type="AudioStream" id=8] [ext_resource path="res://scenes/cursor.gd" type="Script" id=9] +[sub_resource type="DynamicFont" id=2] +size = 46 +font_data = ExtResource( 7 ) + [sub_resource type="CircleShape2D" id=1] radius = 1.0 @@ -88,7 +92,7 @@ margin_right = 633.0 margin_bottom = 60.0 rect_min_size = Vector2( 0, 60 ) size_flags_stretch_ratio = 0.0 -custom_fonts/normal_font = ExtResource( 7 ) +custom_fonts/normal_font = SubResource( 2 ) text = "main_levelname_014" fit_content_height = true scroll_active = false @@ -109,9 +113,6 @@ size_flags_vertical = 3 bbcode_enabled = true bbcode_text = "main_leveldescription_015" text = "main_leveldescription_015" -__meta__ = { -"_edit_use_anchors_": false -} [node name="LevelCongrats" type="RichTextLabel" parent="Rows/Columns/RightSide/LevelInfo/LevelPanel/Text"] visible = false diff --git a/scenes/title.gd b/scenes/title.gd index f2374af2..0a96aa7f 100644 --- a/scenes/title.gd +++ b/scenes/title.gd @@ -4,6 +4,13 @@ func _ready(): if !OS.has_feature("standalone") and !game.skipped_title: game.skipped_title = true get_tree().change_scene("res://scenes/level_select.tscn") + + $Label2.text = game.tr_custom("title_label2_007") + $Label3.text = game.tr_custom("title_label3_008") + $VBoxContainer/Button.text = game.tr_custom("title_button_009") # Кнопка Levels + $VBoxContainer/Button3.text = game.tr_custom("title_button3_010") # Кнопка Sandbox + $VBoxContainer/Button2.text = game.tr_custom("title_button2_011") # Кнопка Quit + func quit(): get_tree().quit() diff --git a/translations.csv b/translations.csv index 5b2f0cbf..6bf1fdcc 100644 --- a/translations.csv +++ b/translations.csv @@ -1,518 +1,853 @@ keys,en,ru -card_description_001,Description, -card_energy_002,0, -music_button_button3_003,Toggle music, -arrow_id_004,label, -cards_button_005,Draw new cards, -cards_energy_006,3, -title_label2_007,by bleeptrack & blinry, -title_label3_008,Original score by winniehell, -title_button_009,Levels, -title_button3_010,Sandbox, -title_button2_011,Quit, -survey_label_012,Oh My Git!, -survey_button_013,Support us! (Open two browser tabs), -main_levelname_014,Level name here!, -main_leveldescription_015,Level description here!, -main_backbutton_016,Back, -main_reloadbutton2_017,Reload, -main_cardsbutton_018,Cards!, -main_tip_019,Tip!, -main_nextlevelbutton_020,Next level, -terminal_button_021,"git commit --allow-empty -m ""$RANDOM""", -terminal_button2_022,git checkout HEAD^, -terminal_button3_023,"git checkout -b ""$RANDOM""", -repository_label_024,Repo name, -repository_indexlabel_025,Index:, -repository_button_026,Update, -repository_simplifycheckbox_027,Hide trees and blobs, -node_id_028,object_id, -level_select_button3_029,To the survey /o/, -no_git_button2_030,"Sure, I'll install it!", -notification_label_031,This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint!, -notification_ok_032,Got it!, -file_browser_title_033,title, -file_browser_button_034,root, -file_browser_button2_035,dir, -file_browser_savebutton_036,Save, -text_editor_texteditor_038,Text here, -file_browser_item_label_039,filename, -merge_title_040,Merging timelines, -merge_description_041,"Here's a trick so that you can sleep a bit longer: just do all your morning activities in parallel universes, and then at the end, merge them together!", -merge_congrats_042,I wonder if you're more relaxed when you *sleep* in parallel timelines..., -merge_win_hint_043,"Build a situation where you consumed a baguette, a coffee, *and* a donut.", -merge_win_hint_044,Be on a merge commit., -conflict_title_045,Contradictions, +card_description_001,Description,Описание +card_energy_002,0,0 +music_button_button3_003,Toggle music,Переключить музыку +arrow_id_004,label,метка +cards_button_005,Draw new cards,Взять новые карты +cards_energy_006,3,3 +title_label2_007,by bleeptrack & blinry,от bleeptrack & blinry +title_label3_008,Original score by winniehell,Оригинальная музыка от winniehell +title_button_009,Levels,Уровни +title_button3_010,Sandbox,Песочница +title_button2_011,Quit,Выход +survey_label_012,Oh My Git!,Oh My Git! +survey_button_013,Support us! (Open two browser tabs),Поддержите нас! (Откроются две вкладки браузера) +main_levelname_014,Level name here!,Название уровня здесь! +main_leveldescription_015,Level description here!,Описание уровня здесь! +main_backbutton_016,Back,Назад +main_reloadbutton2_017,Reload,Перезагрузить +main_cardsbutton_018,Cards!,Карты! +main_tip_019,Tip!,Подсказка! +main_nextlevelbutton_020,Next level,Следующий уровень +terminal_button_021,"git commit --allow-empty -m "" +RANDOM""","gitcommit−−allow−empty−m"" +RANDOM""","gitcommit−−allow−empty−m"" +RANDOM""" +terminal_button2_022,git checkout HEAD^,git checkout HEAD^ +terminal_button3_023,"git checkout -b "" +RANDOM""","gitcheckout−b"" +RANDOM""","gitcheckout−b"" +RANDOM""" +repository_label_024,Repo name,Имя репозитория +repository_indexlabel_025,Index:,Индекс: +repository_button_026,Update,Обновить +repository_simplifycheckbox_027,Hide trees and blobs,Скрыть деревья и блобы +node_id_028,object_id,id_объекта +level_select_button3_029,To the survey /o/,К опросу /o/ +no_git_button2_030,"Sure, I'll install it!","Конечно, я установлю!" +notification_label_031,This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint!,Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! +notification_ok_032,Got it!,Понятно! +file_browser_title_033,title,заголовок +file_browser_button_034,root,корень +file_browser_button2_035,dir,папка +file_browser_savebutton_036,Save,Сохранить +text_editor_texteditor_038,Text here,Текст здесь +file_browser_item_label_039,filename,имя_файла +merge_title_040,Merging timelines,Слияние временных линий +merge_description_041,"Here's a trick so that you can sleep a bit longer: just do all your morning activities in parallel universes, and then at the end, merge them together!","Вот трюк, который позволит вам поспать немного дольше: просто выполняйте все свои утренние дела в параллельных вселенных, а в конце слейте их воедино!" +merge_congrats_042,I wonder if you're more relaxed when you sleep in parallel timelines...,Интересно, вы более расслаблены, когда спите в параллельных временных линиях... +merge_win_hint_043,"Build a situation where you consumed a baguette, a coffee, and a donut.","Создайте ситуацию, в которой вы съели багет, выпили кофе и съели пончик." +merge_win_hint_044,Be on a merge commit.,Находитесь на коммите слияния. +conflict_title_045,Contradictions,Противоречия conflict_description_046,"Sometimes, timelines will contradict each other. For example, in this case, one of our clients wants these timelines merged, but they ate different things for breakfast in both timelines. Try to merge them together! You'll notice that there will be a conflict! The time machine will leave it up to you how to proceed: you can edit the problematic item, it will show you the conflicting sections. You can keep either of the two versions - or create a combination of them! Remove the >>>, <<<, and === markers, and make a new commit to finalize the merge! -Let your finalized timeline be the ""main"" one.", -conflict_congrats_047,"Yum, that sounds like a good breakfast!", -conflict_win_hint_048,Make a breakfast compromise in the 'main' branch., -mergeabort_title_049,Abort a merge, +Let your finalized timeline be the ""main"" one.","Иногда временные линии противоречат друг другу. + +Например, в данном случае один из наших клиентов хочет слить эти временные линии, но в обеих он ел разные вещи на завтрак. + +Попробуйте слить их! Вы заметите, что возникнет конфликт! Машина времени оставит решение за вами: вы можете отредактировать проблемный элемент, она покажет вам конфликтующие разделы. Вы можете сохранить любую из двух версий или создать их комбинацию! Удалите маркеры >>>, <<< и === и сделайте новый коммит для завершения слияния! + +Пусть ваша окончательная временная линия будет ""main"". +" +conflict_congrats_047,"Yum, that sounds like a good breakfast!","Мм, звучит как хороший завтрак!" +conflict_win_hint_048,Make a breakfast compromise in the 'main' branch.,Найдите компромисс по завтраку в ветке 'main'. +mergeabort_title_049,Abort a merge,Прервать слияние mergeabort_description_050,"Sometimes you want to merge two commits, but a merge conflict occurs that you currently don't want to resolve. In these situations you can abort the merge to merge later. Use - git merge --abort +git merge --abort when you are in a merge process. -Try to merge both commits and abort the merge afterwards.", -mergeabort_congrats_051,"Aaah, let's merge later...", -mergeabort_win_hint_052,You tried to merge?, -mergeabort_win_hint_053,You aborted to merge?, -reset_title_054,Resetting files in the index, +Try to merge both commits and abort the merge afterwards.","Иногда вы хотите слить два коммита, но возникает конфликт слияния, который вы в данный момент не хотите разрешать. + +В таких ситуациях вы можете прервать слияние, чтобы выполнить его позже. Используйте +git merge --abort +когда вы находитесь в процессе слияния. + +Попробуйте слить оба коммита, а затем прервать слияние." +mergeabort_congrats_051,"Aaah, let's merge later...","Ааа, давайте сольём позже..." +mergeabort_win_hint_052,You tried to merge?,Вы пытались выполнить слияние? +mergeabort_win_hint_053,You aborted to merge?,Вы прервали слияние? +reset_title_054,Resetting files in the index,Сброс файлов в индексе reset_description_055,"See the dark shadow behind the icons? That's the version of the file in the last commit! For example, these candles have been blown out, and that change has been added. But you decide that this was a mistake! You only want to blow out the red candle in the next commit! -If you already have updated the index to a changed file, but want to reset it, you can use `git reset`!", -reset_win_hint_056,Reset the changes in the green and blue candles!, -reset_win_hint_057,And make a commit!, -change_title_058,Update files in the index, -change_description_059,"When we change files, the index won't change on its own. We have to use `git add` to update the index to the changed version of the file. +If you already have updated the index to a changed file, but want to reset it, you can use git reset!","Видите тёмную тень за иконками? Это версия файла в последнем коммите! + +Например, эти свечи были задуты, и это изменение было добавлено. + +Но вы решаете, что это была ошибка! Вы хотите задуть только красную свечу в следующем коммите! + +Если вы уже обновили индекс изменённым файлом, но хотите сбросить его, вы можете использовать git reset!" +reset_win_hint_056,Reset the changes in the green and blue candles!,Сбросьте изменения в зелёной и синей свечах! +reset_win_hint_057,And make a commit!,И сделайте коммит! +change_title_058,Update files in the index,Обновление файлов в индексе +change_description_059,"When we change files, the index won't change on its own. We have to use git add to update the index to the changed version of the file. Let's try that! -The icons in the file browser show you when the actual file (white) and the version in the index (blue) are different, and when they are the same!", -rm_title_060,Delete a file in the next commit, -rm_description_061,"If you want to remove a file in the next commit, you can use `git rm`! This will both delete the file locally, and in the index. - -If a file is modified, you'll need to reset these changes first/reset the files.", -rm_win_hint_062,Make a commit where all files are deleted ¯\_(^_^)_/¯, -steps_title_063,Adding changes step by step, -steps_description_064,"The index is really useful, because it allows us to be precise about which changes we want to include in each commit!", -steps_win_hint_065,"Make changes to all three objects, to form a logical sequence of events!", -steps_win_hint_066,Only add one of these changes!, -steps_win_hint_067,And make a commit., -steps_win_hint_068,Make a second commit that only records a single change., -steps_win_hint_069,And a third one., -compare_title_070,Step by step, +The icons in the file browser show you when the actual file (white) and the version in the index (blue) are different, and when they are the same!","Когда мы меняем файлы, индекс сам по себе не изменится. Мы должны использовать git add, чтобы обновить индекс до изменённой версии файла. + +Давайте попробуем! + +Иконки в файловом браузере показывают, когда фактический файл (белый) и версия в индексе (синий) отличаются, и когда они одинаковы!" +rm_title_060,Delete a file in the next commit,Удалить файл в следующем коммите +rm_description_061,"If you want to remove a file in the next commit, you can use git rm! This will both delete the file locally, and in the index. + +If a file is modified, you'll need to reset these changes first/reset the files.","Если вы хотите удалить файл в следующем коммите, вы можете использовать git rm! Это удалит файл как локально, так и в индексе. + +Если файл изменён, вам нужно сначала сбросить эти изменения/сбросить файлы." +rm_win_hint_062,Make a commit where all files are deleted ¯_(^^)/¯,Сделайте коммит, в котором удалены все файлы ¯_(^^)/¯ +steps_title_063,Adding changes step by step,Добавление изменений шаг за шагом +steps_description_064,"The index is really useful, because it allows us to be precise about which changes we want to include in each commit!","Индекс действительно полезен, потому что он позволяет нам точно определять, какие изменения мы хотим включить в каждый коммит!" +steps_win_hint_065,"Make changes to all three objects, to form a logical sequence of events!","Внесите изменения во все три объекта, чтобы сформировать логическую последовательность событий!" +steps_win_hint_066,Only add one of these changes!,Добавьте только одно из этих изменений! +steps_win_hint_067,And make a commit.,И сделайте коммит. +steps_win_hint_068,Make a second commit that only records a single change.,Сделайте второй коммит, который фиксирует только одно изменение. +steps_win_hint_069,And a third one.,И третий. +compare_title_070,Step by step,Шаг за шагом compare_description_071,"Welcome to today's lesson! We're going to learn how to make commits with more precision! -Have a look at these two timelines. They have exactly the same outcome. But one of them makes it much easier to figure out what happened.", -compare_win_hint_072,Right! Having each change in its own commit makes it easier to understand what's going on! Let's learn how to do that!, -checkout_title_073,Checking out files from the index, -checkout_description_074,"So you've made changes to your files, but you decide that you don't want to keep them! You can use `git checkout` for that! +Have a look at these two timelines. They have exactly the same outcome. But one of them makes it much easier to figure out what happened.","Добро пожаловать на сегодняшний урок! Мы научимся делать коммиты с большей точностью! -What happens if you have already update the index, like in file c? You have to reset the index first!", -checkout_win_hint_075,Remove all changes in your local files!, -add_title_076,Updating files in the index, +Взгляните на эти две временные линии. У них абсолютно одинаковый результат. Но одна из них значительно облегчает понимание того, что произошло." +compare_win_hint_072,Right! Having each change in its own commit makes it easier to understand what's going on! Let's learn how to do that!,Верно! Наличие каждого изменения в собственном коммите облегчает понимание происходящего! Давайте научимся это делать! +checkout_title_073,Checking out files from the index,Извлечение файлов из индекса +checkout_description_074,"So you've made changes to your files, but you decide that you don't want to keep them! You can use git checkout for that! + +What happens if you have already update the index, like in file c? You have to reset the index first!","Итак, вы внесли изменения в свои файлы, но решили, что не хотите их сохранять! Для этого можно использовать git checkout! + +Что произойдет, если вы уже обновили индекс, как в файле c? Сначала нужно сбросить индекс!" +checkout_win_hint_075,Remove all changes in your local files!,Удалите все изменения в ваших локальных файлах! +add_title_076,Updating files in the index,Обновление файлов в индексе add_description_077,"So you start working, and make changes to your files! Git lets you choose which of these changes you want to put in the next commit. This is like updating the index version of that file to the new version. This allows you to have smaller commits, that describe better what you changed! -The command for this is the same - `git add`!", -add_congrats_078,"Well done! Try travelling between the commits using `git checkout`, so you can look at their contents again!", -add_win_hint_079,Make changes to all files!, -add_win_hint_080,"Add only the changes of a and c, and make a commit! Finally, make a commit which captures the changes in b!", -new_title_081,Add new files to the index, +The command for this is the same - git add!","Итак, вы начинаете работать и вносите изменения в свои файлы! Git позволяет вам выбрать, какие из этих изменений вы хотите поместить в следующий коммит. Это похоже на обновление версии файла в индексе до новой версии. + +Это позволяет вам делать более мелкие коммиты, которые лучше описывают, что вы изменили! + +Команда для этого та же - git add!" +add_congrats_078,"Well done! Try travelling between the commits using git checkout, so you can look at their contents again!","Отлично! Попробуйте перемещаться между коммитами с помощью git checkout, чтобы снова посмотреть их содержимое!" +add_win_hint_079,Make changes to all files!,Внесите изменения во все файлы! +add_win_hint_080,"Add only the changes of a and c, and make a commit! Finally, make a commit which captures the changes in b!","Добавьте только изменения файлов a и c и сделайте коммит! Наконец, сделайте коммит, который зафиксирует изменения в файле b!" +new_title_081,Add new files to the index,Добавление новых файлов в индекс new_description_082,"So far, when we made a commit, we've always recorded the current status of all objects, right? But Git allows you to pick which changes you want to put in a commit! To learn how that works, we need to learn about the ""index""! In the index, we can prepare what will be in the next commit. In this game, the index is represented by a blue aura around icons in the file browser! -Initially, the index is empty. To make a commit that contains a new file, we need to add it!", -new_win_hint_083,Add the candle., -new_win_hint_084,Make a commit., -checkoutcommit_title_085,Moving111 through time,Двигаюсьч +Initially, the index is empty. To make a commit that contains a new file, we need to add it!","До сих пор, когда мы делали коммит, мы всегда записывали текущее состояние всех объектов, верно? + +Но Git позволяет вам выбирать, какие изменения вы хотите поместить в коммит! + +Чтобы узнать, как это работает, нам нужно узнать об ""индексе""! В индексе мы можем подготовить то, что будет в следующем коммите. В этой игре индекс представлен синей аурой вокруг иконок в файловом браузере! + +Изначально индекс пуст. Чтобы сделать коммит, содержащий новый файл, нам нужно его добавить!" +new_win_hint_083,Add the candle.,Добавьте свечу. +new_win_hint_084,Make a commit.,Сделайте коммит. +checkoutcommit_title_085,Moving111 through time,Перемещение во времени checkoutcommit_description_086,"The yellow boxes are frozen points in time, we call them ""commits""! You can travel between them using the ""checkout"" card! (Try it!) -Can you find out what happened here? Then, while on the last commit, edit the files to fix the problem, and make a new commit!", -checkoutcommit_congrats_087,"Wonderful! Now that you're getting familiar with the time machine, let's look at some more complicated situations...", -checkoutcommit_win_hint_088,Restore sisterly peace., -branchcreate_title_089,Creating branches, +Can you find out what happened here? Then, while on the last commit, edit the files to fix the problem, and make a new commit!","Желтые ящики - это застывшие моменты времени, мы называем их ""коммитами""! Вы можете путешествовать между ними, используя карту ""checkout""! (Попробуйте!) + +Сможете ли вы выяснить, что здесь произошло? Затем, находясь на последнем коммите, отредактируйте файлы, чтобы исправить проблему, и сделайте новый коммит!" +checkoutcommit_congrats_087,"Wonderful! Now that you're getting familiar with the time machine, let's look at some more complicated situations...","Замечательно! Теперь, когда вы осваиваетесь с машиной времени, давайте рассмотрим несколько более сложных ситуаций..." +checkoutcommit_win_hint_088,Restore sisterly peace.,Восстановите сестринский мир. +branchcreate_title_089,Creating branches,Создание веток branchcreate_description_090,"You were invited to two parties! At one of them, your favorite band is playing - and the other one is your best friend's birthday party. Where should you go? No worries - as a time travel agent in training, you can go to both parties! -To make it easier to tell which timeline is which, you can create time portals! (We call these ""branches"".)", -branchcreate_congrats_091,"Now you can travel between those branches easily (using `git checkout`) - try it! +To make it easier to tell which timeline is which, you can create time portals! (We call these ""branches"".)","Вас пригласили на две вечеринки! На одной из них играет ваша любимая группа, а другая — день рождения вашего лучшего друга. Куда пойти? Не беспокойтесь — как стажер-агент по путешествиям во времени, вы можете пойти на обе вечеринки! + +Чтобы было легче различать временные линии, вы можете создавать временные порталы! (Мы называем их ""ветками"".)" +branchcreate_congrats_091,"Now you can travel between those branches easily (using git checkout) - try it! + +Your friend is happy that you made it to the birthday party and you also got your concert ticket signed. Yay!","Теперь вы можете легко перемещаться между этими ветками (используя git checkout) - попробуйте! -Your friend is happy that you made it to the birthday party and you also got your concert ticket signed. Yay!", -branchcreate_win_hint_092,Create a branch called 'birthday' that points to the birthday timeline., -branchcreate_win_hint_093,Create a branch called 'concert' that points to the concert timeline., -grow_title_094,Branches grow with you!, +Ваш друг рад, что вы пришли на день рождения, и вы также получили автограф на билете на концерт. Ура!" +branchcreate_win_hint_092,Create a branch called 'birthday' that points to the birthday timeline.,Создайте ветку с именем 'birthday', которая указывает на временную линию дня рождения. +branchcreate_win_hint_093,Create a branch called 'concert' that points to the concert timeline.,Создайте ветку с именем 'concert', которая указывает на временную линию концерта. +grow_title_094,Branches grow with you!,Ветки растут вместе с вами! grow_description_095,"Note that there are two options to ""travel to the end of a timeline"": First, you can directly travel to the commit, like we've done it before. -And second, you can travel to the branch label. In this case, when you make a new commit, the branch will grow with you, and still point at the end of the timeline!", -grow_win_hint_096,"Travel directly to the last yellow commit of the birthday timeline, make a change to 'you', and make a commit", -grow_win_hint_097,"Travel to the blue 'concert' branch, make a change to 'you', and a commit.", -reorder_title_098,Moving branches around, +And second, you can travel to the branch label. In this case, when you make a new commit, the branch will grow with you, and still point at the end of the timeline!","Обратите внимание, что есть два варианта ""переместиться в конец временной линии"": + +Во-первых, вы можете напрямую переместиться к коммиту, как мы делали это раньше. + +И во-вторых, вы можете переместиться к метке ветки. В этом случае, когда вы делаете новый коммит, ветка будет расти вместе с вами и по-прежнему указывать на конец временной линии!" +grow_win_hint_096,"Travel directly to the last yellow commit of the birthday timeline, make a change to 'you', and make a commit","Переместитесь напрямую к последнему желтому коммиту временной линии дня рождения, внесите изменение в 'you' и сделайте коммит" +grow_win_hint_097,"Travel to the blue 'concert' branch, make a change to 'you', and a commit.","Переместитесь к синей ветке 'concert', внесите изменение в 'you' и сделайте коммит." +reorder_title_098,Moving branches around,Перемещение веток reorder_description_099,"One of your colleagues messed up here, and put the branches in the wrong timelines! You could delete and re-create these branches - but you can also directly move them to different commits, by using - git checkout + `git checkout` on the branch names, and then using - git reset --hard + `git reset --hard` on the commit where you want the branch to be. -The donut branch is in the right place, but the timeline is still incomplete - make you actually *eat* the donut in that branch!", -reorder_win_hint_100,Did you eat a baguette on the baguette branch?, -reorder_win_hint_101,Did you drink a coffee on the coffee branch?, -reorder_win_hint_102,Did you eat a donut on the donut branch?, -fork_title_103,Make parallel commits, +The donut branch is in the right place, but the timeline is still incomplete - make you actually eat the donut in that branch!","Один из ваших коллег здесь напутал и поместил ветки в неправильные временные линии! + +Вы могли бы удалить и заново создать эти ветки, но вы также можете напрямую переместить их в другие коммиты, используя + + git checkout + +на именах веток, а затем используя + + git reset --hard + +на коммите, где вы хотите, чтобы была ветка. + +Ветка с пончиком находится в правильном месте, но временная линия все еще неполная - убедитесь, что вы действительно съели пончик в этой ветке!" +reorder_win_hint_100,Did you eat a baguette on the baguette branch?,Вы съели багет на ветке "багет"? +reorder_win_hint_101,Did you drink a coffee on the coffee branch?,Вы выпили кофе на ветке "кофе"? +reorder_win_hint_102,Did you eat a donut on the donut branch?,Вы съели пончик на ветке "пончик"? +fork_title_103,Make parallel commits,Делайте параллельные коммиты fork_description_104,"Did you know that creating parallel timelines is perfectly legal and safe? It's true! -Can you find out when things went wrong in this zoo? Then, go back to the last good commit and create a parallel universe where everyone is happy!", -fork_congrats_105,"Whew, good job! This seems like a *much* better outcome. +Can you find out when things went wrong in this zoo? Then, go back to the last good commit and create a parallel universe where everyone is happy!","Знаете ли вы, что создание параллельных временных линий совершенно законно и безопасно? Это правда! + +Сможете ли вы выяснить, когда в этом зоопарке все пошло не так? Затем вернитесь к последнему удачному коммиту и создайте параллельную вселенную, где все счастливы!" +fork_congrats_105,"Whew, good job! This seems like a much better outcome. Feel free to add more parallel timelines, or make them longer. -If you're ready, our next mission is already waiting...", -fork_win_hint_106,Make sure that the child is happy., -fork_win_hint_107,Make sure that the lion gets something to eat., -branchremove_title_108,Deleting branches, +If you're ready, our next mission is already waiting...","Уф, хорошая работа! Это кажется гораздо лучшим исходом. + +Не стесняйтесь добавлять больше параллельных временных линий или делать их длиннее. + +Если вы готовы, наша следующая миссия уже ждет..." +fork_win_hint_106,Make sure that the child is happy.,Убедитесь, что ребенок счастлив. +fork_win_hint_107,Make sure that the lion gets something to eat.,Убедитесь, что лев получил что-нибудь поесть. +branchremove_title_108,Deleting branches,Удаление веток branchremove_description_109,"Life is full of dangers, right? Even when walking to school, it seems like there's a lot of risks! -This Monday is especially bad. You made it to school, but there's some timelines you definitely don't want to keep around.", -branchremove_congrats_110,"On second thought, maybe you even prefer the ice cream timeline to the main one? :)", -branchremove_win_hint_111,Find the bad branches and delete them. Keep only the best one., -cli_title_112,The command line, -cli_description_113,These playing cards are designed to be easy to use and to remember! We'd suggest sticking to them if you don't have a lot of experience with Git!, +This Monday is especially bad. You made it to school, but there's some timelines you definitely don't want to keep around.","Жизнь полна опасностей, верно? Даже по дороге в школу, кажется, много рисков! + +Этот понедельник особенно плох. Вы добрались до школы, но есть некоторые временные линии, которые вы определенно не хотите сохранять." +branchremove_congrats_110,"On second thought, maybe you even prefer the ice cream timeline to the main one? :)","Хотя, если подумать, может быть, вы даже предпочитаете временную линию с мороженым основной? :)" +branchremove_win_hint_111,Find the bad branches and delete them. Keep only the best one.,Найдите плохие ветки и удалите их. Оставьте только лучшую. +cli_title_112,The command line,Командная строка +cli_description_113,These playing cards are designed to be easy to use and to remember! We'd suggest sticking to them if you don't have a lot of experience with Git!,Эти игральные карты разработаны так, чтобы их было легко использовать и запоминать! Мы бы посоветовали придерживаться их, если у вас не так много опыта работы с Git! cli_congrats_114,"Cool! Instead of using the playing cards, you can also do everything via the command line! -The command line is pretty powerful! Often, you can use it to solve tasks faster compared to using a graphical interface.", -cli_win_hint_115,Initialize the time machine!, -whoareyou_title_116,Welcome to time travel school!, +The command line is pretty powerful! Often, you can use it to solve tasks faster compared to using a graphical interface.","Круто! Вместо использования игральных карт вы также можете делать все через командную строку! + +Командная строка довольно мощная! Часто вы можете использовать ее для решения задач быстрее по сравнению с использованием графического интерфейса." +cli_win_hint_115,Initialize the time machine!,Инициализируйте машину времени! +whoareyou_title_116,Welcome to time travel school!,Добро пожаловать в школу путешествий во времени! whoareyou_description_117,"You're still pretty confused by everything that's going on. The next day, you decide to enroll in time travel school! -Your time travel teacher welcomes you: ""Hello there! Wanna tell us your name?""", +Your time travel teacher welcomes you: ""Hello there! Wanna tell us your name?""","Вы все еще в замешательстве от всего происходящего. На следующий день вы решаете записаться в школу путешествий во времени! + +Ваш учитель по путешествиям во времени приветствует вас: ""Привет! Хочешь сказать нам свое имя?""" whoareyou_congrats_118,"""We're so glad to have you! -Git can help you fix problems in the past! It allows you to collaborate with other students of time travel! It's really powerful, and it's really popular! I'll see you for your first lesson tomorrow!""", -whoareyou_win_hint_119,Introduce yourself., -whoareyou_win_hint_120,"Fill out the enrollment form, and commit it!", -init_title_121,Enter the time machine, +Git can help you fix problems in the past! It allows you to collaborate with other students of time travel! It's really powerful, and it's really popular! I'll see you for your first lesson tomorrow!""","""Мы так рады видеть вас! + +Git может помочь вам исправить проблемы в прошлом! Он позволяет вам сотрудничать с другими учениками путешествий во времени! Он действительно мощный и очень популярный! Увидимся на вашем первом уроке завтра!""" +whoareyou_win_hint_119,Introduce yourself.,Представьтесь. +whoareyou_win_hint_120,"Fill out the enrollment form, and commit it!","Заполните форму зачисления и закоммитьте ее!" +init_title_121,Enter the time machine,Войдите в машину времени init_description_122,"You've been accepted to time travel school! Yay! It's your first day! Your teacher explains: ""To do anything with a time machine, you first need to initialize it!"" -Drag that blue card up to play it!", -init_congrats_123,"Nice! See that little owl squirrel that appeared? It will be your companion, and always show you where you are in time!", -risky_title_124,Living dangerously, +Drag that blue card up to play it!","Вас приняли в школу путешествий во времени! Ура! Это ваш первый день! Ваш учитель объясняет: + +""Чтобы что-то делать с машиной времени, сначала нужно ее инициализировать!"" + +Перетащите эту синюю карту вверх, чтобы сыграть ею!" +init_congrats_123,"Nice! See that little owl squirrel that appeared? It will be your companion, and always show you where you are in time!","Отлично! Видите эту маленькую сову-белку, которая появилась? Она будет вашим спутником и всегда будет показывать, где вы находитесь во времени!" +risky_title_124,Living dangerously,Жить опасно risky_description_125,"So you have decided to apply for time travel school, to learn how to use this time machine called ""Git""! How exciting! -You're almost done with the paperwork! You just need to fill in one more reason why you want to learn Git.", +You're almost done with the paperwork! You just need to fill in one more reason why you want to learn Git.","Итак, вы решили подать заявление в школу путешествий во времени, чтобы научиться пользоваться этой машиной времени под названием ""Git""! + +Как захватывающе! + +Вы почти закончили с документами! Вам просто нужно указать еще одну причину, почему вы хотите изучать Git." risky_congrats_126,"Suddenly, your cat jumps on the table, snatches away the form, and runs away! Oh no. All your hard work, gone! You clearly need a better solution. -(Click ""Next Level"" as soon as you're ready!)", -risky_win_hint_127,Add another line to form.txt!, -remote_title_128,Working together, +(Click ""Next Level"" as soon as you're ready!)","Внезапно ваша кошка запрыгивает на стол, хватает анкету и убегает! О нет. Вся ваша тяжелая работа насмарку! + +Вам явно нужно лучшее решение. + +(Нажмите ""Следующий уровень"", как только будете готовы!)" +risky_win_hint_127,Add another line to form.txt!,Добавьте еще одну строку в form.txt! +remote_title_128,Working together,Работаем вместе remote_description_129,"Let's add your name to our list of students! -I already have a second commit of it in my time machine - let's work together!", -remote_congrats_130,Welcome to time travel school! :) I'll see you for your first class tomorrow!, -remote_win_hint_131,Get the second commit from your teacher using `git pull`., -remote_win_hint_132,Add your name to the list of students, -remote_win_hint_133,Commit your result., -commit_title_134,Your first commit, +I already have a second commit of it in my time machine - let's work together!","Давайте добавим ваше имя в наш список студентов! + +У меня уже есть второй коммит этого в моей машине времени - давайте работать вместе!" +remote_congrats_130,Welcome to time travel school! :) I'll see you for your first class tomorrow!,Добро пожаловать в школу путешествий во времени! :) Увидимся на вашем первом занятии завтра! +remote_win_hint_131,Get the second commit from your teacher using git pull.,Получите второй коммит от вашего учителя, используя git pull. +remote_win_hint_132,Add your name to the list of students,Добавьте свое имя в список студентов, +remote_win_hint_133,Commit your result.,Закоммитьте свой результат. +commit_title_134,Your first commit,Ваш первый коммит commit_description_135,"You can use your time machine to make snapshots of objects around you! Here, let's practice this! -(Your teacher pours some water into a glass.)", -commit_congrats_136,"Nice! You can try making some additional commits. When you feel comfortable, click on ""Next Level"".", -commit_win_hint_137,"Make a snapshot of the glass (a ""commit"")", -commit_win_hint_138,Change the contents of the glass!, -commit_win_hint_139,And make a second commit!, -copies_title_140,Making backups, -copies_description_141,"This time, you're making a lot of backup copies - you can look at them by clicking on them!", +(Your teacher pours some water into a glass.)","Вы можете использовать свою машину времени, чтобы делать снимки объектов вокруг вас! Давайте попрактикуемся! + +(Ваш учитель наливает немного воды в стакан.)" +commit_congrats_136,"Nice! You can try making some additional commits. When you feel comfortable, click on ""Next Level"".","Отлично! Вы можете попробовать сделать еще несколько коммитов. Когда почувствуете себя уверенно, нажмите ""Следующий уровень""." +commit_win_hint_137,"Make a snapshot of the glass (a ""commit"")","Сделайте снимок стакана (""коммит"")" +commit_win_hint_138,Change the contents of the glass!,Измените содержимое стакана! +commit_win_hint_139,And make a second commit!,И сделайте второй коммит! +copies_title_140,Making backups,Создание резервных копий +copies_description_141,"This time, you're making a lot of backup copies - you can look at them by clicking on them!","На этот раз вы делаете много резервных копий - вы можете посмотреть их, кликнув по ним!" copies_congrats_142,"Okay, this kind of works. But you're a bit worried that you'll end up with hundreds of copies of this form, and it will be hard to keep track of all of them. And especially when working with other people, sending copies back and forth doesn't seem ideal. -You can't wait to try these time machines!", -copies_win_hint_143,Add another line to form2_really_final.txt!, -stash_title_144,Stashing, +You can't wait to try these time machines!","Хорошо, это вроде бы работает. + +Но вы немного обеспокоены тем, что у вас окажутся сотни копий этой формы, и будет трудно отслеживать их все. + +И особенно при работе с другими людьми, отправка копий туда и обратно не кажется идеальным решением. + +Вам не терпится опробовать эти машины времени!" +copies_win_hint_143,Add another line to form2_really_final.txt!,Добавьте еще одну строку в form2_really_final.txt! +stash_title_144,Stashing,Сохранение в тайнике (Stashing) stash_description_145,"You will encounter situations in which you are working on your project but you need to put your current changes aside temporarily. To do so, you can use the stash function. Use - git stash push +git stash push to add your current changes to the stash stack. ---- tipp1 ---- tipp2 ---- -tipp3", -stash_congrats_146,Nice stash you got there! :), -stash_win_hint_147,Did you stash the current changes?, -stashpop_title_148,Pop from Stash, + +tipp3","Вы столкнетесь с ситуациями, в которых вы работаете над своим проектом, но вам нужно +временно отложить текущие изменения. Для этого вы можете использовать функцию stash. Используйте +git stash push +чтобы добавить ваши текущие изменения в стек тайника (stash). + +подсказка1 +подсказка2 + +подсказка3" +stash_congrats_146,Nice stash you got there! :),Хороший у вас тайник! :) +stash_win_hint_147,Did you stash the current changes?,Вы сохранили текущие изменения в тайнике? +stashpop_title_148,Pop from Stash,Извлечь из тайника (Pop from Stash) stashpop_description_149,"When you stashed your changes and you want to apply them back to your current working directory, you can use - git stash pop +git stash pop This will remove the changes from the stash stack. If you also want to keep the changes on the stash stack, use - git stash apply +git stash apply ---- tipp1 ---- tipp2 ---- -tipp3", -stashpop_congrats_150,"Yay, you got your changes back! :)", -stashpop_win_hint_151,Did you pop the changes from the stash stack?, -stashclear_title_152,Clear the Stash, + +tipp3","Когда вы сохранили свои изменения в тайнике и хотите применить их обратно в свой текущий рабочий каталог, вы можете использовать +git stash pop +Это удалит изменения из стека тайника. Если вы также хотите сохранить изменения в стеке тайника, используйте +git stash apply + +подсказка1 +подсказка2 + +подсказка3" +stashpop_congrats_150,"Yay, you got your changes back! :)","Ура, вы вернули свои изменения! :)" +stashpop_win_hint_151,Did you pop the changes from the stash stack?,Вы извлекли изменения из стека тайника? +stashclear_title_152,Clear the Stash,Очистить тайник (Clear the Stash) stashclear_description_153,"If you want to inspect your stash stack, use the command - git stash list - +git stash list + Oh, you don't want to keep your stashed changes? There are way too many? Then go ahead and clear the stack with - git stash clear +git stash clear If you only want to discard a certain stash entry, you can use - git stash drop - +git stash drop + Clear your stash stack! ---- tipp1 ---- tipp2 ---- -tipp3", -stashclear_congrats_154,All clear! :), -stashclear_win_hint_155,Did you clear your stash stack?, -stashmerge_title_156,Merging popped stash, + +tipp3","Если вы хотите просмотреть свой стек тайника, используйте команду +git stash list + +О, вы не хотите сохранять свои изменения из тайника? Их слишком много? Тогда смело очищайте стек с помощью +git stash clear +Если вы хотите отбросить только определенную запись тайника, вы можете использовать +git stash drop + +Очистите свой стек тайника! + +подсказка1 +подсказка2 + +подсказка3" +stashclear_congrats_154,All clear! :),Все чисто! :) +stashclear_win_hint_155,Did you clear your stash stack?,Вы очистили свой стек тайника? +stashmerge_title_156,Merging popped stash,Слияние извлеченных из тайника изменений stashmerge_description_157,"When you want to re-apply your changes but you already continued working on your file, you might get a merge conflict! Let's practice this situation. Pop the changes from the stash with - git stash pop +git stash pop and resolve the merge conflict. Commit the resolved changes and clear the stash stack afterwards. ---- tipp1 ---- tipp2 ---- -tipp3", -stashmerge_win_hint_158,Did you resolve the conflict and commit?, -stashmerge_win_hint_159,Did you clear stash stack?, -stashbranch_title_160,Branch from stash, + +tipp3","Когда вы хотите повторно применить свои изменения, но уже продолжили работу над файлом, вы можете получить +конфликт слияния! Давайте попрактикуемся в этой ситуации. +Извлеките изменения из тайника с помощью +git stash pop +и разрешите конфликт слияния. Закоммитьте разрешенные изменения и после этого очистите стек тайника. + +подсказка1 +подсказка2 + +подсказка3" +stashmerge_win_hint_158,Did you resolve the conflict and commit?,Вы разрешили конфликт и закоммитили? +stashmerge_win_hint_159,Did you clear stash stack?,Вы очистили стек тайника? +stashbranch_title_160,Branch from stash,Ветка из тайника stashbranch_description_161,"If you want to keep your changes but they don't belong to the main branch, you can easily create a new branch from your stashed changes. Just use - git stash branch +git stash branch If you just want to use the latest stash entry, you can leave the option empty. Create a new branch from the stashed changes! ---- tipp1 ---- tipp2 ---- -tipp3", -stashbranch_congrats_162,Stashed changes are in a new branch! :), -stashbranch_win_hint_163,Did you create a new branch from the stashed changes?, -whoareyou_title_164,Nice to meet you!, + +tipp3","Если вы хотите сохранить свои изменения, но они не относятся к основной ветке, вы можете легко +создать новую ветку из ваших изменений в тайнике. Просто используйте +git stash branch <имя_ветки> +Если вы просто хотите использовать последнюю запись из тайника, вы можете оставить опцию пустой. + +Создайте новую ветку из изменений в тайнике! + +подсказка1 +подсказка2 + +подсказка3" +stashbranch_congrats_162,Stashed changes are in a new branch! :),Изменения из тайника теперь в новой ветке! :) +stashbranch_win_hint_163,Did you create a new branch from the stashed changes?,Вы создали новую ветку из изменений в тайнике? +whoareyou_title_164,Nice to meet you!,Приятно познакомиться! whoareyou_description_165,"Introduce yourself using - git config --global user.name Firstname - git config --global user.email ""your@mail.com""", -whoareyou_win_hint_166,Have a name configured., -whoareyou_win_hint_167,Have an email address configured., -clone_title_168,Cloning a repo, -clone_description_169,"Get your friend's repo using clone, change something, push it back.", -init_title_170,Welcome!, -init_win_hint_171,"Again, initialize your time machine!", -split_title_172,Split a commit!, -split_description_173,"Here, both changes happened in one commit! Split them to be in two commits instead.", -steps_title_174,One step after another, +code +Code +download +content_copy +expand_less +git config --global user.name Firstname +git config --global user.email ""your@mail.com""","Представьтесь, используя + +`git config --global user.name Имя` +`git config --global user.email ""your@mail.com""`" + +whoareyou_win_hint_166,Have a name configured.,Имя настроено. +whoareyou_win_hint_167,Have an email address configured.,Адрес электронной почты настроен. +clone_title_168,Cloning a repo,Клонирование репозитория +clone_description_169,"Get your friend's repo using clone, change something, push it back.","Получите репозиторий вашего друга с помощью clone, измените что-нибудь, отправьте обратно." +init_title_170,Welcome!,Добро пожаловать! +init_win_hint_171,"Again, initialize your time machine!","Снова инициализируйте вашу машину времени!" +split_title_172,Split a commit!,Разделить коммит! +split_description_173,"Here, both changes happened in one commit! Split them to be in two commits instead.","Здесь оба изменения произошли в одном коммите! Разделите их на два коммита." +steps_title_174,One step after another,Шаг за шагом steps_description_175,"Sometimes, you might want to record the order in which things changed, instead of making a single commit. -What happened here? Make two commits from the changes (using the ""add"" card), in an order that makes sense!", -commita_title_176,"Make a commit, but faster!", -commita_description_177,"There is a time-saving trick, where instead of a plain `git commit`, you can use +What happened here? Make two commits from the changes (using the ""add"" card), in an order that makes sense!","Иногда вы можете захотеть записать порядок, в котором происходили изменения, вместо того, чтобы делать один коммит. + +Что здесь произошло? Сделайте два коммита из изменений (используя карту ""add""), в осмысленном порядке!" +commita_title_176,"Make a commit, but faster!","Сделай коммит, но быстрее!" +commita_description_177,"There is a time-saving trick, where instead of a plain git commit, you can use - git commit -a +code +Code +download +content_copy +expand_less +git commit -a -This will automatically add all changes you made to local files! Very convenient.", -commita_win_hint_178,"Make a commit where all files contain ""x"".", -filesmove_title_179,No sleep required, +This will automatically add all changes you made to local files! Very convenient.","Есть трюк для экономии времени, где вместо обычного git commit вы можете использовать + +code +Code +download +content_copy +expand_less +`git commit -a` + +Это автоматически добавит все изменения, которые вы внесли в локальные файлы! Очень удобно." +commita_win_hint_178,"Make a commit where all files contain ""x"".","Сделайте коммит, в котором все файлы содержат ""x""." +filesmove_title_179,No sleep required,Сон не требуется filesmove_description_180,"Actually, you decide that you don't need any sleep. -Because of that, you won't require a bed, and can build some other piece of furniture from the wood!", +Because of that, you won't require a bed, and can build some other piece of furniture from the wood!","На самом деле, вы решаете, что вам не нужен сон. + +Из-за этого вам не понадобится кровать, и вы можете сделать какой-нибудь другой предмет мебели из дерева!" filesmove_congrats_181,"Neat! It even still looks a bit comfortable! -You head out, eager for your first lesson at time travel school!", -filesmove_win_hint_182,"Rename the bed into something else, and give it a new description!", -remotesdelete_title_183,Deleting and renaming a remote, -remotesdelete_description_184,"Here, you already have two remotes configured! You can list them using `git remote`.", -remotesdelete_win_hint_185,Rename the remote with the typo (using `git remote rename [old name] [new name]`), -remotesdelete_win_hint_186,The remote with the typo is gone., -remotesdelete_win_hint_187,Delete the remote you don't want to keep (using `git remote remove [remote]`), -commit_title_188,Make a commit \o/, -commit_description_189,"For practice, make a commit where all files contain an ""x""!", -commit_win_hint_190,"File a contains ""x"" in the last main commit.", -commit_win_hint_191,"File b contains ""x"" in the last main commit.", -commit_win_hint_192,"File c contains ""x"" in the last main commit.", -pullpush_title_193,Helping each other, +You head out, eager for your first lesson at time travel school!","Классно! Она даже все еще выглядит немного удобной! + +Вы отправляетесь, с нетерпением ожидая своего первого урока в школе путешествий во времени!" +filesmove_win_hint_182,"Rename the bed into something else, and give it a new description!","Переименуйте кровать во что-то другое и дайте ей новое описание!" +remotesdelete_title_183,Deleting and renaming a remote,Удаление и переименование удаленного репозитория +remotesdelete_description_184,"Here, you already have two remotes configured! You can list them using git remote.","Здесь у вас уже настроено два удаленных репозитория! Вы можете их перечислить с помощью git remote." +remotesdelete_win_hint_185,Rename the remote with the typo (using git remote rename [old name] [new name]),Переименуйте удаленный репозиторий с опечаткой (используя git remote rename [старое имя] [новое имя]), +remotesdelete_win_hint_186,The remote with the typo is gone.,Удаленный репозиторий с опечаткой исчез. +remotesdelete_win_hint_187,Delete the remote you don't want to keep (using git remote remove [remote]),Удалите удаленный репозиторий, который вы не хотите сохранять (используя git remote remove [remote]), +commit_title_188,Make a commit \o/,Сделайте коммит \o/ +commit_description_189,"For practice, make a commit where all files contain an ""x""!","Для практики сделайте коммит, в котором все файлы содержат ""x""!" +commit_win_hint_190,"File a contains ""x"" in the last main commit.","Файл a содержит ""x"" в последнем коммите ветки main." +commit_win_hint_191,"File b contains ""x"" in the last main commit.","Файл b содержит ""x"" в последнем коммите ветки main." +commit_win_hint_192,"File c contains ""x"" in the last main commit.","Файл c содержит ""x"" в последнем коммите ветки main." +pullpush_title_193,Helping each other,Помогая друг другу pullpush_description_194,"The events and timelines you see are always only what your own time machine knows about! Of course, time agents don't have to work alone! Here, your sidekick has already prepared a merge for you! You can use the ""pull"" card to transfer it to your own time machine. -Then, add another event on top (what does Sam have for dinner?), and `push` the result, to transfer it back to your sidekick! +Then, add another event on top (what does Sam have for dinner?), and push the result, to transfer it back to your sidekick! + +You can only ever manipulate things in your own time machine (the one on the bottom).","События и временные линии, которые вы видите, - это всегда только то, что знает ваша собственная машина времени! -You can only ever manipulate things in your own time machine (the one on the bottom).", -pullpush_congrats_195,"In reality, in many cases, a lot of time agents work together to build a really good future together! :)", -fetch_title_196,Fetching from remotes, -fetch_description_197,"Here, you already have two remotes configured! You can list them using `git remote`. +Конечно, временные агенты не обязаны работать в одиночку! Здесь ваш помощник уже подготовил для вас слияние! Вы можете использовать карту ""pull"", чтобы перенести его в свою машину времени. + +Затем добавьте еще одно событие сверху (что Сэм ест на ужин?) и push результат, чтобы передать его обратно вашему помощнику! + +Вы можете манипулировать вещами только в своей собственной машине времени (той, что внизу)." +pullpush_congrats_195,"In reality, in many cases, a lot of time agents work together to build a really good future together! :)","В реальности, во многих случаях, множество временных агентов работают вместе, чтобы построить действительно хорошее будущее! :)" +fetch_title_196,Fetching from remotes,Получение данных с удаленных репозиториев +fetch_description_197,"Here, you already have two remotes configured! You can list them using git remote. Fetch from both, and look at the suggestions. -Then, make a new commit on top of your original one that introduces a compromise.", -fetch_win_hint_198,Your proposal is acceptable for friend1., -fetch_win_hint_199,Your proposal is acceptable for friend2., -remotesadd_title_200,Adding a remote, -remotesadd_description_201,"Let's work together with others! Your friend has their own repo at the URL `../friend` - you can add it using +Then, make a new commit on top of your original one that introduces a compromise.","Здесь у вас уже настроено два удаленных репозитория! Вы можете их перечислить, используя git remote. - git remote add [name] [URL] +Получите данные с обоих и посмотрите на предложения. -where `[name]` is an arbitrary, short name you pick for the remote. +Затем сделайте новый коммит поверх вашего оригинального, который вводит компромисс." +fetch_win_hint_198,Your proposal is acceptable for friend1.,Ваше предложение приемлемо для friend1. +fetch_win_hint_199,Your proposal is acceptable for friend2.,Ваше предложение приемлемо для friend2. +remotesadd_title_200,Adding a remote,Добавление удаленного репозитория +remotesadd_description_201,"Let's work together with others! Your friend has their own repo at the URL ../friend - you can add it using -When you've done that, you can get all commits from that remote using +code +Code +download +content_copy +expand_less +git remote add [name] [URL] - git pull friend +where [name] is an arbitrary, short name you pick for the remote. -There's a letter for you!", -remotesadd_win_hint_202,Add a remote that points to ../friend., -remotesadd_win_hint_203,Pull from the remote., -checkout_title_204,Getting the last version, +When you've done that, you can get all commits from that remote using + +code +Code +download +content_copy +expand_less +git pull friend + +There's a letter for you!","Давайте работать вместе с другими! У вашего друга есть свой собственный репозиторий по URL ../friend - вы можете добавить его, используя + +code +Code +download +content_copy +expand_less +`git remote add [имя] [URL]` + +где [имя] - это произвольное, короткое имя, которое вы выбираете для удаленного репозитория. + +Когда вы это сделаете, вы можете получить все коммиты с этого удаленного репозитория, используя + +code +Code +download +content_copy +expand_less +`git pull friend` + +Для вас есть письмо!" +remotesadd_win_hint_202,Add a remote that points to ../friend.,Добавьте удаленный репозиторий, который указывает на ../friend. +remotesadd_win_hint_203,Pull from the remote.,Получите данные с удаленного репозитория. +checkout_title_204,Getting the last version,Получение последней версии checkout_description_205,"You've been working on your essay for a while. But - ughh! Now your cat walks over your keyboard and ""helps you"", so now it's all messed up! :/ -But Git is here to help! To discard all changes your cat made, and go back to the version in the last commit, use `checkout`!", -checkout_win_hint_206,Restore the version from the last commit., -restore_title_207,Looking into the past, +But Git is here to help! To discard all changes your cat made, and go back to the version in the last commit, use checkout!","Вы уже некоторое время работаете над своим эссе. Но - ух! Теперь ваша кошка прошлась по клавиатуре и ""помогла вам"", так что теперь все испорчено! :/ + +Но Git здесь, чтобы помочь! Чтобы отменить все изменения, которые сделала ваша кошка, и вернуться к версии в последнем коммите, используйте checkout!" +checkout_win_hint_206,Restore the version from the last commit.,Восстановите версию из последнего коммита. +restore_title_207,Looking into the past,Заглядывая в прошлое restore_description_208,"You've been working on your essay for a while. But you're not happy with the changes you've made recently. You want to go back to the version called ""Best version""! -No problem, you can use the `checkout` card to restore your essay from an older commit!", -restore_win_hint_209,"For nostalgic reasons, restore the very first backup you made!", -indexmv_title_210,Rename a file in the next commit, -indexmv_description_211,"Other times, you might want to rename a file in the next commit. Use +No problem, you can use the checkout card to restore your essay from an older commit!","Вы уже некоторое время работаете над своим эссе. Но вы недовольны недавними изменениями. Вы хотите вернуться к версии под названием ""Лучшая версия""! - git mv [file] [new name] +Нет проблем, вы можете использовать карту checkout, чтобы восстановить свое эссе из более старого коммита!" +restore_win_hint_209,"For nostalgic reasons, restore the very first backup you made!","Из ностальгических соображений восстановите самую первую резервную копию, которую вы сделали!" +indexmv_title_210,Rename a file in the next commit,Переименовать файл в следующем коммите +indexmv_description_211,"Other times, you might want to rename a file in the next commit. Use -for that. The effect is very similar as if you had created a copy with a new name, and removed the old version.", -indexmv_win_hint_212,"Make a commit where you rename the file b to ""x"".", -reflog_title_213,Go back to where you were before, +code +Code +download +content_copy +expand_less +git mv [file] [new name] + +for that. The effect is very similar as if you had created a copy with a new name, and removed the old version.","В других случаях вы можете захотеть переименовать файл в следующем коммите. Используйте + +code +Code +download +content_copy +expand_less +`git mv [файл] [новое имя]` + +для этого. Эффект очень похож на то, как если бы вы создали копию с новым именем и удалили старую версию." +indexmv_win_hint_212,"Make a commit where you rename the file b to ""x"".","Сделайте коммит, в котором вы переименовываете файл b в ""x""." +reflog_title_213,Go back to where you were before,Вернуться туда, где вы были раньше reflog_description_214,"Say you were looking at something in the past, and then switched back to the main branch. But then, you got reaaally distracted, and after your lunch break, you can't remember which past commit you were on before. How can you find out? There's a convenient command that shows you all the places your HEAD has pointed to in the past: - git reflog", -reflog_win_hint_215,"Find out where you've been before, and go back there!", -pushedsomethingbroken_title_216,I pushed something broken, -pushedsomethingbroken_description_217,"We were talking about how to undo a commit, and fix it. This only helps when you haven't already pushed it to a remote. When that has happened, and you want to undo the effects of the commit completely, your best option is `git revert`", -badcommit_title_218,Undo a bad commit, +code +Code +download +content_copy +expand_less +git reflog","Допустим, вы смотрели что-то в прошлом, а затем переключились обратно на основную ветку. + +Но затем вы ооочень отвлеклись, и после обеденного перерыва не можете вспомнить, на каком прошлом коммите вы были. Как это выяснить? + +Есть удобная команда, которая показывает все места, на которые указывал ваш HEAD в прошлом: + +code +Code +download +content_copy +expand_less +`git reflog`" + +reflog_win_hint_215,"Find out where you've been before, and go back there!","Узнайте, где вы были раньше, и вернитесь туда!" +pushedsomethingbroken_title_216,I pushed something broken,Я отправил что-то сломанное +pushedsomethingbroken_description_217,"We were talking about how to undo a commit, and fix it. This only helps when you haven't already pushed it to a remote. When that has happened, and you want to undo the effects of the commit completely, your best option is git revert","Мы говорили о том, как отменить коммит и исправить его. Это помогает только тогда, когда вы еще не отправили его на удаленный репозиторий. Когда это произошло, и вы хотите полностью отменить эффекты коммита, ваш лучший вариант — git revert" +badcommit_title_218,Undo a bad commit,Отменить плохой коммит badcommit_description_219,"Oh no, we made a bad commit! How can we undo making the commit, and go back to a point where we can try again? -The answer is using `git reset [commit]`, which does two things: +The answer is using git reset [commit], which does two things: + +It resets the current branch ref to the commit you specify. + +And it resets the index to that commit. + +It does not change your working directory in any way, which means that after that, you can try making the commit you want again.","О нет, мы сделали плохой коммит! Как мы можем отменить создание коммита и вернуться к моменту, когда мы можем попробовать снова? + +Ответ — использование git reset [коммит], которое делает две вещи: + +Сбрасывает ссылку текущей ветки на указанный вами коммит. -- It resets the current branch ref to the commit you specify. -- And it resets the index to that commit. +И сбрасывает индекс к этому коммиту. -It does not change your working directory in any way, which means that after that, you can try making the commit you want again.", -badcommit_win_hint_220,"In the last main commit, the numbers file contains the numbers from 1 to 10.", -badcommit_win_hint_221,"The commit message of that commit is ""More numbers"".", -badcommit_win_hint_222,The commit with the typo is not part of the main branch anymore., -restoreafilefromthepast_title_223,Restore a file from the past, +Это никак не изменяет ваш рабочий каталог, что означает, что после этого вы можете снова попытаться сделать нужный коммит." +badcommit_win_hint_220,"In the last main commit, the numbers file contains the numbers from 1 to 10.","В последнем коммите ветки main файл numbers содержит числа от 1 до 10." +badcommit_win_hint_221,"The commit message of that commit is ""More numbers"".","Сообщение этого коммита — ""Больше чисел""." +badcommit_win_hint_222,The commit with the typo is not part of the main branch anymore.,Коммит с опечаткой больше не является частью основной ветки. +restoreafilefromthepast_title_223,Restore a file from the past,Восстановить файл из прошлого restoreafilefromthepast_description_224,"Here's a similar problem: you really liked the essay from the very first commit, and want to have it back! Well, checkout can also restore things from older commits, Here's how: - git checkout [commit] [file]", -restoreafilefromthepast_win_hint_225,"Get the first version of your essay, and make a new commit with it.", -restoreafile_title_226,Restore a deleted file, +code +Code +download +content_copy +expand_less +git checkout [commit] [file]","Вот похожая проблема: вам очень понравилось эссе из самого первого коммита, и вы хотите его вернуть! Что ж, checkout также может восстанавливать вещи из более старых коммитов. Вот как: + +`git checkout [коммит] [файл]`" + +restoreafilefromthepast_win_hint_225,"Get the first version of your essay, and make a new commit with it.","Получите первую версию вашего эссе и сделайте с ней новый коммит." +restoreafile_title_226,Restore a deleted file,Восстановить удаленный файл restoreafile_description_227,"Oops - you deleted the ""essay"" file, which you worked on all night! -Luckily, Git is here to help! You can use `git checkout` to restore the file!", -restoreafile_win_hint_228,"Restore the essay to contain ""important content""", -remotetag_title_229,Remote Tags, +Luckily, Git is here to help! You can use git checkout to restore the file!","Ой - вы удалили файл ""эссе"", над которым работали всю ночь! + +К счастью, Git здесь, чтобы помочь! Вы можете использовать git checkout, чтобы восстановить файл!" +restoreafile_win_hint_228,"Restore the essay to contain ""important content""","Восстановите эссе, чтобы оно содержало ""важное содержимое""" +remotetag_title_229,Remote Tags,Удаленные теги remotetag_description_230,"When you work with remote repositories, tags are not pushed or pulled automatically. You can push a tag with - git push +git push Or all tags with: - git push --tags - -Deleting tags on your remote works with: - git push --delete - -You can also sync - git fetch --prune --prune-tags - - -Add a tag named ""v2"" to the last commit and push it to the remote. Also pull the v1 tag to your local repository.", -remotetag_win_hint_231,v1 tag in your repo, -remotetag_win_hint_232,v2 tag in your repo, -addtaglater_title_233,Tagging later, +git push --tags + +Deleting tags on your remote works with: +git push --delete + +You can also sync +git fetch --prune --prune-tags + +Add a tag named ""v2"" to the last commit and push it to the remote. Also pull the v1 tag to your local repository.","При работе с удаленными репозиториями теги не отправляются и не загружаются автоматически. + +Вы можете отправить тег с помощью +git push <удаленный_репозиторий> <имя_тега> +Или все теги с помощью: +git push <удаленный_репозиторий> --tags + +Удаление тегов на удаленном репозитории работает с помощью: +git push <удаленный_репозиторий> --delete <имя_тега> + +Вы также можете синхронизировать +git fetch <удаленный_репозиторий> --prune --prune-tags + +Добавьте тег с именем ""v2"" к последнему коммиту и отправьте его на удаленный репозиторий. Также загрузите тег v1 в свой локальный репозиторий." +remotetag_win_hint_231,v1 tag in your repo,тег v1 в вашем репозитории +remotetag_win_hint_232,v2 tag in your repo,тег v2 в вашем репозитории +addtaglater_title_233,Tagging later,Добавление тега позже addtaglater_description_234,"But what happens if you forgot to tag your current commit? No Prob! You can also tag older commits via - git tag - +code +Code +download +content_copy +expand_less +git tag + Tag the commit ""Adding feature 2"" with the name ""v1""! ---- tipp1 ---- tipp2 ---- -tipp3", -addtaglater_congrats_235,Well done :), -addtaglater_win_hint_236,Did you create a new tag?, -removetag_title_237,Removing tags, + +tipp3","Но что делать, если вы забыли поставить тег на текущий коммит? +Нет проблем! Вы также можете ставить теги на более старые коммиты с помощью + +code +Code +download +content_copy +expand_less +`git tag <имя_тега> <хэш_коммита>` + +Поставьте тег с именем ""v1"" на коммит ""Adding feature 2""! + +подсказка1 +подсказка2 + +подсказка3" +addtaglater_congrats_235,Well done :),Отлично :) +addtaglater_win_hint_236,Did you create a new tag?,Вы создали новый тег? +removetag_title_237,Removing tags,Удаление тегов removetag_description_238,"You added way too many tags? No prob! Delete them with - git tag -d - +code +Code +download +content_copy +expand_less +git tag -d + Remove all tags in this repo! ---- tipp1 ---- tipp2 ---- -tipp3", -removetag_win_hint_239,Did you remove all tags?, -addtag_title_240,Creating tags, + +tipp3","Вы добавили слишком много тегов? Нет проблем! Удалите их с помощью + +code +Code +download +content_copy +expand_less +`git tag -d <имя_тега>` + +Удалите все теги в этом репозитории! + +подсказка1 +подсказка2 + +подсказка3" +removetag_win_hint_239,Did you remove all tags?,Вы удалили все теги? +addtag_title_240,Creating tags,Создание тегов addtag_description_241,"Some of your commits may be special commits. Maybe you reached a milestone or a new version number. You can mark these commits with a special flag called 'tag'. -Write +Write + +code +Code +download +content_copy +expand_less +git tag - git tag - to tag your commit. ---- tipp1 ---- tipp2 ---- -tipp3", -addtag_congrats_242,Nice! You tagged your first commit :), -filesdelete_title_243,Unexpected Roommates, + +tipp3","Некоторые из ваших коммитов могут быть особенными. Возможно, вы достигли важной вехи или нового номера версии. + +Вы можете пометить эти коммиты специальным флагом, называемым 'тег'. + +Напишите + +code +Code +download +content_copy +expand_less +`git tag <имя-тега>` + +чтобы пометить ваш коммит. + +подсказка1 +подсказка2 + +подсказка3" +addtag_congrats_242,Nice! You tagged your first commit :),Отлично! Вы пометили свой первый коммит :) +filesdelete_title_243,Unexpected Roommates,Неожиданные соседи по комнате filesdelete_description_244,"The first day at Time Travel School comes to an end and you receive the key to your room. Full of excitement you open the door just to find... spider webs! Spider webs everywhere! -Remove all the spider webs you can find with the remove card!", -filesdelete_congrats_245,Your room looks now very tidy and cozy! Time to unpack your stuff!, -filesdelete_win_hint_246,Remove all spider webs., -filesdelete_win_hint_247,But make sure you keep your bed!, -filesadd_title_248,Interior design, +Remove all the spider webs you can find with the remove card!","Первый день в Школе Путешествий во Времени подходит к концу, и вы получаете ключ от своей комнаты. +Полные восторга, вы открываете дверь и обнаруживаете... паутину! Паутина повсюду! + +Уберите всю паутину, которую сможете найти, с помощью карты удаления!" +filesdelete_congrats_245,Your room looks now very tidy and cozy! Time to unpack your stuff!,Ваша комната теперь выглядит очень опрятной и уютной! Время распаковывать вещи! +filesdelete_win_hint_246,Remove all spider webs.,Уберите всю паутину. +filesdelete_win_hint_247,But make sure you keep your bed!,Но убедитесь, что вы оставили свою кровать! +filesadd_title_248,Interior design,Дизайн интерьера filesadd_description_249,"Now that your room looks tidy, you can start to unpack your stuff. You brought two new pieces of furniture with you and with a bright smile, you see that their colors match the color of your bed! @@ -520,211 +855,531 @@ Build up your two pieces of furniture by playing the touch card. Then name your furniture - you can choose whatever you like. Make sure the colors match! You can find the bed's color in its description. -Don't forget to add a color and description to your new furnitures, too!", -filesadd_congrats_250,Don't you immediately feel more at home?, -filesadd_win_hint_251,Add two more pieces of furniture, -filesadd_win_hint_252,Make sure the colors match your bed's color., -rebase_title_253,Rebasing, +Don't forget to add a color and description to your new furnitures, too!","Теперь, когда ваша комната выглядит опрятно, вы можете начать распаковывать свои вещи. Вы привезли с собой два новых предмета мебели и с яркой улыбкой +замечаете, что их цвета совпадают с цветом вашей кровати! + +Соберите свои два предмета мебели, сыграв карту касания. +Затем назовите свою мебель - вы можете выбрать любое название. + +Убедитесь, что цвета совпадают! Цвет кровати вы можете найти в ее описании. +Не забудьте также добавить цвет и описание для вашей новой мебели!" +filesadd_congrats_250,Don't you immediately feel more at home?,Разве вы не чувствуете себя сразу как дома? +filesadd_win_hint_251,Add two more pieces of furniture,Добавьте еще два предмета мебели, +filesadd_win_hint_252,Make sure the colors match your bed's color.,Убедитесь, что цвета соответствуют цвету вашей кровати. +rebase_title_253,Rebasing,Перебазирование (Rebasing) rebase_description_254,"Okay - turns out that saving time in the morning by utilizing parallel universes is against the regulations of the International Time Travel Association. You'll have to do your tasks in sequence after all. See the ""rebase"" card? When you drag it to a commit, it will copy the events in your current timeline after the specified one! This way, make a clean, linear timeline where you visit all three shops. -Again, we want to make that our base reality - the ""main"" branch should point to that timeline!", +Again, we want to make that our base reality - the ""main"" branch should point to that timeline!","Хорошо - оказывается, экономия времени по утрам за счет использования параллельных вселенных противоречит правилам Международной Ассоциации Путешествий во Времени. В конце концов, вам придется выполнять свои задачи последовательно. + +Видите карту ""rebase""? Когда вы перетаскиваете ее на коммит, она скопирует события из вашей текущей временной линии после указанного! Таким образом, создайте чистую, линейную временную линию, где вы посещаете все три магазина. + +Опять же, мы хотим сделать это нашей базовой реальностью - ветка ""main"" должна указывать на эту временную линию!" rebase_congrats_255,"Notice how the other timelines and commits are still there - if anything goes wrong, you can also travel back to them. -It's really hard to actually *destroy* stuff with your time machine.", -rebase_win_hint_256,Order all tree branches into one and move the main branch ref, -reorder_title_257,Reordering events, +It's really hard to actually destroy stuff with your time machine.","Обратите внимание, как другие временные линии и коммиты все еще на месте - если что-то пойдет не так, вы также можете вернуться к ним. + +На самом деле очень трудно уничтожить что-либо с помощью вашей машины времени." +rebase_win_hint_256,Order all tree branches into one and move the main branch ref,Упорядочите все ветви дерева в одну и переместите ссылку основной ветви, +reorder_title_257,Reordering events,Изменение порядка событий reorder_description_258,"Oops, looks like there's something messed up here. Can you put the events back into their correct order? There are two ways to do this: You can drag the ""interactive rebase"" card to the commit before the one you want to change, then reorder the lines in the file that opens, and save it. -Or you can reset the main tag to the very first commit, and then cherry-pick single commits in the order you want. You have cards for both approaches!", -reorder_congrats_259,Feel free to reset the level and try the other strategy! Which one do you like better?, -reorder_win_hint_260,Reorder the commits to dress yourself in the correct way, -bisect_title_261,Yellow brick road, +Or you can reset the main tag to the very first commit, and then cherry-pick single commits in the order you want. You have cards for both approaches!","Ой, похоже, здесь что-то напутано. Можете ли вы вернуть события в правильном порядке? + +Есть два способа сделать это: Вы можете перетащить карту ""interactive rebase"" на коммит перед тем, который вы хотите изменить, затем изменить порядок строк в открывшемся файле и сохранить его. + +Или вы можете сбросить основной тег на самый первый коммит, а затем выбрать отдельные коммиты (cherry-pick) в нужном порядке. У вас есть карты для обоих подходов!" +reorder_congrats_259,Feel free to reset the level and try the other strategy! Which one do you like better?,Не стесняйтесь сбросить уровень и попробовать другую стратегию! Какая вам нравится больше? +reorder_win_hint_260,Reorder the commits to dress yourself in the correct way,Измените порядок коммитов, чтобы одеться правильно, +bisect_title_261,Yellow brick road,Дорога из желтого кирпича bisect_description_262,"(Please zoom out a bit using your mouse wheel! :D) Oh no! You have lost your key at some point during the day! Sure, you could look at every single commit in an attempt to find it - but there's a better way: your time machine has a built-in way to find the point in time where things went wrong quickly! -First, play the ""bisect start"" card. Then, go to a commit where you don't have the key, and play the ""bisect bad"" card. Likewise, go to a commit early on where you have the key *in your pocket*, and play the ""bisect good"" card. +First, play the ""bisect start"" card. Then, go to a commit where you don't have the key, and play the ""bisect bad"" card. Likewise, go to a commit early on where you have the key in your pocket, and play the ""bisect good"" card. -After you've found the last good commit, reset the main branch to it. What happened to the key after you lost it?", -bisect_congrats_263,"Well done! :) The only problem is that you now have to walk all the way back home, again...", -bisect_win_hint_264,Find the last good commit, -gitignore_title_265,Ignoring files, +After you've found the last good commit, reset the main branch to it. What happened to the key after you lost it?","(Пожалуйста, немного уменьшите масштаб с помощью колеса мыши! :D) + +О нет! Вы потеряли свой ключ в какой-то момент в течение дня! + +Конечно, вы могли бы просмотреть каждый отдельный коммит в попытке найти его - но есть способ лучше: у вашей машины времени есть встроенный способ быстро найти момент времени, когда все пошло не так! + +Сначала сыграйте карту ""bisect start"". Затем перейдите к коммиту, где у вас нет ключа, и сыграйте карту ""bisect bad"". Аналогично, перейдите к раннему коммиту, где у вас есть ключ в кармане, и сыграйте карту ""bisect good"". + +После того, как вы найдете последний хороший коммит, сбросьте основную ветку на него. Что случилось с ключом после того, как вы его потеряли?" +bisect_congrats_263,"Well done! :) The only problem is that you now have to walk all the way back home, again...","Отлично! :) Единственная проблема в том, что теперь вам снова придется идти пешком до самого дома..." +bisect_win_hint_264,Find the last good commit,Найдите последний хороший коммит +gitignore_title_265,Ignoring files,Игнорирование файлов gitignore_description_266,"That chicken is running around a lot, and changing often. We don't want to have it in our commits. -Add it to the file .gitignore, and try using `git add .`!", -pr_description_267,"Your friend has a problem! Clone the repo located in `../friend`, create a branch called ""solution"", and fix the problem in this branch. When you're ready, make a ""Pull Request"" by using `git tag pr`.", -empty_title_268,Empty sandbox, -empty_description_269,This is an empty sandbox you can play around in., -threecommits_title_270,Sandbox with three commits, +Add it to the file .gitignore, and try using git add .!","Эта курица много бегает и часто меняется. Мы не хотим, чтобы она была в наших коммитах. + +Добавьте ее в файл .gitignore и попробуйте использовать git add .!" +pr_description_267,"Your friend has a problem! Clone the repo located in ../friend, create a branch called ""solution"", and fix the problem in this branch. When you're ready, make a ""Pull Request"" by using git tag pr.","У вашего друга проблема! Клонируйте репозиторий, находящийся в ../friend, создайте ветку с именем ""solution"" и исправьте проблему в этой ветке. Когда будете готовы, сделайте ""Pull Request"", используя git tag pr." +empty_title_268,Empty sandbox,Пустая песочница +empty_description_269,This is an empty sandbox you can play around in.,Это пустая песочница, в которой вы можете поиграть. +threecommits_title_270,Sandbox with three commits,Песочница с тремя коммитами threecommits_description_271,"Here's a sandbox you can play around in. You can use both the playing cards, as well as the terminal. This is a real Git terminal! Fun things to try: -- Make a commit that merges three timelines together at once! -- Create and delete some tags! -- Make a timeline that's completely independent of the rest!", -remote_title_272,Sandbox with a remote, +Make a commit that merges three timelines together at once! + +Create and delete some tags! + +Make a timeline that's completely independent of the rest!","Вот песочница, в которой можно поиграть. + +Вы можете использовать как игральные карты, так и терминал. Это настоящий Git-терминал! Что можно попробовать: + +Сделать коммит, который объединяет три временные линии одновременно! + +Создать и удалить несколько тегов! + +Создать временную линию, полностью независимую от остальных!" +remote_title_272,Sandbox with a remote,Песочница с удаленным репозиторием remote_description_273,"Here's a sandbox with a remote! Try pulling, fetching, or pushing! -How can you push tags and branches on a remote? How can you delete them again?", +How can you push tags and branches on a remote? How can you delete them again?","Вот песочница с удаленным репозиторием! Попробуйте pull, fetch или push! + +Как можно отправлять теги и ветки на удаленный репозиторий? Как их можно снова удалить?" treenested_description_274,"Trees can also point to other trees! This way, they can describe nested directory structures. -When you add a file inside of a directory to the index, and then call `git write-tree`, it will create a nested tree for the directory, and attach the blob to it. +When you add a file inside of a directory to the index, and then call git write-tree, it will create a nested tree for the directory, and attach the blob to it. + +To solve this level, build a little stick figure, as shown on the left - a tree that points to two blobs, as well to a tree that points to two blobs.","Деревья также могут указывать на другие деревья! Таким образом, они могут описывать вложенные структуры каталогов. + +Когда вы добавляете файл внутри каталога в индекс, а затем вызываете git write-tree, это создаст вложенное дерево для каталога и прикрепит к нему блоб. -To solve this level, build a little stick figure, as shown on the left - a tree that points to two blobs, as well to a tree that points to two blobs.", +Чтобы решить этот уровень, постройте маленькую фигурку из палочек, как показано слева - дерево, которое указывает на два блоба, а также на дерево, которое указывает на два блоба." indexupdate_description_275,"Instead of removing an entry from the index and adding one with the same name, you can also directly update that entry! Put the content you want in a file with a matching name, and then run - git update-index +code +Code +download +content_copy +expand_less +git update-index This will create a new blob, and update the hash of the entry to that blob. -Update an entry in the index!", -indexupdate_win_hint_276,This is not really a good test for the winning condition..., +Update an entry in the index!","Вместо удаления записи из индекса и добавления новой с тем же именем, вы также можете напрямую обновить эту запись! + +Поместите желаемое содержимое в файл с соответствующим именем, а затем выполните + +code +Code +download +content_copy +expand_less +`git update-index <файл>` + +Это создаст новый блоб и обновит хэш записи до этого блоба. + +Обновите запись в индексе!" +indexupdate_win_hint_276,This is not really a good test for the winning condition...,Это не очень хороший тест для условия победы... indexremove_description_277,"To remove an entry from the index, use a command like this: - git update-index --force-remove +code +Code +download +content_copy +expand_less +git update-index --force-remove -Remove all entries from the index!", +Remove all entries from the index!","Чтобы удалить запись из индекса, используйте команду вроде этой: + +code +Code +download +content_copy +expand_less +`git update-index --force-remove <файл>` + +Удалите все записи из индекса!" commitcreate_description_278,"So a tree describes a directory structure at a specific point in time. It would be nice if we could remember when that state existed, and who authored it, right? Enter: commits. They are objects that point to a tree and contain some additional metadata. You can create a commit using - git commit-tree -m ""Description of your commit"" +code +Code +download +content_copy +expand_less +git commit-tree -m ""Description of your commit"" + +Make a commit from the tree in this repository!","Итак, дерево описывает структуру каталогов в определенный момент времени. -Make a commit from the tree in this repository!", +Было бы неплохо, если бы мы могли запомнить, когда это состояние существовало и кто его автор, верно? + +Представляем: коммиты. Это объекты, которые указывают на дерево и содержат некоторые дополнительные метаданные. Вы можете создать коммит, используя + +code +Code +download +content_copy +expand_less +`git commit-tree <дерево> -m ""Описание вашего коммита""` + +Сделайте коммит из дерева в этом репозитории!" treeread_description_279,"As soon as you have some tree objects, you can always read them and set the index exactly to their content! Unsurprisingly, the command is called - git read-tree +code +Code +download +content_copy +expand_less +git read-tree For , you can provide the hash of any tree object - you can right-click one to insert its hash into the terminal! -Try reading some of the trees in this repository into the index!", +Try reading some of the trees in this repository into the index!","Как только у вас появятся какие-либо объекты-деревья, вы всегда можете прочитать их и установить индекс в точности в соответствии с их содержимым! Неудивительно, что команда называется + +code +Code +download +content_copy +expand_less +`git read-tree <дерево>` + +Для <дерева> вы можете указать хэш любого объекта-дерева - вы можете щелкнуть правой кнопкой мыши по одному из них, чтобы вставить его хэш в терминал! + +Попробуйте прочитать некоторые из деревьев в этом репозитории в индекс!" commitrhombus_description_280,"A commit can have multiple parents! You can specify the -p option multiple times, like this: - git commit-tree -m ""Description"" -p -p +code +Code +download +content_copy +expand_less +git commit-tree -m ""Description"" -p -p + +Build a rhombus shape from commits, where two commits point to the same parent, and then a fourth commit points to both of them.","Коммит может иметь несколько родителей! Вы можете указать опцию -p несколько раз, вот так: -Build a rhombus shape from commits, where two commits point to the same parent, and then a fourth commit points to both of them.", -commitrhombus_win_hint_281,My first parent's parents has to be the same as my second parent's parent., +code +Code +download +content_copy +expand_less +`git commit-tree <дерево> -m ""Описание"" -p <родитель1> -p <родитель2>` + +Постройте ромбовидную форму из коммитов, где два коммита указывают на одного и того же родителя, а затем четвертый коммит указывает на них обоих." +commitrhombus_win_hint_281,My first parent's parents has to be the same as my second parent's parent.,Родители моего первого родителя должны быть такими же, как родитель моего второго родителя. refmove_description_282,"You can point refs to a new location using the same command you use to create them: - git update-ref refs/ +code +Code +download +content_copy +expand_less +git update-ref refs/ + +As an exercise, make all refs in this repository point to the tree object!","Вы можете указать ссылкам на новое местоположение, используя ту же команду, которую вы используете для их создания: -As an exercise, make all refs in this repository point to the tree object!", +code +Code +download +content_copy +expand_less +`git update-ref refs/<имя_ссылки> <объект>` + +В качестве упражнения, сделайте так, чтобы все ссылки в этом репозитории указывали на объект-дерево!" blobremove_description_283,"There's a simple command to remove all objects that are not referenced by anything: - git prune +code +Code +download +content_copy +expand_less +git prune + +Remove all blobs in this repository.","Есть простая команда для удаления всех объектов, на которые ничего не ссылается: -Remove all blobs in this repository.", -blobremove_congrats_284,"Generally, `git prune` will be useful if you want to clean up some objects you made. +code +Code +download +content_copy +expand_less +`git prune` -Alternatively, you can also click the ""Reload"" button to restart a level.", +Удалите все блобы в этом репозитории." +blobremove_congrats_284,"Generally, git prune will be useful if you want to clean up some objects you made. + +Alternatively, you can also click the ""Reload"" button to restart a level.","В общем, git prune будет полезен, если вы хотите очистить некоторые созданные вами объекты. + +В качестве альтернативы вы также можете нажать кнопку ""Перезагрузить"", чтобы перезапустить уровень." symrefcreate_description_285,"Instead of pointing directly to objects, refs can also point to other refs! When that happens, they are called ""symbolic refs"". You can create or update a symbolic ref using - git symbolic-ref +code +Code +download +content_copy +expand_less +git symbolic-ref + +Create a symbolic ref called ""refs/rainbow""!","Вместо того чтобы указывать непосредственно на объекты, ссылки могут также указывать на другие ссылки! -Create a symbolic ref called ""refs/rainbow""!", +Когда это происходит, их называют ""символическими ссылками"". Вы можете создать или обновить символическую ссылку, используя + +code +Code +download +content_copy +expand_less +`git symbolic-ref <имя> <ссылка>` + +Создайте символическую ссылку с именем ""refs/rainbow""!" commitparents_description_286,"When using the commit-tree command, you can optionally specify a parent: - git commit-tree -m ""Description"" -p +code +Code +download +content_copy +expand_less +git commit-tree -m ""Description"" -p Make a string of three commits! -Hint: You'll need a tree object. What could be the easiest way to obtain one?", +Hint: You'll need a tree object. What could be the easiest way to obtain one?","При использовании команды commit-tree вы можете опционально указать родителя: + +code +Code +download +content_copy +expand_less +`git commit-tree <дерево> -m ""Описание"" -p <родительский коммит>` + +Создайте цепочку из трех коммитов! + +Подсказка: Вам понадобится объект-дерево. Какой самый простой способ его получить?" blobcreate_description_287,"At its core, Git is very simple. It stores ""objects"", which are basically files identified by an ""identifier"" (short: ID). There are four types of objects: blobs, trees, commits, and tags. The simplest type is a ""blob"", which is just a piece of text. Let's create some blobs! To do that, create a file with the desired content, and then use - git hash-object -w +code +Code +download +content_copy +expand_less +git hash-object -w The flag -w means ""write"", and tells Git to actually write the new blob to the disk. -Create three new blobs!", +Create three new blobs!","В своей основе Git очень прост. Он хранит ""объекты"", которые по сути являются файлами, идентифицируемыми ""идентификатором"" (сокращенно: ID). + +Существует четыре типа объектов: блобы, деревья, коммиты и теги. Самый простой тип - ""блоб"", который представляет собой просто фрагмент текста. + +Давайте создадим несколько блобов! Для этого создайте файл с желаемым содержимым, а затем используйте + +code +Code +download +content_copy +expand_less +`git hash-object -w <файл>` + +Флаг -w означает ""запись"" и указывает Git фактически записать новый блоб на диск. + +Создайте три новых блоба!" blobcreate_congrats_288,"Tip: You can also use a command like this to create a blob in a single line: - echo ""awesome content"" | git hash-object -w --stdin +code +Code +download +content_copy +expand_less +echo ""awesome content"" | git hash-object -w --stdin + +Did you already notice that you can drag and drop all objects? :)","Совет: Вы также можете использовать команду вроде этой, чтобы создать блоб в одну строку: -Did you already notice that you can drag and drop all objects? :)", +code +Code +download +content_copy +expand_less +`echo ""отличное содержимое"" | git hash-object -w --stdin` + +Вы уже заметили, что можете перетаскивать все объекты? :)" treecreate_description_289,"After carefully building the index we want, it would be nice to save a permanent snapshot of it, right? This is what the second type of objects is for: trees! You can convert the index into a tree using - git write-tree +code +Code +download +content_copy +expand_less +git write-tree + +Try it! :)","После того, как мы тщательно построили нужный нам индекс, было бы неплохо сохранить его постоянный снимок, верно? + +Для этого и предназначен второй тип объектов: деревья! Вы можете преобразовать индекс в дерево, используя + +code +Code +download +content_copy +expand_less +`git write-tree` -Try it! :)", +Попробуйте! :)" treecreate_congrats_290,"Nice! -Can you make a different tree? Modify the index, then call `git write-tree` again!", +Can you make a different tree? Modify the index, then call git write-tree again!","Отлично! + +Можете ли вы создать другое дерево? Измените индекс, затем снова вызовите git write-tree!" welcome_description_291,"This is prototype #1 for the Git learning game by @bleeptrack and @blinry. Thanks for checking it out! <3 You can interact with the repository labelled ""yours"" by typing Bash commands in the terminal below! The visualization will show you its internal status. Let's get started by initializing an empty Git repository in the current directory by typing: - git init", +code +Code +download +content_copy +expand_less +git init","Это прототип №1 обучающей игры по Git от @bleeptrack и @blinry. Спасибо, что заглянули! <3 + +Вы можете взаимодействовать с репозиторием с меткой ""yours"", вводя команды Bash в терминале ниже! Визуализация покажет вам его внутреннее состояние. + +Давайте начнем с инициализации пустого репозитория Git в текущем каталоге, набрав: + +code +Code +download +content_copy +expand_less +`git init`" + welcome_congrats_292,"Well done! An empty Git repository is... well, quite empty. The only thing that always exists is a reference called ""HEAD"" - we'll learn what that is later! But first, let's look at some basics! -(Click ""Next Level"" as soon as you're ready!)", +(Click ""Next Level"" as soon as you're ready!)","Отлично! + +Пустой репозиторий Git... ну, довольно пустой. Единственное, что всегда существует, это ссылка под названием ""HEAD"" - мы узнаем, что это такое, позже! + +Но сначала давайте рассмотрим некоторые основы! + +(Нажмите ""Следующий уровень"", как только будете готовы!)" basics_description_293,"For this prototype, we assume you have some experience with the command line. Here are some commands that will be useful: -- ls -- echo content > file -- cat file -- mkdir dir +ls + +echo content > file + +cat file + +mkdir dir + +Find the riddle in your current directory and put the answer into the file ""answer""!","Для этого прототипа мы предполагаем, что у вас есть некоторый опыт работы с командной строкой. Вот несколько команд, которые будут полезны: + +ls + +echo содержимое > файл -Find the riddle in your current directory and put the answer into the file ""answer""!", +cat файл + +mkdir папка + +Найдите загадку в вашем текущем каталоге и поместите ответ в файл ""answer""!" basics_congrats_294,"Omnomnom! -For technical reasons, you can't use `cd` in this prototype yet. But there won't be a lot of interaction with the file system anyways. :)", -puzzlepreciousblob_description_295,Create two trees pointing to the same blob!, +For technical reasons, you can't use cd in this prototype yet. But there won't be a lot of interaction with the file system anyways. :)","Омномном! + +По техническим причинам вы пока не можете использовать cd в этом прототипе. Но в любом случае взаимодействия с файловой системой будет немного. :)" +puzzlepreciousblob_description_295,Create two trees pointing to the same blob!,Создайте два дерева, указывающих на один и тот же блоб! indexadd_description_296,"Blobs usually represent the content of a file. But on their own, they don't have any metadata, not even a name! Git has a very powerful concept to store metadata related to blobs: the index! It's a list that relates blobs to filenames and access permissions. The most convenient option to add an entry to the index is via an existing file: - echo ""my content"" > file - git update-index --add file +code +Code +download +content_copy +expand_less +echo ""my content"" > file +git update-index --add file + +Add three entries to the index! For a bonus challenge: can you add a file that is inside of a directory, like ""directory/file""?","Блобы обычно представляют содержимое файла. Но сами по себе они не имеют никаких метаданных, даже имени! + +У Git есть очень мощная концепция для хранения метаданных, связанных с блобами: индекс! Это список, который связывает блобы с именами файлов и правами доступа. + +Самый удобный способ добавить запись в индекс - через существующий файл: + +code +Code +download +content_copy +expand_less +`echo ""мое содержимое"" > файл` +`git update-index --add файл` -Add three entries to the index! For a bonus challenge: can you add a file that is inside of a directory, like ""directory/file""?", +Добавьте три записи в индекс! Для дополнительного задания: можете ли вы добавить файл, который находится внутри каталога, например, ""каталог/файл""?" indexadd_congrats_297,"There's another way to add an entry to the index directly: - git update-index --add --cacheinfo ,, +code +Code +download +content_copy +expand_less +git update-index --add --cacheinfo ,, The first three numbers of the mode describe the type of the entry, ""100"" is a regular file. The second three number describe the permissions. Only ""644"" (non-executable) and ""755"" (executable) are supported. -You can insert the hash of an object into the terminal by right-clicking on it! :)", +You can insert the hash of an object into the terminal by right-clicking on it! :)","Есть еще один способ добавить запись в индекс напрямую: + +code +Code +download +content_copy +expand_less +`git update-index --add --cacheinfo <режим>,<хэш_блоба>,<имя>` + +Первые три числа режима описывают тип записи, ""100"" - это обычный файл. + +Вторые три числа описывают права доступа. Поддерживаются только ""644"" (неисполняемый) и ""755"" (исполняемый). + +Вы можете вставить хэш объекта в терминал, щелкнув по нему правой кнопкой мыши! :)" puzzletreesallthewaydown_description_298,"Construct a chain of three trees, which don't point to anything else. -This is hard! The `git mktree` command might be useful.", -puzzletreesallthewaydown_win_hint_299,"So the tree has exactly one child, and it is a tree!", -puzzletreesallthewaydown_win_hint_300,Same for its child! \o/, +This is hard! The git mktree command might be useful.","Создайте цепочку из трех деревьев, которые не указывают ни на что другое. + +Это сложно! Команда git mktree может быть полезна." +puzzletreesallthewaydown_win_hint_299,"So the tree has exactly one child, and it is a tree!","Итак, у дерева ровно один дочерний элемент, и это дерево!" +puzzletreesallthewaydown_win_hint_300,Same for its child! \o/,То же самое для его дочернего элемента! \o/ symrefnoderef_description_301,"When you have a symbolic ref (a ref pointing at another ref), and you decide you want it to be a regular ref again (pointing to an object), you're in for some trouble! :) -What happens when you try pointing the symbolic ref directly to the blob using `git update-ref`? +What happens when you try pointing the symbolic ref directly to the blob using git update-ref? + +Oops! Turns out that when you reference a symbolic ref, it acts as if you had specified the ref it points to. To de-symbolic-ize it, use the --no-deref option directly after update-ref! + +Weird, huh?","Когда у вас есть символическая ссылка (ссылка, указывающая на другую ссылку), и вы решаете, что хотите, чтобы она снова стала обычной ссылкой (указывающей на объект), вас ждут неприятности! :) -Oops! Turns out that when you reference a symbolic ref, it acts as if you had specified the ref it points to. To de-symbolic-ize it, use the `--no-deref` option directly after `update-ref`! +Что произойдет, если вы попытаетесь указать символическую ссылку прямо на блоб с помощью git update-ref? -Weird, huh?", +Ой! Оказывается, когда вы ссылаетесь на символическую ссылку, она ведет себя так, как если бы вы указали ссылку, на которую она указывает. Чтобы ""де-символизировать"" ее, используйте опцию --no-deref сразу после update-ref! + +Странно, да?" symrefnoderef_congrats_302,"Whew, we've covered a lot of things: Blobs! The index! Trees! Commits! Refs! You now know about almost everything about how Git repositories look like on the inside! We think that's pretty cool! :) @@ -733,94 +1388,163 @@ Everything else is just convention and high-level commands that make interacting We haven't covered: -- tag objects (they are the fourth object type - a bit like refs with a description and an author) -- configuration (allows you to specify remote repositories, for example) -- working with local files (which is, uh, arguably pretty important :P) +tag objects (they are the fourth object type - a bit like refs with a description and an author) + +configuration (allows you to specify remote repositories, for example) + +working with local files (which is, uh, arguably pretty important :P) + +Thanks for playing! You're welcome to check out the ""puzzle"" levels in the dropdown, some of them are more advanced!","Уф, мы рассмотрели много всего: Блобы! Индекс! Деревья! Коммиты! Ссылки! + +Теперь вы знаете почти все о том, как репозитории Git выглядят изнутри! Мы думаем, это довольно круто! :) + +Все остальное - это просто соглашения и высокоуровневые команды, которые делают взаимодействие с объектами более удобным. + +Мы не рассмотрели: -Thanks for playing! You're welcome to check out the ""puzzle"" levels in the dropdown, some of them are more advanced!", +объекты-теги (это четвертый тип объектов - немного похожи на ссылки с описанием и автором) + +конфигурация (позволяет указывать удаленные репозитории, например) + +работа с локальными файлами (что, э-э, пожалуй, довольно важно :P) + +Спасибо за игру! Вы можете ознакомиться с уровнями-""загадками"" в выпадающем списке, некоторые из них более продвинутые!" puzzleapocalypse_description_303,"Delete all objects in this repository using git commands only! Useful commands: - git prune - git reflog expire", +code +Code +download +content_copy +expand_less +git prune +git reflog expire","Удалите все объекты в этом репозитории, используя только команды git! + +Полезные команды: + +code +Code +download +content_copy +expand_less +`git prune` +`git reflog expire`" + refremove_description_304,"And finally, to delete a ref, use - git update-ref -d refs/ +code +Code +download +content_copy +expand_less +git update-ref -d refs/ + +Delete all refs! :P (Well, except for HEAD. HEAD is special.)","И, наконец, чтобы удалить ссылку, используйте -Delete all refs! :P (Well, except for HEAD. HEAD is special.)", -refcreate_description_305,"Let's take a look at ""refs"" (short for ""references"")! Refs are not objects, but rather very simple *pointers* to objects! They can help you keep track of what's where. +code +Code +download +content_copy +expand_less +`git update-ref -d refs/<имя_ссылки>` + +Удалите все ссылки! :P (Ну, кроме HEAD. HEAD - особенная.)" +refcreate_description_305,"Let's take a look at ""refs"" (short for ""references"")! Refs are not objects, but rather very simple pointers to objects! They can help you keep track of what's where. You can create or update a ref with - git update-ref refs/ +code +Code +download +content_copy +expand_less +git update-ref refs/ Make sure to always start a ref's name with ""refs/""! That's a convention that helps Git find all refs you create. If you forget the ""refs/"", you will not see the ref. -Create refs that point to all objects in this repository!", -problems_title_306,Problems, -problems_description_307,"Both you and your friend have been working on the file, and want to sync up!", -problems_win_hint_308,Commit your local changes., -friend_title_309,Friend, +Create refs that point to all objects in this repository!","Давайте посмотрим на ""ссылки"" (сокращенно от ""references"")! Ссылки - это не объекты, а скорее очень простые указатели на объекты! Они могут помочь вам отслеживать, что где находится. + +Вы можете создать или обновить ссылку с помощью + +code +Code +download +content_copy +expand_less +`git update-ref refs/<имя_ссылки> <новое_значение>` + +Убедитесь, что имя ссылки всегда начинается с ""refs/""! Это соглашение, которое помогает Git находить все созданные вами ссылки. Если вы забудете ""refs/"", вы не увидите ссылку. + +Создайте ссылки, которые указывают на все объекты в этом репозитории!" +problems_title_306,Problems,Проблемы +problems_description_307,"Both you and your friend have been working on the file, and want to sync up!","И вы, и ваш друг работали над файлом и хотите синхронизироваться!" +problems_win_hint_308,Commit your local changes.,Закоммитьте ваши локальные изменения. +friend_title_309,Friend,Друг friend_description_310,"Your friend added another line to your essay! Get it, add a third one and send it to them! -Take turns until you have five lines!", -friend_win_hint_311,Got the second line from your friend, -friend_win_hint_312,Got the fourth line from your friend., -card_init_desc_313,Drag this card into the empty space above to initialize the time machine!, -card_clone_desc_314,Create your own copy of someone else's repo., +Take turns until you have five lines!","Ваш друг добавил еще одну строку в ваше эссе! Получите ее, добавьте третью и отправьте ему! + +Делайте это по очереди, пока у вас не будет пяти строк!" +friend_win_hint_311,Got the second line from your friend,Получил вторую строку от друга, +friend_win_hint_312,Got the fourth line from your friend.,Получил четвертую строку от друга. +card_init_desc_313,Drag this card into the empty space above to initialize the time machine!,Перетащите эту карту в пустое пространство выше, чтобы инициализировать машину времени! +card_clone_desc_314,Create your own copy of someone else's repo.,Создайте свою собственную копию чужого репозитория. card_configname_desc_315,"Set your name. -(Will not change anything outside of this game.)", -card_configemail_desc_316,Set your email address., -card_checkout_desc_317,Drag this card to a commit or to a branch to travel to it!, -card_checkoutfile_desc_318,Reset changes in a local file., -card_checkoutfrom_desc_319,"Get the file contents from the specified commits, and reset both the working directory, as well as the index, to it.", +(Will not change anything outside of this game.)","Установите свое имя. + +(Ничего не изменит вне этой игры.)" +card_configemail_desc_316,Set your email address.,Установите свой адрес электронной почты. +card_checkout_desc_317,Drag this card to a commit or to a branch to travel to it!,Перетащите эту карту на коммит или на ветку, чтобы переместиться к ней! +card_checkoutfile_desc_318,Reset changes in a local file.,Сбросить изменения в локальном файле. +card_checkoutfrom_desc_319,"Get the file contents from the specified commits, and reset both the working directory, as well as the index, to it.","Получить содержимое файла из указанных коммитов и сбросить к нему как рабочий каталог, так и индекс." card_commita_desc_320,"Make a new commit, after automatically adding all changes to the index. -You'll be asked to enter a short description of what you changed.", -card_commitauto_desc_321,Make a new commit containing your current environment! Type in a description of what changed!, -card_merge_desc_322,"Merge the specified timeline into yours. If necessary, will create a merge commit.", -card_mergeabort_desc_323,"Abort the current merge attempt, and reconstruct the previous state.", -card_rebase_desc_324,Put the events in your current timeline on top of the specified one., -card_pull_desc_325,"Get someone else's version of the current timeline, and try to merge it into yours.", -card_fetch_desc_326,Get a someone else's version of the current timeline., -card_push_desc_327,Give the current timeline to someone else., -card_rebaseinteractive_desc_328,"Make changes to the events in your current timeline, back to the commit you drag this to.", -card_rebasecontinue_desc_329,Continue the current rebasing process., -card_resethard_desc_330,Move the branch you're on to the specified commit., -card_reset_desc_331,"Jump to the commit, and update the index. Keep the current environment.", -card_resetfile_desc_332,Reset the index version of a file to the version in the commit you're on., -card_cherrypick_desc_333,Repeat the specified action on top of your current timeline., -card_revert_desc_334,Make a new commit that reverts the changes of the specified commit., -card_bisectstart_desc_335,Start looking for the commit where things got bad., -card_bisectgood_desc_336,"State that the current commit is good! When you're automatically transferred, keep playing the `good` and `bad` cards!", -card_bisectbad_desc_337,"State that the current commit is bad! When you're automatically transferred, keep playing the `good` and `bad` cards!", -card_add_desc_338,Update the index version of the file to its current real content., -card_rm_desc_339,"Delete a file both in the working directory, as well as the index.", -card_commit_desc_340,Make a commit from the current index., -card_show_desc_341,Show what changed in the commit., -card_branch_desc_342,Create a new branch at your current location., -card_branchdelete_desc_343,Delete a branch., -card_reflog_desc_344,Display a log of where the ref pointed to in the past., -card_filenew_desc_345,Create a new file., -card_filedelete_desc_346,Delete a file., -card_filerename_desc_347,Rename a file., -card_filecopy_desc_348,Make a copy of a file., -cli_remote_001,"To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice.", -cli_commit_002,"Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below!", -cli_commit_003,"This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :)", -cli_cli_004,"But there's another way to interact with Git:", -cli_cli_005,"Try typing `git init` into the black terminal below, and pressing the enter key!", -cli_new_006,"You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time!", -cli_grow_007,"To travel to a branch, type `git checkout name_of_the_branch`.", -cli_grow_008,"And to travel to the last commit, type `git checkout --detach name_of_the_branch`.", -cli_branchcreate_009,"Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called ""birthday"", you can type `git checkout birthday` to travel to it!", -cli_fork_010,"The blue animal represents a concept known as the ""HEAD pointer"" in Git: It shows you which commit is the current one.", -cli_fork_011,"Here's a cool trick to go to the previous commit:", -cli_fork_012,"`git checkout HEAD^`", -cli_fork_013,"You can also go back two commits by typing, for example:", -cli_fork_014,"`git checkout HEAD~2`", -cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want!", -cli_checkoutcommit_016,"This will insert the commit's unique identifier!", -cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:", -cli_filesdelete_018," `rm *web`", +You'll be asked to enter a short description of what you changed.","Сделайте новый коммит, автоматически добавив все изменения в индекс. +Вас попросят ввести краткое описание того, что вы изменили." +card_commitauto_desc_321,Make a new commit containing your current environment! Type in a description of what changed!,Сделайте новый коммит, содержащий ваше текущее окружение! Введите описание того, что изменилось! +card_merge_desc_322,"Merge the specified timeline into yours. If necessary, will create a merge commit.","Слейте указанную временную линию в свою. При необходимости будет создан коммит слияния." +card_mergeabort_desc_323,"Abort the current merge attempt, and reconstruct the previous state.","Прервать текущую попытку слияния и восстановить предыдущее состояние." +card_rebase_desc_324,Put the events in your current timeline on top of the specified one.,Поместите события из вашей текущей временной линии поверх указанной. +card_pull_desc_325,"Get someone else's version of the current timeline, and try to merge it into yours.","Получите чужую версию текущей временной линии и попробуйте слить ее со своей." +card_fetch_desc_326,Get a someone else's version of the current timeline.,Получить чужую версию текущей временной линии. +card_push_desc_327,Give the current timeline to someone else.,Передайте текущую временную линию кому-нибудь еще. +card_rebaseinteractive_desc_328,"Make changes to the events in your current timeline, back to the commit you drag this to.","Внесите изменения в события вашей текущей временной линии, вплоть до коммита, на который вы перетащите это." +card_rebasecontinue_desc_329,Continue the current rebasing process.,Продолжить текущий процесс перебазирования. +card_resethard_desc_330,Move the branch you're on to the specified commit.,Переместите ветку, на которой вы находитесь, к указанному коммиту. +card_reset_desc_331,"Jump to the commit, and update the index. Keep the current environment.","Перейти к коммиту и обновить индекс. Сохранить текущее окружение." +card_resetfile_desc_332,Reset the index version of a file to the version in the commit you're on.,Сбросить версию файла в индексе до версии в коммите, на котором вы находитесь. +card_cherrypick_desc_333,Repeat the specified action on top of your current timeline.,Повторите указанное действие поверх вашей текущей временной линии. +card_revert_desc_334,Make a new commit that reverts the changes of the specified commit.,Создайте новый коммит, который отменяет изменения указанного коммита. +card_bisectstart_desc_335,Start looking for the commit where things got bad.,Начать поиск коммита, в котором все пошло не так. +card_bisectgood_desc_336,"State that the current commit is good! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит хороший! Когда вас автоматически перенесут, продолжайте играть картами good и bad!" +card_bisectbad_desc_337,"State that the current commit is bad! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит плохой! Когда вас автоматически перенесут, продолжайте играть картами good и bad!" +card_add_desc_338,Update the index version of the file to its current real content.,Обновите версию файла в индексе до его текущего реального содержимого. +card_rm_desc_339,"Delete a file both in the working directory, as well as the index.","Удалить файл как в рабочем каталоге, так и в индексе." +card_commit_desc_340,Make a commit from the current index.,Сделать коммит из текущего индекса. +card_show_desc_341,Show what changed in the commit.,Показать, что изменилось в коммите. +card_branch_desc_342,Create a new branch at your current location.,Создать новую ветку в вашем текущем местоположении. +card_branchdelete_desc_343,Delete a branch.,Удалить ветку. +card_reflog_desc_344,Display a log of where the ref pointed to in the past.,Отобразить журнал того, куда указывала ссылка в прошлом. +card_filenew_desc_345,Create a new file.,Создать новый файл. +card_filedelete_desc_346,Delete a file.,Удалить файл. +card_filerename_desc_347,Rename a file.,Переименовать файл. +card_filecopy_desc_348,Make a copy of a file.,Сделать копию файла. +cli_remote_001,"To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice.","Чтобы вернуться к старым командам, вы можете нажимать стрелки вверх и вниз. Таким образом, вам не придется дважды вводить длинные команды." +cli_commit_002,"Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below!","Опять же, вместо использования карты, вы также можете вводить команды, напечатанные на ней, в черный терминал ниже!" +cli_commit_003,"This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :)","Это совершенно необязательно! Но это будет суперполезный навык в реальном мире - и он даст вам сверкающий золотой значок! :)" +cli_cli_004,"But there's another way to interact with Git:","Но есть и другой способ взаимодействия с Git:" +cli_cli_005,"Try typing git init into the black terminal below, and pressing the enter key!","Попробуйте набрать git init в черном терминале ниже и нажать клавишу Enter!" +cli_new_006,"You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time!","Вы можете использовать автодополнение по Tab в терминале! Начните вводить имя файла, затем нажмите клавишу Tab, чтобы дополнить его имя. Это часто сэкономит вам время!" +cli_grow_007,"To travel to a branch, type `git checkout name_of_the_branch`","Чтобы переместиться на ветку, введите `git checkout имя_ветки`" +cli_grow_008,"And to travel to the last commit, type `git checkout --detach name_of_the_branch`","А чтобы переместиться к последнему коммиту, введите `git checkout --detach имя_ветки`." +cli_branchcreate_009,"Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called ""birthday"", you can type `git checkout birthday` to travel to it!","Ветки также значительно упрощают перемещение между разными местами с помощью командной строки! Как только у вас появится ветка с именем ""birthday"", вы сможете набрать `git checkout birthday`, чтобы переместиться на нее!" +cli_fork_010,"The blue animal represents a concept known as the ""HEAD pointer"" in Git: It shows you which commit is the current one.","Синее животное представляет собой концепцию, известную в Git как ""указатель HEAD"": он показывает вам, какой коммит является текущим." +cli_fork_011,"Here's a cool trick to go to the previous commit:","Вот крутой трюк, чтобы перейти к предыдущему коммиту:" +cli_fork_012,"`git checkout HEAD^`","`git checkout HEAD^`" +cli_fork_013,"You can also go back two commits by typing, for example:","Вы также можете вернуться на два коммита назад, набрав, например:" +cli_fork_014,"`git checkout HEAD~2`","`git checkout HEAD~2`" +cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want!","Чтобы переключиться на определенный коммит, введите `git checkout`, затем пробел, а затем щелкните правой кнопкой мыши по нужному коммиту!" +cli_checkoutcommit_016,"This will insert the commit's unique identifier!","Это вставит уникальный идентификатор коммита!" +cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:","В командной строке вы можете легко удалить все файлы, заканчивающиеся на -web, с помощью этой команды:" +cli_filesdelete_018," `rm *web`"," `rm *web`" diff --git a/translations.en.translation b/translations.en.translation index d01cad1338928b656f1e7b1f6e328145748fcb78..029a9dcf4e4fa66fcd7154f9be38176afa6f0b30 100644 GIT binary patch literal 1077 zcmbtUT}u>U6h1qextnDcq!)ecqKIpheL#dR!TOPgA6vT{nwZ^aX18;wPq z$cX}Q5x`sq9B&h5DsG63sR>KfGm!o-icwwx7>cQ94OvNOx-7JWr6){T$tbjG^<72` zE98YTteB=4R7_frWVu424LGJSUBVJcO`(lQlUX^fSdPHIWLk!r8C)qdWkVgYAQE{1 zAF$l1zOHURm9T_Zb7wZA5by)#07o9dMwK|{Ee`W;JDqct!?oZL&Sf=)pMtd9n|F0}PV**)N`BD*E(%4*ajL>321qqig81m+tP_4V~Yn6kxA- z=LKM*Z<|eatU45`t(>+4l=sv`KHdtS={3WN_W534-V>w_<(#6KWH(<8|B%ARA{9QA zM2v>go+H__CSeSi z0g9_50g9yjoumF%)e2Bl(R4Ae(!^V+ot)wZF_9Ta>KDlFk`^nwb&PtD_EDpd({v)M cS~T9@Ers6xveRT&_fL9DVm4NyDE=`10-?&-wEzGB literal 32601 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 diff --git a/translations.ru.translation b/translations.ru.translation index 715496aa8db039147c113bbef1ab287518c730bd..6d636f2cdf103073d26211e413ecc0ebcf4d1b67 100644 GIT binary patch literal 1392 zcmbtUTSydP6#mmPEeov3BBk}@^u>x*$RJ$CZE#1|*_s)Vf?(IJq+Akw zNGQ4&RAg-Gw(GT^hkWRA{^ua*LN7r<4?TpeeP@~}(H??k`S$$hn{)Zj`Iq%K`1cC; z$%V}W*cJf?>r^Y$XsU)4R&70Efcn2DAL;7=Q?nwSW>5=+BSAGBupBa-V7q3!1b4D*Q#V?FrCC8!KW2jz zViB+ma4J<*RO}RmOyT+K%!~1Y7qY~)W~X3E0g3^BX7TXe3f=Q6*YcPE!E#Fl;Kj2>DiCV|cuLy8Yf8IJ_8!$B&e?on8xvXJdH$ zon7NK18`P@V|e_#+g}=A!N~!~@c5#SpAW-bP~W^fQ`LbWo{Pb|;hZDoHEKWXZWk5G z%?#_}B8>ATFQ=zry}W2{@O3Q`=j)&OFT{TJ^v{ebnv@AqDRy`*a2eRN?3HKu gPQ`34@2mMxPW7{|*>;iL(mYU5*pS6ojhpVJ%MqyPW_ literal 10008 zcmdU#dsvNW7shu=Qz4xsF(jeVNhlMdoN^{5(nuFHzK}BRD3Pt3U!w^&7dYgC6cVBZo-(TNfvoH6x*7`m7TF>*oyIp%1 in74k!! zq9#d-`lQJo0jdx$Wk9$pEFf}zL^z@U@1aHQCM0FBDk4f580;Sw5f~8W9~t4V3JeYp zR_Nkdc)-G7g*K6e!75e2ykM2$6DnFdf)#Bj4WZNdM+VFZ3s$tFa!yp>g5XFQNIR(_ zmGi^r{ne%lRL)-%Nl>9sBk7P@Cb`(#_f@o&5Iuy~tU(LX4QVY$Wt2ifW~B9UpLEZf z|M6%`%$U@LWKOaq*^vg4(CSLH2e65hdy#xevq|Wk3-uz(SCV377Dq9Gw3C!d;=V(a z|47Q0*;!aCf?V>KP<;bf73I%J??|oaT6v}x<;Em4nf0P*Bj=8CWUmwl5_2VuCwap9 zbUB|zF^CjSiYBcjNqw;tzU5-a6X32RD#eC8wx#l@nsjec`lHUDeP4ei_*R39j{Zcfh+D2whavV(2UCzf- z^p*436vO3Q>W!p)87UT+#N((=CZ&@Oz}hj&b4dB5v%rfeFCpC^-3Bhrx<_?Asga~b zFEm|}#EmGL%DGfa4@;^YNrPoRmZBHQmo!^uk}s6lyd2@ zm+Aw+vgABRjs+A8Nmoc^qzY0M>96kQ=32^MklvC$k__m32(Ot?-j!rQvIgFta(9x4 z%seUjk>-%XNJ>&PiRb(?uB5eC(l$~uDV=nHlubHIlKe$-ETdRKsv^~rUXwKGn^{|u zzk)xDnQJzOC zkXa$cD{@{Y#|k-0{wg`IrTCiENNP(zB&0Qb7!WfdbtPHI>(&$<mr@GBN$-bvKKni=-(cX^$!7>P`v;Y^kJ$vA&llv@ zIH^5wd$aVMc&IlR8~r&$aK63OiJwUC6?y*A6+3O~pk^N3D%*Jl^fMpZL7D9@;NytT z6U;gOtoYsM0{-onCRK}p^L3s7>V2yW;C0$_59q;u=JvA>-Gg;L*E8}d1>CONqeIer zPxf)tfAC~RvA|zZv_NSKety1kbUiNg1i!UTbNK*)@8KS;mQNSF&*Q3G<6h9mJa=aQ zU)=@#r!!CLf(1OPSA`-AIG=0D@!Pg1fQL`c{`PyQc|WUR(eB#>T?0;6= zx6)bQ-@NK|=0o6oj@oTLKA!=9{4TLN2x^}Dg!pdY+`mS7Y}XFpkH{AxI9IC;;hC1e zxqqVVZ;LxXzdHHMq2~S7h}%FvbCZz6?{9;j=hiQ~X`Bo^VcCtCYN+XLTFckgQ}XQs z9&l`8R3F&qpr`)YFsMDR`FS?r(j$ob-@fhHIz46A$Qzk&a7x|_^&FAzc?gO09vxWMl&!p_@_(=Qp0;sEEZQqWB zec4w{ytRN|xc07C2m0CX@}Rt|jlkb!mSM+6f#20@udao_Ka{xi8J6dA976nwfZyqp z^Fm9&RTIw!m*M+49An)GfW)ReZ|yMhV(&PfT^9E~&{ z4*f=Ot{<&JV^e|i*UyPb$J=C4){EPes&JSY9s z7Q0Ts^Rk_SmO(wImCNrTFsJuw+gGNr&gX2?`pPR0@G;jSJ{Gw28ADo&IPq{YKetl7 zrrtP^&m`6BDx6d1$X=;#R~wf{;qT`ovg`IsZnPk+N#a=$~QaH$D;r4cWK0uPoSTl=bJtAT*iQJhlagJF!(fnv8w$O*7-bl zjCXBr3qGC~Gr_s#cW~@WeH>yiAABd?8r2v<&Ay_Q4{xRm_UX2xU`0pZe0^C4zX#IC z(7&&5Nu_JiAi>=Eq06j3f{)L+dwpm>BjBNdrNK^6_c`kw;R5q`U(40HU(N=fW8vDA zkx=vXtW#~9BmJ(8YmVOK>Ms@o=eb3>cM335p+uSGU>=7+w5b>_CjvjzO+ z=7XnV1-#w7&ueOd^Zr-WdPi!)e$BfU9UTq6RqdT$r$Np4MfF+qq@~a|ChcUpA=K>i z?=@o>fA67Xg*lyjF8KHy-XnZgIlw*zSDfNsL*0Y={GjIf)fvycHUsZYzCWOr_LTIc zNql=V*q8YakAr?*0)C#G7|?x*9`K1;xwpDP&HXh4{xqB`;6V*$ZoLKjsfwG%B?|nt z(VKRS5co|Goz7S!;AfYe>Ff=2_}u#)b4NclmLc%dd@y=}B6bfWNdlKEMX*i#z(c{s#3{hu(*OqS{baMxkEW zP*~@4IQwcYcqZVA^}~mF3HYU;Qq^PuKinfQMEbi6&*l4Z{mnNg=Yv1VVf&dL;N#c# zwMtWiK;S;^O*_^=Ur&oEnWJEx(w4pKmK@su27J7)=CfgL1Ar&czB8epeRmAgWJ-+|w4li`Z4;H&T4?xZcObKlVfHJy#XADU$w{|>cdQBT{2 zQ1ias>3$6Y&e!2J=&+?R@DH&z7pkD<{t1`W)cxRm%o_`vYI+Lz0sn@CeK3d5e|M0U z!+7xDSnVIsAL@`@d6BcAkKbDxrHASq1is!l(`Xs=ZSGJy@G`6$K1^I|4eOM)JO^eA z#*CEy?#VUZhwF5XIl#XjWtZLt=CMCObChC=fIFm28>lPb-Je>Y9|)ZH>#{Yq?R4O| zD{UKw!~T4~?*06Bv8HP6?swz56~{NRKU`?@IAK?7_xjMJD=nZ_q1P#?H6|7a!D ziZO1tqM+vcF_h-i0N*g~M)`H9^f-xZ2{jx zbJ~mM*Ec`!27bP8_NQNtn+JZ4F?Z6ofRE47_L!f&1NgXqt;#3mJ@_AgwlcL7__%*# z_4Si>0{%x*M~x!rXMbzoTkod{{2v>eJFXM>dmnr8+*-hAZ8F@`S-?LwzRLE6`TYDX zE;sKq9Q-jAPgUCBJJomNwQ^YJ^LndWpS%N{zpl=E=&Csa_x?Wr>+MkI(7Yd@UfBQr zwGUA9{GZ7e0Ow#HzE98JU*IoroTB|wz^#8eqIKr=d30e9aIG<}#^=;i%!2Qdvb@&YCRu}xD z`~qse9|`8mF7OO#?@nfwZ(hM1P0FR$>ndsS-}xv>EXgX#DLGM+SsGuuru3^)>3zY! K@!?7TC+ Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 05/15] Add chapter labels to localization mechanism --- fonts/big.tres | 7 ++++--- scenes/level_select.gd | 3 ++- translations.csv | 13 +++++++++++++ translations.en.translation | Bin 1077 -> 1077 bytes translations.ru.translation | Bin 1392 -> 1392 bytes 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/fonts/big.tres b/fonts/big.tres index 10db4a6d..d07b14e5 100644 --- a/fonts/big.tres +++ b/fonts/big.tres @@ -1,9 +1,10 @@ [gd_resource type="DynamicFont" load_steps=2 format=2] -[ext_resource path="res://fonts/cabin-bold.ttf" type="DynamicFontData" id=1] +[sub_resource type="DynamicFontData" id=1] +font_path = "res://fonts/Moderustic-VariableFont_wght.ttf" [resource] -size = 45 +size = 38 use_mipmaps = true use_filter = true -font_data = ExtResource( 1 ) +font_data = SubResource( 1 ) diff --git a/scenes/level_select.gd b/scenes/level_select.gd index acd08669..7d8fae63 100644 --- a/scenes/level_select.gd +++ b/scenes/level_select.gd @@ -26,7 +26,8 @@ func reload(): var level_id = 0 var l = Label.new() - l.text = chapter.slug + var chapter_key = "chapter_" + chapter.slug + l.text = game.tr_custom(chapter_key) l.set("custom_fonts/font", preload("res://fonts/big.tres")) l.align = HALIGN_CENTER level_list.add_child(l) diff --git a/translations.csv b/translations.csv index 6bf1fdcc..4e816ab3 100644 --- a/translations.csv +++ b/translations.csv @@ -1548,3 +1548,16 @@ cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then cli_checkoutcommit_016,"This will insert the commit's unique identifier!","Это вставит уникальный идентификатор коммита!" cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:","В командной строке вы можете легко удалить все файлы, заканчивающиеся на -web, с помощью этой команды:" cli_filesdelete_018," `rm *web`"," `rm *web`" +chapter_intro,Introduction,Введение +chapter_files,Files,Файлы +chapter_branches,Branches,Ветви +chapter_merge,Merging,Слияние +chapter_index,The Index,Индекс +chapter_remotes,Remotes,Удалённые репозитории +chapter_changing-the-past,Changing the Past,Изменение прошлого +chapter_shit-happens,When Things Go Wrong,Когда всё идёт не так +chapter_workflows,Workflows,Рабочие процессы +chapter_bisect,Bisect,Поиск ошибки (Bisect) +chapter_stash,Stash,Тайник (Stash) +chapter_tags,Tags,Метки +chapter_sandbox,Sandbox,Песочница diff --git a/translations.en.translation b/translations.en.translation index 029a9dcf4e4fa66fcd7154f9be38176afa6f0b30..f047f2689c7074d9900ee141e32efd2273025d75 100644 GIT binary patch delta 512 zcmdnWv6W-PQbx(y3=9n1K+Froj8J^>fZj@m$@>_^CDni;TtLi&B)imTx2w_QcR*QI zpePd*!}JP1c^$cIvK*7RXD?8O4~PYUm<5PIDq^%;6NP~^2+IPozQUp%=|EZ@h*f~N zOXci|{Xkj>h$VoyfjRlS)#N%RamgJ(9y=7n>{@Xzb1nPibxh)#ZAh{p7lBkf+WF1h z6-a~Z5(nZ*>;649nEVc?Iu^(S`3mIk1wm`dBY-r>FCYvvJNvkXFW+Q6X7T#fKv7WW z@B=X$5QE%$5r_jzGfNl@7@QM}Qi>HBLNW^!8UFbfS@TEOl@`{2=H%pH5}5Ii;h&3{ zOp#45=RXExhTz1!l%)I$2LB8N-%17d%o0V0`nYf=o5Sz_Wi$L!i<{2L6a0_CDKQzy z^JDs@9G)-sk705WvwTocYEFJ)3d27iru;3OEIFYI{xbq?3t_Xi4zFI){EwkC2B`9% nOOxXpCPz_^B{P5`TtLi&B)imTx9hyg?|`zK zfTB!L4AU$4zKqfJCS5TE&{1|wDX($ zJ|GRUOB{$Nt^4XA0|o;rk(g+XIWi4;g=lhG0`NvkAn8dQ|f;B6}UpePC~ z9${!-+Gb02FSG;^^s%)#wI!WXPiXkvd(QuV&bjB->@~YtklZN=zz2U|2!yx^909O< zNpr_Bby_s+{orM27FZqa7PMrGhVA_LjBQ9PAZsHL)cj}@Dnccb{?Jr6-u)Im`flk7 zSNUNgO+Xm1WHz#JmF~f|ert?ffgehIc#S zLUJed_ayF)ut$!-=H9#%wM- z-~4Sdd4aXryey?mu!=g&;;PGGn_pkG2dlxSkK&@>?pc_v{I28|db5^P8;B!-?rBB=#eS From 9c7816d69df64adde566bef70b63b9deab582384 Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 06/15] Correct scripted formatting in the CSV file --- .~lock.translations.csv# | 1 + levels/index/change | 4 +- levels/remotes/friend | 4 +- levels/remotes/problems | 2 +- levels/shit-happens/pushed-something-broken | 4 +- scenes/game.gd | 3 +- translations..translation | Bin 0 -> 2194 bytes translations.csv | 2880 +++++++++---------- translations.csv.import | 4 +- translations.en.translation | Bin 1077 -> 3977 bytes translations.ru.translation | Bin 1392 -> 7368 bytes 11 files changed, 1328 insertions(+), 1574 deletions(-) create mode 100644 .~lock.translations.csv# create mode 100644 translations..translation diff --git a/.~lock.translations.csv# b/.~lock.translations.csv# new file mode 100644 index 00000000..1b6d67cd --- /dev/null +++ b/.~lock.translations.csv# @@ -0,0 +1 @@ +,fedor,i5-10210u-a87748,14.11.2025 19:57,file:///home/fedor/.config/libreoffice/4; \ No newline at end of file diff --git a/levels/index/change b/levels/index/change index ebbe1256..97af008f 100644 --- a/levels/index/change +++ b/levels/index/change @@ -7,7 +7,7 @@ change_description_059 [win] -Good! The index is sometimes also called the "staging area" - it contains exactly what ends up in the next commit when you use `git commit`! +change_win_060 [setup] @@ -17,7 +17,7 @@ git commit -m "The beginning" [win] -# Make a change to the candle. +# new_win_hint_085 test "$(git diff --name-only)" = "candle" || file -f .git/candle-changed && touch .git/candle-changed # new_win_hint_083 diff --git a/levels/remotes/friend b/levels/remotes/friend index 8fb3ac0f..3ec5062f 100644 --- a/levels/remotes/friend +++ b/levels/remotes/friend @@ -38,8 +38,8 @@ git show HEAD:essay | grep blurbblubb [win friend] -# The friend got a third line from you +# friend_win_hint_313 test "$(git show HEAD:essay | wc -l)" -ge 3 -# The friend got a fifth line from you +# friend_win_hint_314 test "$(git show HEAD:essay | wc -l)" -ge 5 diff --git a/levels/remotes/problems b/levels/remotes/problems index ccede0f9..05664ff2 100644 --- a/levels/remotes/problems +++ b/levels/remotes/problems @@ -29,5 +29,5 @@ test "$(git status -s)" = "" [win friend] -# Look at your friend's suggestion, make a compromise, and push it back. +# problems_win_hint_309 git rev-parse main^ && test "$(git rev-parse main^1^)" = "$(git rev-parse main^2^)" diff --git a/levels/shit-happens/pushed-something-broken b/levels/shit-happens/pushed-something-broken index 9b014c26..c91c8762 100644 --- a/levels/shit-happens/pushed-something-broken +++ b/levels/shit-happens/pushed-something-broken @@ -48,7 +48,7 @@ git branch -u team/main main [win team] -# The team's main branch no longer contains the bad thing. +# pushed_win_hint_1 ! { git show main:text | grep -q "very bad"; } -# And the history has not been modified. +# pushed_win_hint_2 git show main^:text | grep -q "very bad" diff --git a/scenes/game.gd b/scenes/game.gd index 2e82faf9..3cb497b9 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -13,7 +13,7 @@ var current_level = 0 var skipped_title = false var translations = {} -var current_locale = "ru" +var current_locale var _file = "user://savegame.json" var state = {} @@ -34,7 +34,6 @@ func _ready(): if OS.get_name() == "Windows": start_remote_shell() global_shell = new_shell() - # var cmd = global_shell.run("echo hi") # print(cmd) # cmd = global_shell.run("seq 1 10") diff --git a/translations..translation b/translations..translation new file mode 100644 index 0000000000000000000000000000000000000000..70b9febbc3fd675ecd9bd3fea23e454463c9e49d GIT binary patch literal 2194 zcmbuBc}Ns-6vs#1%q*=evn*-@ixhRsfQJOGNUa67wTedo+>+{X+nqUo+Ekm{ zzRm+sk^(@XApc6q7RwB27$O*k$83TLJRyTX{yGF^kPP|-1I+Ju<}e>79ODRx@qi}^ z79%_ke7cCSE*atlEJyaQv6$6mLTnZJI>y(FxCDHMh%1Fx3$Ft|BVyWCqsT9SdqJ(B zTcCDO2dESD9`qH2JwL#Iir55aClo|$_4g45bJ4)ej8A1T?~ezbBH7@0-j;ZF zrvdNl{S{Tnc%X9ndQV^U-`adn*q1D$gWRW zfd5+GVm|4`rxk6Fys0W6bQj}v94|wj1r#vuT3Hh^g5{@cR~6vHm)0TQ6Z7!ia06Zv zWP7xoar%Aic}21Ke5C%a7adunSWb2INxqaK#@|BS7?x9iSbXlru?BpbT5a88z)fkL zC-5yn{p8lbd5Od8Vl(KgN*iL)R_B0#jO5PY~FU7qh9p%hXFy+td8dHRQ3c$FpkGG33LE7 z&@gLPwN~w-c1deC>!sQa&8wGbEoSY48RBNWL~GW3@M+O}dZl(>>, <<<, and === markers, and make a new commit to finalize the merge! - -Let your finalized timeline be the ""main"" one.","Иногда временные линии противоречат друг другу. - -Например, в данном случае один из наших клиентов хочет слить эти временные линии, но в обеих он ел разные вещи на завтрак. - -Попробуйте слить их! Вы заметите, что возникнет конфликт! Машина времени оставит решение за вами: вы можете отредактировать проблемный элемент, она покажет вам конфликтующие разделы. Вы можете сохранить любую из двух версий или создать их комбинацию! Удалите маркеры >>>, <<< и === и сделайте новый коммит для завершения слияния! - -Пусть ваша окончательная временная линия будет ""main"". -" -conflict_congrats_047,"Yum, that sounds like a good breakfast!","Мм, звучит как хороший завтрак!" -conflict_win_hint_048,Make a breakfast compromise in the 'main' branch.,Найдите компромисс по завтраку в ветке 'main'. -mergeabort_title_049,Abort a merge,Прервать слияние -mergeabort_description_050,"Sometimes you want to merge two commits, but a merge conflict occurs that you currently don't want to resolve. - -In these situations you can abort the merge to merge later. Use -git merge --abort -when you are in a merge process. - -Try to merge both commits and abort the merge afterwards.","Иногда вы хотите слить два коммита, но возникает конфликт слияния, который вы в данный момент не хотите разрешать. - -В таких ситуациях вы можете прервать слияние, чтобы выполнить его позже. Используйте -git merge --abort -когда вы находитесь в процессе слияния. - -Попробуйте слить оба коммита, а затем прервать слияние." -mergeabort_congrats_051,"Aaah, let's merge later...","Ааа, давайте сольём позже..." -mergeabort_win_hint_052,You tried to merge?,Вы пытались выполнить слияние? -mergeabort_win_hint_053,You aborted to merge?,Вы прервали слияние? -reset_title_054,Resetting files in the index,Сброс файлов в индексе -reset_description_055,"See the dark shadow behind the icons? That's the version of the file in the last commit! - -For example, these candles have been blown out, and that change has been added. - -But you decide that this was a mistake! You only want to blow out the red candle in the next commit! - -If you already have updated the index to a changed file, but want to reset it, you can use git reset!","Видите тёмную тень за иконками? Это версия файла в последнем коммите! - -Например, эти свечи были задуты, и это изменение было добавлено. - -Но вы решаете, что это была ошибка! Вы хотите задуть только красную свечу в следующем коммите! - -Если вы уже обновили индекс изменённым файлом, но хотите сбросить его, вы можете использовать git reset!" -reset_win_hint_056,Reset the changes in the green and blue candles!,Сбросьте изменения в зелёной и синей свечах! -reset_win_hint_057,And make a commit!,И сделайте коммит! -change_title_058,Update files in the index,Обновление файлов в индексе -change_description_059,"When we change files, the index won't change on its own. We have to use git add to update the index to the changed version of the file. - -Let's try that! - -The icons in the file browser show you when the actual file (white) and the version in the index (blue) are different, and when they are the same!","Когда мы меняем файлы, индекс сам по себе не изменится. Мы должны использовать git add, чтобы обновить индекс до изменённой версии файла. - -Давайте попробуем! - -Иконки в файловом браузере показывают, когда фактический файл (белый) и версия в индексе (синий) отличаются, и когда они одинаковы!" -rm_title_060,Delete a file in the next commit,Удалить файл в следующем коммите -rm_description_061,"If you want to remove a file in the next commit, you can use git rm! This will both delete the file locally, and in the index. - -If a file is modified, you'll need to reset these changes first/reset the files.","Если вы хотите удалить файл в следующем коммите, вы можете использовать git rm! Это удалит файл как локально, так и в индексе. - -Если файл изменён, вам нужно сначала сбросить эти изменения/сбросить файлы." -rm_win_hint_062,Make a commit where all files are deleted ¯_(^^)/¯,Сделайте коммит, в котором удалены все файлы ¯_(^^)/¯ -steps_title_063,Adding changes step by step,Добавление изменений шаг за шагом -steps_description_064,"The index is really useful, because it allows us to be precise about which changes we want to include in each commit!","Индекс действительно полезен, потому что он позволяет нам точно определять, какие изменения мы хотим включить в каждый коммит!" -steps_win_hint_065,"Make changes to all three objects, to form a logical sequence of events!","Внесите изменения во все три объекта, чтобы сформировать логическую последовательность событий!" -steps_win_hint_066,Only add one of these changes!,Добавьте только одно из этих изменений! -steps_win_hint_067,And make a commit.,И сделайте коммит. -steps_win_hint_068,Make a second commit that only records a single change.,Сделайте второй коммит, который фиксирует только одно изменение. -steps_win_hint_069,And a third one.,И третий. -compare_title_070,Step by step,Шаг за шагом -compare_description_071,"Welcome to today's lesson! We're going to learn how to make commits with more precision! - -Have a look at these two timelines. They have exactly the same outcome. But one of them makes it much easier to figure out what happened.","Добро пожаловать на сегодняшний урок! Мы научимся делать коммиты с большей точностью! - -Взгляните на эти две временные линии. У них абсолютно одинаковый результат. Но одна из них значительно облегчает понимание того, что произошло." -compare_win_hint_072,Right! Having each change in its own commit makes it easier to understand what's going on! Let's learn how to do that!,Верно! Наличие каждого изменения в собственном коммите облегчает понимание происходящего! Давайте научимся это делать! -checkout_title_073,Checking out files from the index,Извлечение файлов из индекса -checkout_description_074,"So you've made changes to your files, but you decide that you don't want to keep them! You can use git checkout for that! - -What happens if you have already update the index, like in file c? You have to reset the index first!","Итак, вы внесли изменения в свои файлы, но решили, что не хотите их сохранять! Для этого можно использовать git checkout! - -Что произойдет, если вы уже обновили индекс, как в файле c? Сначала нужно сбросить индекс!" -checkout_win_hint_075,Remove all changes in your local files!,Удалите все изменения в ваших локальных файлах! -add_title_076,Updating files in the index,Обновление файлов в индексе -add_description_077,"So you start working, and make changes to your files! Git lets you choose which of these changes you want to put in the next commit. This is like updating the index version of that file to the new version. - -This allows you to have smaller commits, that describe better what you changed! - -The command for this is the same - git add!","Итак, вы начинаете работать и вносите изменения в свои файлы! Git позволяет вам выбрать, какие из этих изменений вы хотите поместить в следующий коммит. Это похоже на обновление версии файла в индексе до новой версии. - -Это позволяет вам делать более мелкие коммиты, которые лучше описывают, что вы изменили! - -Команда для этого та же - git add!" -add_congrats_078,"Well done! Try travelling between the commits using git checkout, so you can look at their contents again!","Отлично! Попробуйте перемещаться между коммитами с помощью git checkout, чтобы снова посмотреть их содержимое!" -add_win_hint_079,Make changes to all files!,Внесите изменения во все файлы! -add_win_hint_080,"Add only the changes of a and c, and make a commit! Finally, make a commit which captures the changes in b!","Добавьте только изменения файлов a и c и сделайте коммит! Наконец, сделайте коммит, который зафиксирует изменения в файле b!" -new_title_081,Add new files to the index,Добавление новых файлов в индекс -new_description_082,"So far, when we made a commit, we've always recorded the current status of all objects, right? - -But Git allows you to pick which changes you want to put in a commit! - -To learn how that works, we need to learn about the ""index""! In the index, we can prepare what will be in the next commit. In this game, the index is represented by a blue aura around icons in the file browser! - -Initially, the index is empty. To make a commit that contains a new file, we need to add it!","До сих пор, когда мы делали коммит, мы всегда записывали текущее состояние всех объектов, верно? - -Но Git позволяет вам выбирать, какие изменения вы хотите поместить в коммит! - -Чтобы узнать, как это работает, нам нужно узнать об ""индексе""! В индексе мы можем подготовить то, что будет в следующем коммите. В этой игре индекс представлен синей аурой вокруг иконок в файловом браузере! - -Изначально индекс пуст. Чтобы сделать коммит, содержащий новый файл, нам нужно его добавить!" -new_win_hint_083,Add the candle.,Добавьте свечу. -new_win_hint_084,Make a commit.,Сделайте коммит. -checkoutcommit_title_085,Moving111 through time,Перемещение во времени -checkoutcommit_description_086,"The yellow boxes are frozen points in time, we call them ""commits""! You can travel between them using the ""checkout"" card! (Try it!) - -Can you find out what happened here? Then, while on the last commit, edit the files to fix the problem, and make a new commit!","Желтые ящики - это застывшие моменты времени, мы называем их ""коммитами""! Вы можете путешествовать между ними, используя карту ""checkout""! (Попробуйте!) - -Сможете ли вы выяснить, что здесь произошло? Затем, находясь на последнем коммите, отредактируйте файлы, чтобы исправить проблему, и сделайте новый коммит!" -checkoutcommit_congrats_087,"Wonderful! Now that you're getting familiar with the time machine, let's look at some more complicated situations...","Замечательно! Теперь, когда вы осваиваетесь с машиной времени, давайте рассмотрим несколько более сложных ситуаций..." -checkoutcommit_win_hint_088,Restore sisterly peace.,Восстановите сестринский мир. -branchcreate_title_089,Creating branches,Создание веток -branchcreate_description_090,"You were invited to two parties! At one of them, your favorite band is playing - and the other one is your best friend's birthday party. Where should you go? No worries - as a time travel agent in training, you can go to both parties! - -To make it easier to tell which timeline is which, you can create time portals! (We call these ""branches"".)","Вас пригласили на две вечеринки! На одной из них играет ваша любимая группа, а другая — день рождения вашего лучшего друга. Куда пойти? Не беспокойтесь — как стажер-агент по путешествиям во времени, вы можете пойти на обе вечеринки! - -Чтобы было легче различать временные линии, вы можете создавать временные порталы! (Мы называем их ""ветками"".)" -branchcreate_congrats_091,"Now you can travel between those branches easily (using git checkout) - try it! - -Your friend is happy that you made it to the birthday party and you also got your concert ticket signed. Yay!","Теперь вы можете легко перемещаться между этими ветками (используя git checkout) - попробуйте! - -Ваш друг рад, что вы пришли на день рождения, и вы также получили автограф на билете на концерт. Ура!" -branchcreate_win_hint_092,Create a branch called 'birthday' that points to the birthday timeline.,Создайте ветку с именем 'birthday', которая указывает на временную линию дня рождения. -branchcreate_win_hint_093,Create a branch called 'concert' that points to the concert timeline.,Создайте ветку с именем 'concert', которая указывает на временную линию концерта. -grow_title_094,Branches grow with you!,Ветки растут вместе с вами! -grow_description_095,"Note that there are two options to ""travel to the end of a timeline"": - -First, you can directly travel to the commit, like we've done it before. - -And second, you can travel to the branch label. In this case, when you make a new commit, the branch will grow with you, and still point at the end of the timeline!","Обратите внимание, что есть два варианта ""переместиться в конец временной линии"": - -Во-первых, вы можете напрямую переместиться к коммиту, как мы делали это раньше. - -И во-вторых, вы можете переместиться к метке ветки. В этом случае, когда вы делаете новый коммит, ветка будет расти вместе с вами и по-прежнему указывать на конец временной линии!" -grow_win_hint_096,"Travel directly to the last yellow commit of the birthday timeline, make a change to 'you', and make a commit","Переместитесь напрямую к последнему желтому коммиту временной линии дня рождения, внесите изменение в 'you' и сделайте коммит" -grow_win_hint_097,"Travel to the blue 'concert' branch, make a change to 'you', and a commit.","Переместитесь к синей ветке 'concert', внесите изменение в 'you' и сделайте коммит." -reorder_title_098,Moving branches around,Перемещение веток -reorder_description_099,"One of your colleagues messed up here, and put the branches in the wrong timelines! - -You could delete and re-create these branches - but you can also directly move them to different commits, by using - - `git checkout` - -on the branch names, and then using - - `git reset --hard` - -on the commit where you want the branch to be. - -The donut branch is in the right place, but the timeline is still incomplete - make you actually eat the donut in that branch!","Один из ваших коллег здесь напутал и поместил ветки в неправильные временные линии! - -Вы могли бы удалить и заново создать эти ветки, но вы также можете напрямую переместить их в другие коммиты, используя - - git checkout - -на именах веток, а затем используя - - git reset --hard - -на коммите, где вы хотите, чтобы была ветка. - -Ветка с пончиком находится в правильном месте, но временная линия все еще неполная - убедитесь, что вы действительно съели пончик в этой ветке!" -reorder_win_hint_100,Did you eat a baguette on the baguette branch?,Вы съели багет на ветке "багет"? -reorder_win_hint_101,Did you drink a coffee on the coffee branch?,Вы выпили кофе на ветке "кофе"? -reorder_win_hint_102,Did you eat a donut on the donut branch?,Вы съели пончик на ветке "пончик"? -fork_title_103,Make parallel commits,Делайте параллельные коммиты -fork_description_104,"Did you know that creating parallel timelines is perfectly legal and safe? It's true! - -Can you find out when things went wrong in this zoo? Then, go back to the last good commit and create a parallel universe where everyone is happy!","Знаете ли вы, что создание параллельных временных линий совершенно законно и безопасно? Это правда! - -Сможете ли вы выяснить, когда в этом зоопарке все пошло не так? Затем вернитесь к последнему удачному коммиту и создайте параллельную вселенную, где все счастливы!" -fork_congrats_105,"Whew, good job! This seems like a much better outcome. - -Feel free to add more parallel timelines, or make them longer. - -If you're ready, our next mission is already waiting...","Уф, хорошая работа! Это кажется гораздо лучшим исходом. - -Не стесняйтесь добавлять больше параллельных временных линий или делать их длиннее. - -Если вы готовы, наша следующая миссия уже ждет..." -fork_win_hint_106,Make sure that the child is happy.,Убедитесь, что ребенок счастлив. -fork_win_hint_107,Make sure that the lion gets something to eat.,Убедитесь, что лев получил что-нибудь поесть. -branchremove_title_108,Deleting branches,Удаление веток -branchremove_description_109,"Life is full of dangers, right? Even when walking to school, it seems like there's a lot of risks! - -This Monday is especially bad. You made it to school, but there's some timelines you definitely don't want to keep around.","Жизнь полна опасностей, верно? Даже по дороге в школу, кажется, много рисков! - -Этот понедельник особенно плох. Вы добрались до школы, но есть некоторые временные линии, которые вы определенно не хотите сохранять." -branchremove_congrats_110,"On second thought, maybe you even prefer the ice cream timeline to the main one? :)","Хотя, если подумать, может быть, вы даже предпочитаете временную линию с мороженым основной? :)" -branchremove_win_hint_111,Find the bad branches and delete them. Keep only the best one.,Найдите плохие ветки и удалите их. Оставьте только лучшую. -cli_title_112,The command line,Командная строка -cli_description_113,These playing cards are designed to be easy to use and to remember! We'd suggest sticking to them if you don't have a lot of experience with Git!,Эти игральные карты разработаны так, чтобы их было легко использовать и запоминать! Мы бы посоветовали придерживаться их, если у вас не так много опыта работы с Git! -cli_congrats_114,"Cool! Instead of using the playing cards, you can also do everything via the command line! - -The command line is pretty powerful! Often, you can use it to solve tasks faster compared to using a graphical interface.","Круто! Вместо использования игральных карт вы также можете делать все через командную строку! - -Командная строка довольно мощная! Часто вы можете использовать ее для решения задач быстрее по сравнению с использованием графического интерфейса." -cli_win_hint_115,Initialize the time machine!,Инициализируйте машину времени! -whoareyou_title_116,Welcome to time travel school!,Добро пожаловать в школу путешествий во времени! -whoareyou_description_117,"You're still pretty confused by everything that's going on. The next day, you decide to enroll in time travel school! - -Your time travel teacher welcomes you: ""Hello there! Wanna tell us your name?""","Вы все еще в замешательстве от всего происходящего. На следующий день вы решаете записаться в школу путешествий во времени! - -Ваш учитель по путешествиям во времени приветствует вас: ""Привет! Хочешь сказать нам свое имя?""" -whoareyou_congrats_118,"""We're so glad to have you! - -Git can help you fix problems in the past! It allows you to collaborate with other students of time travel! It's really powerful, and it's really popular! I'll see you for your first lesson tomorrow!""","""Мы так рады видеть вас! - -Git может помочь вам исправить проблемы в прошлом! Он позволяет вам сотрудничать с другими учениками путешествий во времени! Он действительно мощный и очень популярный! Увидимся на вашем первом уроке завтра!""" -whoareyou_win_hint_119,Introduce yourself.,Представьтесь. -whoareyou_win_hint_120,"Fill out the enrollment form, and commit it!","Заполните форму зачисления и закоммитьте ее!" -init_title_121,Enter the time machine,Войдите в машину времени -init_description_122,"You've been accepted to time travel school! Yay! It's your first day! Your teacher explains: - -""To do anything with a time machine, you first need to initialize it!"" - -Drag that blue card up to play it!","Вас приняли в школу путешествий во времени! Ура! Это ваш первый день! Ваш учитель объясняет: - -""Чтобы что-то делать с машиной времени, сначала нужно ее инициализировать!"" - -Перетащите эту синюю карту вверх, чтобы сыграть ею!" -init_congrats_123,"Nice! See that little owl squirrel that appeared? It will be your companion, and always show you where you are in time!","Отлично! Видите эту маленькую сову-белку, которая появилась? Она будет вашим спутником и всегда будет показывать, где вы находитесь во времени!" -risky_title_124,Living dangerously,Жить опасно -risky_description_125,"So you have decided to apply for time travel school, to learn how to use this time machine called ""Git""! - -How exciting! - -You're almost done with the paperwork! You just need to fill in one more reason why you want to learn Git.","Итак, вы решили подать заявление в школу путешествий во времени, чтобы научиться пользоваться этой машиной времени под названием ""Git""! - -Как захватывающе! - -Вы почти закончили с документами! Вам просто нужно указать еще одну причину, почему вы хотите изучать Git." -risky_congrats_126,"Suddenly, your cat jumps on the table, snatches away the form, and runs away! Oh no. All your hard work, gone! - -You clearly need a better solution. - -(Click ""Next Level"" as soon as you're ready!)","Внезапно ваша кошка запрыгивает на стол, хватает анкету и убегает! О нет. Вся ваша тяжелая работа насмарку! - -Вам явно нужно лучшее решение. - -(Нажмите ""Следующий уровень"", как только будете готовы!)" -risky_win_hint_127,Add another line to form.txt!,Добавьте еще одну строку в form.txt! -remote_title_128,Working together,Работаем вместе -remote_description_129,"Let's add your name to our list of students! - -I already have a second commit of it in my time machine - let's work together!","Давайте добавим ваше имя в наш список студентов! - -У меня уже есть второй коммит этого в моей машине времени - давайте работать вместе!" -remote_congrats_130,Welcome to time travel school! :) I'll see you for your first class tomorrow!,Добро пожаловать в школу путешествий во времени! :) Увидимся на вашем первом занятии завтра! -remote_win_hint_131,Get the second commit from your teacher using git pull.,Получите второй коммит от вашего учителя, используя git pull. -remote_win_hint_132,Add your name to the list of students,Добавьте свое имя в список студентов, -remote_win_hint_133,Commit your result.,Закоммитьте свой результат. -commit_title_134,Your first commit,Ваш первый коммит -commit_description_135,"You can use your time machine to make snapshots of objects around you! Here, let's practice this! - -(Your teacher pours some water into a glass.)","Вы можете использовать свою машину времени, чтобы делать снимки объектов вокруг вас! Давайте попрактикуемся! - -(Ваш учитель наливает немного воды в стакан.)" -commit_congrats_136,"Nice! You can try making some additional commits. When you feel comfortable, click on ""Next Level"".","Отлично! Вы можете попробовать сделать еще несколько коммитов. Когда почувствуете себя уверенно, нажмите ""Следующий уровень""." -commit_win_hint_137,"Make a snapshot of the glass (a ""commit"")","Сделайте снимок стакана (""коммит"")" -commit_win_hint_138,Change the contents of the glass!,Измените содержимое стакана! -commit_win_hint_139,And make a second commit!,И сделайте второй коммит! -copies_title_140,Making backups,Создание резервных копий -copies_description_141,"This time, you're making a lot of backup copies - you can look at them by clicking on them!","На этот раз вы делаете много резервных копий - вы можете посмотреть их, кликнув по ним!" -copies_congrats_142,"Okay, this kind of works. - -But you're a bit worried that you'll end up with hundreds of copies of this form, and it will be hard to keep track of all of them. - -And especially when working with other people, sending copies back and forth doesn't seem ideal. - -You can't wait to try these time machines!","Хорошо, это вроде бы работает. - -Но вы немного обеспокоены тем, что у вас окажутся сотни копий этой формы, и будет трудно отслеживать их все. - -И особенно при работе с другими людьми, отправка копий туда и обратно не кажется идеальным решением. - -Вам не терпится опробовать эти машины времени!" -copies_win_hint_143,Add another line to form2_really_final.txt!,Добавьте еще одну строку в form2_really_final.txt! -stash_title_144,Stashing,Сохранение в тайнике (Stashing) -stash_description_145,"You will encounter situations in which you are working on your project but you need to -put your current changes aside temporarily. To do so, you can use the stash function. Use -git stash push -to add your current changes to the stash stack. - -tipp1 -tipp2 - -tipp3","Вы столкнетесь с ситуациями, в которых вы работаете над своим проектом, но вам нужно -временно отложить текущие изменения. Для этого вы можете использовать функцию stash. Используйте -git stash push -чтобы добавить ваши текущие изменения в стек тайника (stash). - -подсказка1 -подсказка2 - -подсказка3" -stash_congrats_146,Nice stash you got there! :),Хороший у вас тайник! :) -stash_win_hint_147,Did you stash the current changes?,Вы сохранили текущие изменения в тайнике? -stashpop_title_148,Pop from Stash,Извлечь из тайника (Pop from Stash) -stashpop_description_149,"When you stashed your changes and you want to apply them back to your current working directory, you can use -git stash pop -This will remove the changes from the stash stack. If you also want to keep the changes on the stash stack, use -git stash apply - -tipp1 -tipp2 - -tipp3","Когда вы сохранили свои изменения в тайнике и хотите применить их обратно в свой текущий рабочий каталог, вы можете использовать -git stash pop -Это удалит изменения из стека тайника. Если вы также хотите сохранить изменения в стеке тайника, используйте -git stash apply - -подсказка1 -подсказка2 - -подсказка3" -stashpop_congrats_150,"Yay, you got your changes back! :)","Ура, вы вернули свои изменения! :)" -stashpop_win_hint_151,Did you pop the changes from the stash stack?,Вы извлекли изменения из стека тайника? -stashclear_title_152,Clear the Stash,Очистить тайник (Clear the Stash) -stashclear_description_153,"If you want to inspect your stash stack, use the command -git stash list - -Oh, you don't want to keep your stashed changes? There are way too many? Then go ahead and clear the stack with -git stash clear -If you only want to discard a certain stash entry, you can use -git stash drop - -Clear your stash stack! - -tipp1 -tipp2 - -tipp3","Если вы хотите просмотреть свой стек тайника, используйте команду -git stash list - -О, вы не хотите сохранять свои изменения из тайника? Их слишком много? Тогда смело очищайте стек с помощью -git stash clear -Если вы хотите отбросить только определенную запись тайника, вы можете использовать -git stash drop - -Очистите свой стек тайника! - -подсказка1 -подсказка2 - -подсказка3" -stashclear_congrats_154,All clear! :),Все чисто! :) -stashclear_win_hint_155,Did you clear your stash stack?,Вы очистили свой стек тайника? -stashmerge_title_156,Merging popped stash,Слияние извлеченных из тайника изменений -stashmerge_description_157,"When you want to re-apply your changes but you already continued working on your file, you might get -a merge conflict! Let's practice this situation. -Pop the changes from the stash with -git stash pop -and resolve the merge conflict. Commit the resolved changes and clear the stash stack afterwards. - -tipp1 -tipp2 - -tipp3","Когда вы хотите повторно применить свои изменения, но уже продолжили работу над файлом, вы можете получить -конфликт слияния! Давайте попрактикуемся в этой ситуации. -Извлеките изменения из тайника с помощью -git stash pop -и разрешите конфликт слияния. Закоммитьте разрешенные изменения и после этого очистите стек тайника. - -подсказка1 -подсказка2 - -подсказка3" -stashmerge_win_hint_158,Did you resolve the conflict and commit?,Вы разрешили конфликт и закоммитили? -stashmerge_win_hint_159,Did you clear stash stack?,Вы очистили стек тайника? -stashbranch_title_160,Branch from stash,Ветка из тайника -stashbranch_description_161,"If you want to keep your changes but they don't belong to the main branch, you can easily -create a new branch from your stashed changes. Just use -git stash branch -If you just want to use the latest stash entry, you can leave the option empty. - -Create a new branch from the stashed changes! - -tipp1 -tipp2 - -tipp3","Если вы хотите сохранить свои изменения, но они не относятся к основной ветке, вы можете легко -создать новую ветку из ваших изменений в тайнике. Просто используйте -git stash branch <имя_ветки> -Если вы просто хотите использовать последнюю запись из тайника, вы можете оставить опцию пустой. - -Создайте новую ветку из изменений в тайнике! - -подсказка1 -подсказка2 - -подсказка3" -stashbranch_congrats_162,Stashed changes are in a new branch! :),Изменения из тайника теперь в новой ветке! :) -stashbranch_win_hint_163,Did you create a new branch from the stashed changes?,Вы создали новую ветку из изменений в тайнике? -whoareyou_title_164,Nice to meet you!,Приятно познакомиться! -whoareyou_description_165,"Introduce yourself using - -code -Code -download -content_copy -expand_less -git config --global user.name Firstname -git config --global user.email ""your@mail.com""","Представьтесь, используя - -`git config --global user.name Имя` -`git config --global user.email ""your@mail.com""`" - -whoareyou_win_hint_166,Have a name configured.,Имя настроено. -whoareyou_win_hint_167,Have an email address configured.,Адрес электронной почты настроен. -clone_title_168,Cloning a repo,Клонирование репозитория -clone_description_169,"Get your friend's repo using clone, change something, push it back.","Получите репозиторий вашего друга с помощью clone, измените что-нибудь, отправьте обратно." -init_title_170,Welcome!,Добро пожаловать! -init_win_hint_171,"Again, initialize your time machine!","Снова инициализируйте вашу машину времени!" -split_title_172,Split a commit!,Разделить коммит! -split_description_173,"Here, both changes happened in one commit! Split them to be in two commits instead.","Здесь оба изменения произошли в одном коммите! Разделите их на два коммита." -steps_title_174,One step after another,Шаг за шагом -steps_description_175,"Sometimes, you might want to record the order in which things changed, instead of making a single commit. - -What happened here? Make two commits from the changes (using the ""add"" card), in an order that makes sense!","Иногда вы можете захотеть записать порядок, в котором происходили изменения, вместо того, чтобы делать один коммит. - -Что здесь произошло? Сделайте два коммита из изменений (используя карту ""add""), в осмысленном порядке!" -commita_title_176,"Make a commit, but faster!","Сделай коммит, но быстрее!" -commita_description_177,"There is a time-saving trick, where instead of a plain git commit, you can use - -code -Code -download -content_copy -expand_less -git commit -a - -This will automatically add all changes you made to local files! Very convenient.","Есть трюк для экономии времени, где вместо обычного git commit вы можете использовать - -code -Code -download -content_copy -expand_less -`git commit -a` - -Это автоматически добавит все изменения, которые вы внесли в локальные файлы! Очень удобно." -commita_win_hint_178,"Make a commit where all files contain ""x"".","Сделайте коммит, в котором все файлы содержат ""x""." -filesmove_title_179,No sleep required,Сон не требуется -filesmove_description_180,"Actually, you decide that you don't need any sleep. - -Because of that, you won't require a bed, and can build some other piece of furniture from the wood!","На самом деле, вы решаете, что вам не нужен сон. - -Из-за этого вам не понадобится кровать, и вы можете сделать какой-нибудь другой предмет мебели из дерева!" -filesmove_congrats_181,"Neat! It even still looks a bit comfortable! - -You head out, eager for your first lesson at time travel school!","Классно! Она даже все еще выглядит немного удобной! - -Вы отправляетесь, с нетерпением ожидая своего первого урока в школе путешествий во времени!" -filesmove_win_hint_182,"Rename the bed into something else, and give it a new description!","Переименуйте кровать во что-то другое и дайте ей новое описание!" -remotesdelete_title_183,Deleting and renaming a remote,Удаление и переименование удаленного репозитория -remotesdelete_description_184,"Here, you already have two remotes configured! You can list them using git remote.","Здесь у вас уже настроено два удаленных репозитория! Вы можете их перечислить с помощью git remote." -remotesdelete_win_hint_185,Rename the remote with the typo (using git remote rename [old name] [new name]),Переименуйте удаленный репозиторий с опечаткой (используя git remote rename [старое имя] [новое имя]), -remotesdelete_win_hint_186,The remote with the typo is gone.,Удаленный репозиторий с опечаткой исчез. -remotesdelete_win_hint_187,Delete the remote you don't want to keep (using git remote remove [remote]),Удалите удаленный репозиторий, который вы не хотите сохранять (используя git remote remove [remote]), -commit_title_188,Make a commit \o/,Сделайте коммит \o/ -commit_description_189,"For practice, make a commit where all files contain an ""x""!","Для практики сделайте коммит, в котором все файлы содержат ""x""!" -commit_win_hint_190,"File a contains ""x"" in the last main commit.","Файл a содержит ""x"" в последнем коммите ветки main." -commit_win_hint_191,"File b contains ""x"" in the last main commit.","Файл b содержит ""x"" в последнем коммите ветки main." -commit_win_hint_192,"File c contains ""x"" in the last main commit.","Файл c содержит ""x"" в последнем коммите ветки main." -pullpush_title_193,Helping each other,Помогая друг другу -pullpush_description_194,"The events and timelines you see are always only what your own time machine knows about! - -Of course, time agents don't have to work alone! Here, your sidekick has already prepared a merge for you! You can use the ""pull"" card to transfer it to your own time machine. - -Then, add another event on top (what does Sam have for dinner?), and push the result, to transfer it back to your sidekick! - -You can only ever manipulate things in your own time machine (the one on the bottom).","События и временные линии, которые вы видите, - это всегда только то, что знает ваша собственная машина времени! - -Конечно, временные агенты не обязаны работать в одиночку! Здесь ваш помощник уже подготовил для вас слияние! Вы можете использовать карту ""pull"", чтобы перенести его в свою машину времени. - -Затем добавьте еще одно событие сверху (что Сэм ест на ужин?) и push результат, чтобы передать его обратно вашему помощнику! - -Вы можете манипулировать вещами только в своей собственной машине времени (той, что внизу)." -pullpush_congrats_195,"In reality, in many cases, a lot of time agents work together to build a really good future together! :)","В реальности, во многих случаях, множество временных агентов работают вместе, чтобы построить действительно хорошее будущее! :)" -fetch_title_196,Fetching from remotes,Получение данных с удаленных репозиториев -fetch_description_197,"Here, you already have two remotes configured! You can list them using git remote. - -Fetch from both, and look at the suggestions. - -Then, make a new commit on top of your original one that introduces a compromise.","Здесь у вас уже настроено два удаленных репозитория! Вы можете их перечислить, используя git remote. - -Получите данные с обоих и посмотрите на предложения. - -Затем сделайте новый коммит поверх вашего оригинального, который вводит компромисс." -fetch_win_hint_198,Your proposal is acceptable for friend1.,Ваше предложение приемлемо для friend1. -fetch_win_hint_199,Your proposal is acceptable for friend2.,Ваше предложение приемлемо для friend2. -remotesadd_title_200,Adding a remote,Добавление удаленного репозитория -remotesadd_description_201,"Let's work together with others! Your friend has their own repo at the URL ../friend - you can add it using - -code -Code -download -content_copy -expand_less -git remote add [name] [URL] - -where [name] is an arbitrary, short name you pick for the remote. - -When you've done that, you can get all commits from that remote using - -code -Code -download -content_copy -expand_less -git pull friend - -There's a letter for you!","Давайте работать вместе с другими! У вашего друга есть свой собственный репозиторий по URL ../friend - вы можете добавить его, используя - -code -Code -download -content_copy -expand_less -`git remote add [имя] [URL]` - -где [имя] - это произвольное, короткое имя, которое вы выбираете для удаленного репозитория. - -Когда вы это сделаете, вы можете получить все коммиты с этого удаленного репозитория, используя - -code -Code -download -content_copy -expand_less -`git pull friend` - -Для вас есть письмо!" -remotesadd_win_hint_202,Add a remote that points to ../friend.,Добавьте удаленный репозиторий, который указывает на ../friend. -remotesadd_win_hint_203,Pull from the remote.,Получите данные с удаленного репозитория. -checkout_title_204,Getting the last version,Получение последней версии -checkout_description_205,"You've been working on your essay for a while. But - ughh! Now your cat walks over your keyboard and ""helps you"", so now it's all messed up! :/ - -But Git is here to help! To discard all changes your cat made, and go back to the version in the last commit, use checkout!","Вы уже некоторое время работаете над своим эссе. Но - ух! Теперь ваша кошка прошлась по клавиатуре и ""помогла вам"", так что теперь все испорчено! :/ - -Но Git здесь, чтобы помочь! Чтобы отменить все изменения, которые сделала ваша кошка, и вернуться к версии в последнем коммите, используйте checkout!" -checkout_win_hint_206,Restore the version from the last commit.,Восстановите версию из последнего коммита. -restore_title_207,Looking into the past,Заглядывая в прошлое -restore_description_208,"You've been working on your essay for a while. But you're not happy with the changes you've made recently. You want to go back to the version called ""Best version""! - -No problem, you can use the checkout card to restore your essay from an older commit!","Вы уже некоторое время работаете над своим эссе. Но вы недовольны недавними изменениями. Вы хотите вернуться к версии под названием ""Лучшая версия""! - -Нет проблем, вы можете использовать карту checkout, чтобы восстановить свое эссе из более старого коммита!" -restore_win_hint_209,"For nostalgic reasons, restore the very first backup you made!","Из ностальгических соображений восстановите самую первую резервную копию, которую вы сделали!" -indexmv_title_210,Rename a file in the next commit,Переименовать файл в следующем коммите -indexmv_description_211,"Other times, you might want to rename a file in the next commit. Use - -code -Code -download -content_copy -expand_less -git mv [file] [new name] - -for that. The effect is very similar as if you had created a copy with a new name, and removed the old version.","В других случаях вы можете захотеть переименовать файл в следующем коммите. Используйте - -code -Code -download -content_copy -expand_less -`git mv [файл] [новое имя]` - -для этого. Эффект очень похож на то, как если бы вы создали копию с новым именем и удалили старую версию." -indexmv_win_hint_212,"Make a commit where you rename the file b to ""x"".","Сделайте коммит, в котором вы переименовываете файл b в ""x""." -reflog_title_213,Go back to where you were before,Вернуться туда, где вы были раньше -reflog_description_214,"Say you were looking at something in the past, and then switched back to the main branch. - -But then, you got reaaally distracted, and after your lunch break, you can't remember which past commit you were on before. How can you find out? - -There's a convenient command that shows you all the places your HEAD has pointed to in the past: - -code -Code -download -content_copy -expand_less -git reflog","Допустим, вы смотрели что-то в прошлом, а затем переключились обратно на основную ветку. - -Но затем вы ооочень отвлеклись, и после обеденного перерыва не можете вспомнить, на каком прошлом коммите вы были. Как это выяснить? - -Есть удобная команда, которая показывает все места, на которые указывал ваш HEAD в прошлом: - -code -Code -download -content_copy -expand_less -`git reflog`" - -reflog_win_hint_215,"Find out where you've been before, and go back there!","Узнайте, где вы были раньше, и вернитесь туда!" -pushedsomethingbroken_title_216,I pushed something broken,Я отправил что-то сломанное -pushedsomethingbroken_description_217,"We were talking about how to undo a commit, and fix it. This only helps when you haven't already pushed it to a remote. When that has happened, and you want to undo the effects of the commit completely, your best option is git revert","Мы говорили о том, как отменить коммит и исправить его. Это помогает только тогда, когда вы еще не отправили его на удаленный репозиторий. Когда это произошло, и вы хотите полностью отменить эффекты коммита, ваш лучший вариант — git revert" -badcommit_title_218,Undo a bad commit,Отменить плохой коммит -badcommit_description_219,"Oh no, we made a bad commit! How can we undo making the commit, and go back to a point where we can try again? - -The answer is using git reset [commit], which does two things: - -It resets the current branch ref to the commit you specify. - -And it resets the index to that commit. - -It does not change your working directory in any way, which means that after that, you can try making the commit you want again.","О нет, мы сделали плохой коммит! Как мы можем отменить создание коммита и вернуться к моменту, когда мы можем попробовать снова? - -Ответ — использование git reset [коммит], которое делает две вещи: - -Сбрасывает ссылку текущей ветки на указанный вами коммит. - -И сбрасывает индекс к этому коммиту. - -Это никак не изменяет ваш рабочий каталог, что означает, что после этого вы можете снова попытаться сделать нужный коммит." -badcommit_win_hint_220,"In the last main commit, the numbers file contains the numbers from 1 to 10.","В последнем коммите ветки main файл numbers содержит числа от 1 до 10." -badcommit_win_hint_221,"The commit message of that commit is ""More numbers"".","Сообщение этого коммита — ""Больше чисел""." -badcommit_win_hint_222,The commit with the typo is not part of the main branch anymore.,Коммит с опечаткой больше не является частью основной ветки. -restoreafilefromthepast_title_223,Restore a file from the past,Восстановить файл из прошлого -restoreafilefromthepast_description_224,"Here's a similar problem: you really liked the essay from the very first commit, and want to have it back! Well, checkout can also restore things from older commits, Here's how: - -code -Code -download -content_copy -expand_less -git checkout [commit] [file]","Вот похожая проблема: вам очень понравилось эссе из самого первого коммита, и вы хотите его вернуть! Что ж, checkout также может восстанавливать вещи из более старых коммитов. Вот как: - -`git checkout [коммит] [файл]`" - -restoreafilefromthepast_win_hint_225,"Get the first version of your essay, and make a new commit with it.","Получите первую версию вашего эссе и сделайте с ней новый коммит." -restoreafile_title_226,Restore a deleted file,Восстановить удаленный файл -restoreafile_description_227,"Oops - you deleted the ""essay"" file, which you worked on all night! - -Luckily, Git is here to help! You can use git checkout to restore the file!","Ой - вы удалили файл ""эссе"", над которым работали всю ночь! - -К счастью, Git здесь, чтобы помочь! Вы можете использовать git checkout, чтобы восстановить файл!" -restoreafile_win_hint_228,"Restore the essay to contain ""important content""","Восстановите эссе, чтобы оно содержало ""важное содержимое""" -remotetag_title_229,Remote Tags,Удаленные теги -remotetag_description_230,"When you work with remote repositories, tags are not pushed or pulled automatically. - -You can push a tag with -git push -Or all tags with: -git push --tags - -Deleting tags on your remote works with: -git push --delete - -You can also sync -git fetch --prune --prune-tags - -Add a tag named ""v2"" to the last commit and push it to the remote. Also pull the v1 tag to your local repository.","При работе с удаленными репозиториями теги не отправляются и не загружаются автоматически. - -Вы можете отправить тег с помощью -git push <удаленный_репозиторий> <имя_тега> -Или все теги с помощью: -git push <удаленный_репозиторий> --tags - -Удаление тегов на удаленном репозитории работает с помощью: -git push <удаленный_репозиторий> --delete <имя_тега> - -Вы также можете синхронизировать -git fetch <удаленный_репозиторий> --prune --prune-tags - -Добавьте тег с именем ""v2"" к последнему коммиту и отправьте его на удаленный репозиторий. Также загрузите тег v1 в свой локальный репозиторий." -remotetag_win_hint_231,v1 tag in your repo,тег v1 в вашем репозитории -remotetag_win_hint_232,v2 tag in your repo,тег v2 в вашем репозитории -addtaglater_title_233,Tagging later,Добавление тега позже -addtaglater_description_234,"But what happens if you forgot to tag your current commit? -No Prob! You can also tag older commits via - -code -Code -download -content_copy -expand_less -git tag - -Tag the commit ""Adding feature 2"" with the name ""v1""! - -tipp1 -tipp2 - -tipp3","Но что делать, если вы забыли поставить тег на текущий коммит? -Нет проблем! Вы также можете ставить теги на более старые коммиты с помощью - -code -Code -download -content_copy -expand_less -`git tag <имя_тега> <хэш_коммита>` - -Поставьте тег с именем ""v1"" на коммит ""Adding feature 2""! - -подсказка1 -подсказка2 - -подсказка3" -addtaglater_congrats_235,Well done :),Отлично :) -addtaglater_win_hint_236,Did you create a new tag?,Вы создали новый тег? -removetag_title_237,Removing tags,Удаление тегов -removetag_description_238,"You added way too many tags? No prob! Delete them with - -code -Code -download -content_copy -expand_less -git tag -d - -Remove all tags in this repo! - -tipp1 -tipp2 - -tipp3","Вы добавили слишком много тегов? Нет проблем! Удалите их с помощью - -code -Code -download -content_copy -expand_less -`git tag -d <имя_тега>` - -Удалите все теги в этом репозитории! - -подсказка1 -подсказка2 - -подсказка3" -removetag_win_hint_239,Did you remove all tags?,Вы удалили все теги? -addtag_title_240,Creating tags,Создание тегов -addtag_description_241,"Some of your commits may be special commits. Maybe you reached a milestone or a new version number. - -You can mark these commits with a special flag called 'tag'. - -Write - -code -Code -download -content_copy -expand_less -git tag - -to tag your commit. - -tipp1 -tipp2 - -tipp3","Некоторые из ваших коммитов могут быть особенными. Возможно, вы достигли важной вехи или нового номера версии. - -Вы можете пометить эти коммиты специальным флагом, называемым 'тег'. - -Напишите - -code -Code -download -content_copy -expand_less -`git tag <имя-тега>` - -чтобы пометить ваш коммит. - -подсказка1 -подсказка2 - -подсказка3" -addtag_congrats_242,Nice! You tagged your first commit :),Отлично! Вы пометили свой первый коммит :) -filesdelete_title_243,Unexpected Roommates,Неожиданные соседи по комнате -filesdelete_description_244,"The first day at Time Travel School comes to an end and you receive the key to your room. -Full of excitement you open the door just to find... spider webs! Spider webs everywhere! - -Remove all the spider webs you can find with the remove card!","Первый день в Школе Путешествий во Времени подходит к концу, и вы получаете ключ от своей комнаты. -Полные восторга, вы открываете дверь и обнаруживаете... паутину! Паутина повсюду! - -Уберите всю паутину, которую сможете найти, с помощью карты удаления!" -filesdelete_congrats_245,Your room looks now very tidy and cozy! Time to unpack your stuff!,Ваша комната теперь выглядит очень опрятной и уютной! Время распаковывать вещи! -filesdelete_win_hint_246,Remove all spider webs.,Уберите всю паутину. -filesdelete_win_hint_247,But make sure you keep your bed!,Но убедитесь, что вы оставили свою кровать! -filesadd_title_248,Interior design,Дизайн интерьера -filesadd_description_249,"Now that your room looks tidy, you can start to unpack your stuff. You brought two new pieces of furniture with you and with a bright smile, -you see that their colors match the color of your bed! - -Build up your two pieces of furniture by playing the touch card. -Then name your furniture - you can choose whatever you like. - -Make sure the colors match! You can find the bed's color in its description. -Don't forget to add a color and description to your new furnitures, too!","Теперь, когда ваша комната выглядит опрятно, вы можете начать распаковывать свои вещи. Вы привезли с собой два новых предмета мебели и с яркой улыбкой -замечаете, что их цвета совпадают с цветом вашей кровати! - -Соберите свои два предмета мебели, сыграв карту касания. -Затем назовите свою мебель - вы можете выбрать любое название. - -Убедитесь, что цвета совпадают! Цвет кровати вы можете найти в ее описании. -Не забудьте также добавить цвет и описание для вашей новой мебели!" -filesadd_congrats_250,Don't you immediately feel more at home?,Разве вы не чувствуете себя сразу как дома? -filesadd_win_hint_251,Add two more pieces of furniture,Добавьте еще два предмета мебели, -filesadd_win_hint_252,Make sure the colors match your bed's color.,Убедитесь, что цвета соответствуют цвету вашей кровати. -rebase_title_253,Rebasing,Перебазирование (Rebasing) -rebase_description_254,"Okay - turns out that saving time in the morning by utilizing parallel universes is against the regulations of the International Time Travel Association. You'll have to do your tasks in sequence after all. - -See the ""rebase"" card? When you drag it to a commit, it will copy the events in your current timeline after the specified one! This way, make a clean, linear timeline where you visit all three shops. - -Again, we want to make that our base reality - the ""main"" branch should point to that timeline!","Хорошо - оказывается, экономия времени по утрам за счет использования параллельных вселенных противоречит правилам Международной Ассоциации Путешествий во Времени. В конце концов, вам придется выполнять свои задачи последовательно. - -Видите карту ""rebase""? Когда вы перетаскиваете ее на коммит, она скопирует события из вашей текущей временной линии после указанного! Таким образом, создайте чистую, линейную временную линию, где вы посещаете все три магазина. - -Опять же, мы хотим сделать это нашей базовой реальностью - ветка ""main"" должна указывать на эту временную линию!" -rebase_congrats_255,"Notice how the other timelines and commits are still there - if anything goes wrong, you can also travel back to them. - -It's really hard to actually destroy stuff with your time machine.","Обратите внимание, как другие временные линии и коммиты все еще на месте - если что-то пойдет не так, вы также можете вернуться к ним. - -На самом деле очень трудно уничтожить что-либо с помощью вашей машины времени." -rebase_win_hint_256,Order all tree branches into one and move the main branch ref,Упорядочите все ветви дерева в одну и переместите ссылку основной ветви, -reorder_title_257,Reordering events,Изменение порядка событий -reorder_description_258,"Oops, looks like there's something messed up here. Can you put the events back into their correct order? - -There are two ways to do this: You can drag the ""interactive rebase"" card to the commit before the one you want to change, then reorder the lines in the file that opens, and save it. - -Or you can reset the main tag to the very first commit, and then cherry-pick single commits in the order you want. You have cards for both approaches!","Ой, похоже, здесь что-то напутано. Можете ли вы вернуть события в правильном порядке? - -Есть два способа сделать это: Вы можете перетащить карту ""interactive rebase"" на коммит перед тем, который вы хотите изменить, затем изменить порядок строк в открывшемся файле и сохранить его. - -Или вы можете сбросить основной тег на самый первый коммит, а затем выбрать отдельные коммиты (cherry-pick) в нужном порядке. У вас есть карты для обоих подходов!" -reorder_congrats_259,Feel free to reset the level and try the other strategy! Which one do you like better?,Не стесняйтесь сбросить уровень и попробовать другую стратегию! Какая вам нравится больше? -reorder_win_hint_260,Reorder the commits to dress yourself in the correct way,Измените порядок коммитов, чтобы одеться правильно, -bisect_title_261,Yellow brick road,Дорога из желтого кирпича -bisect_description_262,"(Please zoom out a bit using your mouse wheel! :D) - -Oh no! You have lost your key at some point during the day! - -Sure, you could look at every single commit in an attempt to find it - but there's a better way: your time machine has a built-in way to find the point in time where things went wrong quickly! - -First, play the ""bisect start"" card. Then, go to a commit where you don't have the key, and play the ""bisect bad"" card. Likewise, go to a commit early on where you have the key in your pocket, and play the ""bisect good"" card. - -After you've found the last good commit, reset the main branch to it. What happened to the key after you lost it?","(Пожалуйста, немного уменьшите масштаб с помощью колеса мыши! :D) - -О нет! Вы потеряли свой ключ в какой-то момент в течение дня! - -Конечно, вы могли бы просмотреть каждый отдельный коммит в попытке найти его - но есть способ лучше: у вашей машины времени есть встроенный способ быстро найти момент времени, когда все пошло не так! - -Сначала сыграйте карту ""bisect start"". Затем перейдите к коммиту, где у вас нет ключа, и сыграйте карту ""bisect bad"". Аналогично, перейдите к раннему коммиту, где у вас есть ключ в кармане, и сыграйте карту ""bisect good"". - -После того, как вы найдете последний хороший коммит, сбросьте основную ветку на него. Что случилось с ключом после того, как вы его потеряли?" -bisect_congrats_263,"Well done! :) The only problem is that you now have to walk all the way back home, again...","Отлично! :) Единственная проблема в том, что теперь вам снова придется идти пешком до самого дома..." -bisect_win_hint_264,Find the last good commit,Найдите последний хороший коммит -gitignore_title_265,Ignoring files,Игнорирование файлов -gitignore_description_266,"That chicken is running around a lot, and changing often. We don't want to have it in our commits. - -Add it to the file .gitignore, and try using git add .!","Эта курица много бегает и часто меняется. Мы не хотим, чтобы она была в наших коммитах. - -Добавьте ее в файл .gitignore и попробуйте использовать git add .!" -pr_description_267,"Your friend has a problem! Clone the repo located in ../friend, create a branch called ""solution"", and fix the problem in this branch. When you're ready, make a ""Pull Request"" by using git tag pr.","У вашего друга проблема! Клонируйте репозиторий, находящийся в ../friend, создайте ветку с именем ""solution"" и исправьте проблему в этой ветке. Когда будете готовы, сделайте ""Pull Request"", используя git tag pr." -empty_title_268,Empty sandbox,Пустая песочница -empty_description_269,This is an empty sandbox you can play around in.,Это пустая песочница, в которой вы можете поиграть. -threecommits_title_270,Sandbox with three commits,Песочница с тремя коммитами -threecommits_description_271,"Here's a sandbox you can play around in. - -You can use both the playing cards, as well as the terminal. This is a real Git terminal! Fun things to try: - -Make a commit that merges three timelines together at once! - -Create and delete some tags! - -Make a timeline that's completely independent of the rest!","Вот песочница, в которой можно поиграть. - -Вы можете использовать как игральные карты, так и терминал. Это настоящий Git-терминал! Что можно попробовать: - -Сделать коммит, который объединяет три временные линии одновременно! - -Создать и удалить несколько тегов! - -Создать временную линию, полностью независимую от остальных!" -remote_title_272,Sandbox with a remote,Песочница с удаленным репозиторием -remote_description_273,"Here's a sandbox with a remote! Try pulling, fetching, or pushing! - -How can you push tags and branches on a remote? How can you delete them again?","Вот песочница с удаленным репозиторием! Попробуйте pull, fetch или push! - -Как можно отправлять теги и ветки на удаленный репозиторий? Как их можно снова удалить?" -treenested_description_274,"Trees can also point to other trees! This way, they can describe nested directory structures. - -When you add a file inside of a directory to the index, and then call git write-tree, it will create a nested tree for the directory, and attach the blob to it. - -To solve this level, build a little stick figure, as shown on the left - a tree that points to two blobs, as well to a tree that points to two blobs.","Деревья также могут указывать на другие деревья! Таким образом, они могут описывать вложенные структуры каталогов. - -Когда вы добавляете файл внутри каталога в индекс, а затем вызываете git write-tree, это создаст вложенное дерево для каталога и прикрепит к нему блоб. - -Чтобы решить этот уровень, постройте маленькую фигурку из палочек, как показано слева - дерево, которое указывает на два блоба, а также на дерево, которое указывает на два блоба." -indexupdate_description_275,"Instead of removing an entry from the index and adding one with the same name, you can also directly update that entry! - -Put the content you want in a file with a matching name, and then run - -code -Code -download -content_copy -expand_less -git update-index - -This will create a new blob, and update the hash of the entry to that blob. - -Update an entry in the index!","Вместо удаления записи из индекса и добавления новой с тем же именем, вы также можете напрямую обновить эту запись! - -Поместите желаемое содержимое в файл с соответствующим именем, а затем выполните - -code -Code -download -content_copy -expand_less -`git update-index <файл>` - -Это создаст новый блоб и обновит хэш записи до этого блоба. - -Обновите запись в индексе!" -indexupdate_win_hint_276,This is not really a good test for the winning condition...,Это не очень хороший тест для условия победы... -indexremove_description_277,"To remove an entry from the index, use a command like this: - -code -Code -download -content_copy -expand_less -git update-index --force-remove - -Remove all entries from the index!","Чтобы удалить запись из индекса, используйте команду вроде этой: - -code -Code -download -content_copy -expand_less -`git update-index --force-remove <файл>` - -Удалите все записи из индекса!" -commitcreate_description_278,"So a tree describes a directory structure at a specific point in time. - -It would be nice if we could remember when that state existed, and who authored it, right? - -Enter: commits. They are objects that point to a tree and contain some additional metadata. You can create a commit using - -code -Code -download -content_copy -expand_less -git commit-tree -m ""Description of your commit"" - -Make a commit from the tree in this repository!","Итак, дерево описывает структуру каталогов в определенный момент времени. - -Было бы неплохо, если бы мы могли запомнить, когда это состояние существовало и кто его автор, верно? - -Представляем: коммиты. Это объекты, которые указывают на дерево и содержат некоторые дополнительные метаданные. Вы можете создать коммит, используя - -code -Code -download -content_copy -expand_less -`git commit-tree <дерево> -m ""Описание вашего коммита""` - -Сделайте коммит из дерева в этом репозитории!" -treeread_description_279,"As soon as you have some tree objects, you can always read them and set the index exactly to their content! Unsurprisingly, the command is called - -code -Code -download -content_copy -expand_less -git read-tree - -For , you can provide the hash of any tree object - you can right-click one to insert its hash into the terminal! - -Try reading some of the trees in this repository into the index!","Как только у вас появятся какие-либо объекты-деревья, вы всегда можете прочитать их и установить индекс в точности в соответствии с их содержимым! Неудивительно, что команда называется - -code -Code -download -content_copy -expand_less -`git read-tree <дерево>` - -Для <дерева> вы можете указать хэш любого объекта-дерева - вы можете щелкнуть правой кнопкой мыши по одному из них, чтобы вставить его хэш в терминал! - -Попробуйте прочитать некоторые из деревьев в этом репозитории в индекс!" -commitrhombus_description_280,"A commit can have multiple parents! You can specify the -p option multiple times, like this: - -code -Code -download -content_copy -expand_less -git commit-tree -m ""Description"" -p -p - -Build a rhombus shape from commits, where two commits point to the same parent, and then a fourth commit points to both of them.","Коммит может иметь несколько родителей! Вы можете указать опцию -p несколько раз, вот так: - -code -Code -download -content_copy -expand_less -`git commit-tree <дерево> -m ""Описание"" -p <родитель1> -p <родитель2>` - -Постройте ромбовидную форму из коммитов, где два коммита указывают на одного и того же родителя, а затем четвертый коммит указывает на них обоих." -commitrhombus_win_hint_281,My first parent's parents has to be the same as my second parent's parent.,Родители моего первого родителя должны быть такими же, как родитель моего второго родителя. -refmove_description_282,"You can point refs to a new location using the same command you use to create them: - -code -Code -download -content_copy -expand_less -git update-ref refs/ - -As an exercise, make all refs in this repository point to the tree object!","Вы можете указать ссылкам на новое местоположение, используя ту же команду, которую вы используете для их создания: - -code -Code -download -content_copy -expand_less -`git update-ref refs/<имя_ссылки> <объект>` - -В качестве упражнения, сделайте так, чтобы все ссылки в этом репозитории указывали на объект-дерево!" -blobremove_description_283,"There's a simple command to remove all objects that are not referenced by anything: - -code -Code -download -content_copy -expand_less -git prune - -Remove all blobs in this repository.","Есть простая команда для удаления всех объектов, на которые ничего не ссылается: - -code -Code -download -content_copy -expand_less -`git prune` - -Удалите все блобы в этом репозитории." -blobremove_congrats_284,"Generally, git prune will be useful if you want to clean up some objects you made. - -Alternatively, you can also click the ""Reload"" button to restart a level.","В общем, git prune будет полезен, если вы хотите очистить некоторые созданные вами объекты. - -В качестве альтернативы вы также можете нажать кнопку ""Перезагрузить"", чтобы перезапустить уровень." -symrefcreate_description_285,"Instead of pointing directly to objects, refs can also point to other refs! - -When that happens, they are called ""symbolic refs"". You can create or update a symbolic ref using - -code -Code -download -content_copy -expand_less -git symbolic-ref - -Create a symbolic ref called ""refs/rainbow""!","Вместо того чтобы указывать непосредственно на объекты, ссылки могут также указывать на другие ссылки! - -Когда это происходит, их называют ""символическими ссылками"". Вы можете создать или обновить символическую ссылку, используя - -code -Code -download -content_copy -expand_less -`git symbolic-ref <имя> <ссылка>` - -Создайте символическую ссылку с именем ""refs/rainbow""!" -commitparents_description_286,"When using the commit-tree command, you can optionally specify a parent: - -code -Code -download -content_copy -expand_less -git commit-tree -m ""Description"" -p - -Make a string of three commits! - -Hint: You'll need a tree object. What could be the easiest way to obtain one?","При использовании команды commit-tree вы можете опционально указать родителя: - -code -Code -download -content_copy -expand_less -`git commit-tree <дерево> -m ""Описание"" -p <родительский коммит>` - -Создайте цепочку из трех коммитов! - -Подсказка: Вам понадобится объект-дерево. Какой самый простой способ его получить?" -blobcreate_description_287,"At its core, Git is very simple. It stores ""objects"", which are basically files identified by an ""identifier"" (short: ID). - -There are four types of objects: blobs, trees, commits, and tags. The simplest type is a ""blob"", which is just a piece of text. - -Let's create some blobs! To do that, create a file with the desired content, and then use - -code -Code -download -content_copy -expand_less -git hash-object -w - -The flag -w means ""write"", and tells Git to actually write the new blob to the disk. - -Create three new blobs!","В своей основе Git очень прост. Он хранит ""объекты"", которые по сути являются файлами, идентифицируемыми ""идентификатором"" (сокращенно: ID). - -Существует четыре типа объектов: блобы, деревья, коммиты и теги. Самый простой тип - ""блоб"", который представляет собой просто фрагмент текста. - -Давайте создадим несколько блобов! Для этого создайте файл с желаемым содержимым, а затем используйте - -code -Code -download -content_copy -expand_less -`git hash-object -w <файл>` - -Флаг -w означает ""запись"" и указывает Git фактически записать новый блоб на диск. - -Создайте три новых блоба!" -blobcreate_congrats_288,"Tip: You can also use a command like this to create a blob in a single line: - -code -Code -download -content_copy -expand_less -echo ""awesome content"" | git hash-object -w --stdin - -Did you already notice that you can drag and drop all objects? :)","Совет: Вы также можете использовать команду вроде этой, чтобы создать блоб в одну строку: - -code -Code -download -content_copy -expand_less -`echo ""отличное содержимое"" | git hash-object -w --stdin` - -Вы уже заметили, что можете перетаскивать все объекты? :)" -treecreate_description_289,"After carefully building the index we want, it would be nice to save a permanent snapshot of it, right? - -This is what the second type of objects is for: trees! You can convert the index into a tree using - -code -Code -download -content_copy -expand_less -git write-tree - -Try it! :)","После того, как мы тщательно построили нужный нам индекс, было бы неплохо сохранить его постоянный снимок, верно? - -Для этого и предназначен второй тип объектов: деревья! Вы можете преобразовать индекс в дерево, используя - -code -Code -download -content_copy -expand_less -`git write-tree` - -Попробуйте! :)" -treecreate_congrats_290,"Nice! - -Can you make a different tree? Modify the index, then call git write-tree again!","Отлично! - -Можете ли вы создать другое дерево? Измените индекс, затем снова вызовите git write-tree!" -welcome_description_291,"This is prototype #1 for the Git learning game by @bleeptrack and @blinry. Thanks for checking it out! <3 - -You can interact with the repository labelled ""yours"" by typing Bash commands in the terminal below! The visualization will show you its internal status. - -Let's get started by initializing an empty Git repository in the current directory by typing: - -code -Code -download -content_copy -expand_less -git init","Это прототип №1 обучающей игры по Git от @bleeptrack и @blinry. Спасибо, что заглянули! <3 - -Вы можете взаимодействовать с репозиторием с меткой ""yours"", вводя команды Bash в терминале ниже! Визуализация покажет вам его внутреннее состояние. - -Давайте начнем с инициализации пустого репозитория Git в текущем каталоге, набрав: - -code -Code -download -content_copy -expand_less -`git init`" - -welcome_congrats_292,"Well done! - -An empty Git repository is... well, quite empty. The only thing that always exists is a reference called ""HEAD"" - we'll learn what that is later! - -But first, let's look at some basics! - -(Click ""Next Level"" as soon as you're ready!)","Отлично! - -Пустой репозиторий Git... ну, довольно пустой. Единственное, что всегда существует, это ссылка под названием ""HEAD"" - мы узнаем, что это такое, позже! - -Но сначала давайте рассмотрим некоторые основы! - -(Нажмите ""Следующий уровень"", как только будете готовы!)" -basics_description_293,"For this prototype, we assume you have some experience with the command line. Here are some commands that will be useful: - -ls - -echo content > file - -cat file - -mkdir dir - -Find the riddle in your current directory and put the answer into the file ""answer""!","Для этого прототипа мы предполагаем, что у вас есть некоторый опыт работы с командной строкой. Вот несколько команд, которые будут полезны: - -ls - -echo содержимое > файл - -cat файл - -mkdir папка - -Найдите загадку в вашем текущем каталоге и поместите ответ в файл ""answer""!" -basics_congrats_294,"Omnomnom! - -For technical reasons, you can't use cd in this prototype yet. But there won't be a lot of interaction with the file system anyways. :)","Омномном! - -По техническим причинам вы пока не можете использовать cd в этом прототипе. Но в любом случае взаимодействия с файловой системой будет немного. :)" -puzzlepreciousblob_description_295,Create two trees pointing to the same blob!,Создайте два дерева, указывающих на один и тот же блоб! -indexadd_description_296,"Blobs usually represent the content of a file. But on their own, they don't have any metadata, not even a name! - -Git has a very powerful concept to store metadata related to blobs: the index! It's a list that relates blobs to filenames and access permissions. - -The most convenient option to add an entry to the index is via an existing file: - -code -Code -download -content_copy -expand_less -echo ""my content"" > file -git update-index --add file - -Add three entries to the index! For a bonus challenge: can you add a file that is inside of a directory, like ""directory/file""?","Блобы обычно представляют содержимое файла. Но сами по себе они не имеют никаких метаданных, даже имени! - -У Git есть очень мощная концепция для хранения метаданных, связанных с блобами: индекс! Это список, который связывает блобы с именами файлов и правами доступа. - -Самый удобный способ добавить запись в индекс - через существующий файл: - -code -Code -download -content_copy -expand_less -`echo ""мое содержимое"" > файл` -`git update-index --add файл` - -Добавьте три записи в индекс! Для дополнительного задания: можете ли вы добавить файл, который находится внутри каталога, например, ""каталог/файл""?" -indexadd_congrats_297,"There's another way to add an entry to the index directly: - -code -Code -download -content_copy -expand_less -git update-index --add --cacheinfo ,, - -The first three numbers of the mode describe the type of the entry, ""100"" is a regular file. - -The second three number describe the permissions. Only ""644"" (non-executable) and ""755"" (executable) are supported. - -You can insert the hash of an object into the terminal by right-clicking on it! :)","Есть еще один способ добавить запись в индекс напрямую: - -code -Code -download -content_copy -expand_less -`git update-index --add --cacheinfo <режим>,<хэш_блоба>,<имя>` - -Первые три числа режима описывают тип записи, ""100"" - это обычный файл. - -Вторые три числа описывают права доступа. Поддерживаются только ""644"" (неисполняемый) и ""755"" (исполняемый). - -Вы можете вставить хэш объекта в терминал, щелкнув по нему правой кнопкой мыши! :)" -puzzletreesallthewaydown_description_298,"Construct a chain of three trees, which don't point to anything else. - -This is hard! The git mktree command might be useful.","Создайте цепочку из трех деревьев, которые не указывают ни на что другое. - -Это сложно! Команда git mktree может быть полезна." -puzzletreesallthewaydown_win_hint_299,"So the tree has exactly one child, and it is a tree!","Итак, у дерева ровно один дочерний элемент, и это дерево!" -puzzletreesallthewaydown_win_hint_300,Same for its child! \o/,То же самое для его дочернего элемента! \o/ -symrefnoderef_description_301,"When you have a symbolic ref (a ref pointing at another ref), and you decide you want it to be a regular ref again (pointing to an object), you're in for some trouble! :) - -What happens when you try pointing the symbolic ref directly to the blob using git update-ref? - -Oops! Turns out that when you reference a symbolic ref, it acts as if you had specified the ref it points to. To de-symbolic-ize it, use the --no-deref option directly after update-ref! - -Weird, huh?","Когда у вас есть символическая ссылка (ссылка, указывающая на другую ссылку), и вы решаете, что хотите, чтобы она снова стала обычной ссылкой (указывающей на объект), вас ждут неприятности! :) - -Что произойдет, если вы попытаетесь указать символическую ссылку прямо на блоб с помощью git update-ref? - -Ой! Оказывается, когда вы ссылаетесь на символическую ссылку, она ведет себя так, как если бы вы указали ссылку, на которую она указывает. Чтобы ""де-символизировать"" ее, используйте опцию --no-deref сразу после update-ref! - -Странно, да?" -symrefnoderef_congrats_302,"Whew, we've covered a lot of things: Blobs! The index! Trees! Commits! Refs! - -You now know about almost everything about how Git repositories look like on the inside! We think that's pretty cool! :) - -Everything else is just convention and high-level commands that make interacting with the objects more convenient. - -We haven't covered: - -tag objects (they are the fourth object type - a bit like refs with a description and an author) - -configuration (allows you to specify remote repositories, for example) - -working with local files (which is, uh, arguably pretty important :P) - -Thanks for playing! You're welcome to check out the ""puzzle"" levels in the dropdown, some of them are more advanced!","Уф, мы рассмотрели много всего: Блобы! Индекс! Деревья! Коммиты! Ссылки! - -Теперь вы знаете почти все о том, как репозитории Git выглядят изнутри! Мы думаем, это довольно круто! :) - -Все остальное - это просто соглашения и высокоуровневые команды, которые делают взаимодействие с объектами более удобным. - -Мы не рассмотрели: - -объекты-теги (это четвертый тип объектов - немного похожи на ссылки с описанием и автором) - -конфигурация (позволяет указывать удаленные репозитории, например) - -работа с локальными файлами (что, э-э, пожалуй, довольно важно :P) - -Спасибо за игру! Вы можете ознакомиться с уровнями-""загадками"" в выпадающем списке, некоторые из них более продвинутые!" -puzzleapocalypse_description_303,"Delete all objects in this repository using git commands only! - -Useful commands: - -code -Code -download -content_copy -expand_less -git prune -git reflog expire","Удалите все объекты в этом репозитории, используя только команды git! - -Полезные команды: - -code -Code -download -content_copy -expand_less -`git prune` -`git reflog expire`" - -refremove_description_304,"And finally, to delete a ref, use - -code -Code -download -content_copy -expand_less -git update-ref -d refs/ - -Delete all refs! :P (Well, except for HEAD. HEAD is special.)","И, наконец, чтобы удалить ссылку, используйте - -code -Code -download -content_copy -expand_less -`git update-ref -d refs/<имя_ссылки>` - -Удалите все ссылки! :P (Ну, кроме HEAD. HEAD - особенная.)" -refcreate_description_305,"Let's take a look at ""refs"" (short for ""references"")! Refs are not objects, but rather very simple pointers to objects! They can help you keep track of what's where. - -You can create or update a ref with - -code -Code -download -content_copy -expand_less -git update-ref refs/ - -Make sure to always start a ref's name with ""refs/""! That's a convention that helps Git find all refs you create. If you forget the ""refs/"", you will not see the ref. - -Create refs that point to all objects in this repository!","Давайте посмотрим на ""ссылки"" (сокращенно от ""references"")! Ссылки - это не объекты, а скорее очень простые указатели на объекты! Они могут помочь вам отслеживать, что где находится. - -Вы можете создать или обновить ссылку с помощью - -code -Code -download -content_copy -expand_less -`git update-ref refs/<имя_ссылки> <новое_значение>` - -Убедитесь, что имя ссылки всегда начинается с ""refs/""! Это соглашение, которое помогает Git находить все созданные вами ссылки. Если вы забудете ""refs/"", вы не увидите ссылку. - -Создайте ссылки, которые указывают на все объекты в этом репозитории!" -problems_title_306,Problems,Проблемы -problems_description_307,"Both you and your friend have been working on the file, and want to sync up!","И вы, и ваш друг работали над файлом и хотите синхронизироваться!" -problems_win_hint_308,Commit your local changes.,Закоммитьте ваши локальные изменения. -friend_title_309,Friend,Друг -friend_description_310,"Your friend added another line to your essay! Get it, add a third one and send it to them! - -Take turns until you have five lines!","Ваш друг добавил еще одну строку в ваше эссе! Получите ее, добавьте третью и отправьте ему! - -Делайте это по очереди, пока у вас не будет пяти строк!" -friend_win_hint_311,Got the second line from your friend,Получил вторую строку от друга, -friend_win_hint_312,Got the fourth line from your friend.,Получил четвертую строку от друга. -card_init_desc_313,Drag this card into the empty space above to initialize the time machine!,Перетащите эту карту в пустое пространство выше, чтобы инициализировать машину времени! -card_clone_desc_314,Create your own copy of someone else's repo.,Создайте свою собственную копию чужого репозитория. -card_configname_desc_315,"Set your name. - -(Will not change anything outside of this game.)","Установите свое имя. - -(Ничего не изменит вне этой игры.)" -card_configemail_desc_316,Set your email address.,Установите свой адрес электронной почты. -card_checkout_desc_317,Drag this card to a commit or to a branch to travel to it!,Перетащите эту карту на коммит или на ветку, чтобы переместиться к ней! -card_checkoutfile_desc_318,Reset changes in a local file.,Сбросить изменения в локальном файле. -card_checkoutfrom_desc_319,"Get the file contents from the specified commits, and reset both the working directory, as well as the index, to it.","Получить содержимое файла из указанных коммитов и сбросить к нему как рабочий каталог, так и индекс." -card_commita_desc_320,"Make a new commit, after automatically adding all changes to the index. -You'll be asked to enter a short description of what you changed.","Сделайте новый коммит, автоматически добавив все изменения в индекс. -Вас попросят ввести краткое описание того, что вы изменили." -card_commitauto_desc_321,Make a new commit containing your current environment! Type in a description of what changed!,Сделайте новый коммит, содержащий ваше текущее окружение! Введите описание того, что изменилось! -card_merge_desc_322,"Merge the specified timeline into yours. If necessary, will create a merge commit.","Слейте указанную временную линию в свою. При необходимости будет создан коммит слияния." -card_mergeabort_desc_323,"Abort the current merge attempt, and reconstruct the previous state.","Прервать текущую попытку слияния и восстановить предыдущее состояние." -card_rebase_desc_324,Put the events in your current timeline on top of the specified one.,Поместите события из вашей текущей временной линии поверх указанной. -card_pull_desc_325,"Get someone else's version of the current timeline, and try to merge it into yours.","Получите чужую версию текущей временной линии и попробуйте слить ее со своей." -card_fetch_desc_326,Get a someone else's version of the current timeline.,Получить чужую версию текущей временной линии. -card_push_desc_327,Give the current timeline to someone else.,Передайте текущую временную линию кому-нибудь еще. -card_rebaseinteractive_desc_328,"Make changes to the events in your current timeline, back to the commit you drag this to.","Внесите изменения в события вашей текущей временной линии, вплоть до коммита, на который вы перетащите это." -card_rebasecontinue_desc_329,Continue the current rebasing process.,Продолжить текущий процесс перебазирования. -card_resethard_desc_330,Move the branch you're on to the specified commit.,Переместите ветку, на которой вы находитесь, к указанному коммиту. -card_reset_desc_331,"Jump to the commit, and update the index. Keep the current environment.","Перейти к коммиту и обновить индекс. Сохранить текущее окружение." -card_resetfile_desc_332,Reset the index version of a file to the version in the commit you're on.,Сбросить версию файла в индексе до версии в коммите, на котором вы находитесь. -card_cherrypick_desc_333,Repeat the specified action on top of your current timeline.,Повторите указанное действие поверх вашей текущей временной линии. -card_revert_desc_334,Make a new commit that reverts the changes of the specified commit.,Создайте новый коммит, который отменяет изменения указанного коммита. -card_bisectstart_desc_335,Start looking for the commit where things got bad.,Начать поиск коммита, в котором все пошло не так. -card_bisectgood_desc_336,"State that the current commit is good! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит хороший! Когда вас автоматически перенесут, продолжайте играть картами good и bad!" -card_bisectbad_desc_337,"State that the current commit is bad! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит плохой! Когда вас автоматически перенесут, продолжайте играть картами good и bad!" -card_add_desc_338,Update the index version of the file to its current real content.,Обновите версию файла в индексе до его текущего реального содержимого. -card_rm_desc_339,"Delete a file both in the working directory, as well as the index.","Удалить файл как в рабочем каталоге, так и в индексе." -card_commit_desc_340,Make a commit from the current index.,Сделать коммит из текущего индекса. -card_show_desc_341,Show what changed in the commit.,Показать, что изменилось в коммите. -card_branch_desc_342,Create a new branch at your current location.,Создать новую ветку в вашем текущем местоположении. -card_branchdelete_desc_343,Delete a branch.,Удалить ветку. -card_reflog_desc_344,Display a log of where the ref pointed to in the past.,Отобразить журнал того, куда указывала ссылка в прошлом. -card_filenew_desc_345,Create a new file.,Создать новый файл. -card_filedelete_desc_346,Delete a file.,Удалить файл. -card_filerename_desc_347,Rename a file.,Переименовать файл. -card_filecopy_desc_348,Make a copy of a file.,Сделать копию файла. -cli_remote_001,"To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice.","Чтобы вернуться к старым командам, вы можете нажимать стрелки вверх и вниз. Таким образом, вам не придется дважды вводить длинные команды." -cli_commit_002,"Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below!","Опять же, вместо использования карты, вы также можете вводить команды, напечатанные на ней, в черный терминал ниже!" -cli_commit_003,"This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :)","Это совершенно необязательно! Но это будет суперполезный навык в реальном мире - и он даст вам сверкающий золотой значок! :)" -cli_cli_004,"But there's another way to interact with Git:","Но есть и другой способ взаимодействия с Git:" -cli_cli_005,"Try typing git init into the black terminal below, and pressing the enter key!","Попробуйте набрать git init в черном терминале ниже и нажать клавишу Enter!" -cli_new_006,"You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time!","Вы можете использовать автодополнение по Tab в терминале! Начните вводить имя файла, затем нажмите клавишу Tab, чтобы дополнить его имя. Это часто сэкономит вам время!" -cli_grow_007,"To travel to a branch, type `git checkout name_of_the_branch`","Чтобы переместиться на ветку, введите `git checkout имя_ветки`" -cli_grow_008,"And to travel to the last commit, type `git checkout --detach name_of_the_branch`","А чтобы переместиться к последнему коммиту, введите `git checkout --detach имя_ветки`." -cli_branchcreate_009,"Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called ""birthday"", you can type `git checkout birthday` to travel to it!","Ветки также значительно упрощают перемещение между разными местами с помощью командной строки! Как только у вас появится ветка с именем ""birthday"", вы сможете набрать `git checkout birthday`, чтобы переместиться на нее!" -cli_fork_010,"The blue animal represents a concept known as the ""HEAD pointer"" in Git: It shows you which commit is the current one.","Синее животное представляет собой концепцию, известную в Git как ""указатель HEAD"": он показывает вам, какой коммит является текущим." -cli_fork_011,"Here's a cool trick to go to the previous commit:","Вот крутой трюк, чтобы перейти к предыдущему коммиту:" -cli_fork_012,"`git checkout HEAD^`","`git checkout HEAD^`" -cli_fork_013,"You can also go back two commits by typing, for example:","Вы также можете вернуться на два коммита назад, набрав, например:" -cli_fork_014,"`git checkout HEAD~2`","`git checkout HEAD~2`" -cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want!","Чтобы переключиться на определенный коммит, введите `git checkout`, затем пробел, а затем щелкните правой кнопкой мыши по нужному коммиту!" -cli_checkoutcommit_016,"This will insert the commit's unique identifier!","Это вставит уникальный идентификатор коммита!" -cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:","В командной строке вы можете легко удалить все файлы, заканчивающиеся на -web, с помощью этой команды:" -cli_filesdelete_018," `rm *web`"," `rm *web`" -chapter_intro,Introduction,Введение -chapter_files,Files,Файлы -chapter_branches,Branches,Ветви -chapter_merge,Merging,Слияние -chapter_index,The Index,Индекс -chapter_remotes,Remotes,Удалённые репозитории -chapter_changing-the-past,Changing the Past,Изменение прошлого -chapter_shit-happens,When Things Go Wrong,Когда всё идёт не так -chapter_workflows,Workflows,Рабочие процессы -chapter_bisect,Bisect,Поиск ошибки (Bisect) -chapter_stash,Stash,Тайник (Stash) -chapter_tags,Tags,Метки -chapter_sandbox,Sandbox,Песочница +keys,en,ru,, +card_description_001,Description,Описание,, +card_energy_002,0,0,, +music_button_button3_003,Toggle music,Переключить музыку,, +arrow_id_004,label,метка,, +cards_button_005,Draw new cards,Взять новые карты,, +cards_energy_006,3,3,, +title_label2_007,by bleeptrack & blinry,от bleeptrack & blinry,, +title_label3_008,Original score by winniehell,Оригинальная музыка от winniehell,, +title_button_009,Levels,Уровни,, +title_button3_010,Sandbox,Песочница,, +title_button2_011,Quit,Выход,, +survey_label_012,Oh My Git!,Oh My Git!,, +survey_button_013,Support us! (Open two browser tabs),Поддержите нас! (Откроются две вкладки браузера),, +main_levelname_014,Level name here!,Название уровня здесь!,, +main_leveldescription_015,Level description here!,Описание уровня здесь!,, +main_backbutton_016,Back,Назад,, +main_reloadbutton2_017,Reload,Перезагрузить,, +main_cardsbutton_018,Cards!,Карты!,, +main_tip_019,Tip!,Подсказка!,, +main_nextlevelbutton_020,Next level,Следующий уровень,, +terminal_button_021,"git commit --allow-empty -m "" +RANDOM""","gitcommit−−allow−empty−m"" +RANDOM""","gitcommit−−allow−empty−m"" +RANDOM""", +terminal_button2_022,git checkout HEAD^,git checkout HEAD^,, +terminal_button3_023,"git checkout -b "" +RANDOM""","gitcheckout−b"" +RANDOM""","gitcheckout−b"" +RANDOM""", +repository_label_024,Repo name,Имя репозитория,, +repository_indexlabel_025,Index:,Индекс:,, +repository_button_026,Update,Обновить,, +repository_simplifycheckbox_027,Hide trees and blobs,Скрыть деревья и блобы,, +node_id_028,object_id,id_объекта,, +level_select_button3_029,To the survey /o/,К опросу /o/,, +no_git_button2_030,"Sure, I'll install it!","Конечно, я установлю!",, +notification_label_031,This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint!,Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка!,, +notification_ok_032,Got it!,Понятно!,, +file_browser_title_033,title,заголовок,, +file_browser_button_034,root,корень,, +file_browser_button2_035,dir,папка,, +file_browser_savebutton_036,Save,Сохранить,, +text_editor_texteditor_038,Text here,Текст здесь,, +file_browser_item_label_039,filename,имя_файла,, +merge_title_040,Merging timelines,Слияние временных линий,, +merge_description_041,"Here's a trick so that you can sleep a bit longer: just do all your morning activities in parallel universes, and then at the end, merge them together!","Вот трюк, который позволит вам поспать немного дольше: просто выполняйте все свои утренние дела в параллельных вселенных, а в конце слейте их воедино!",, +merge_congrats_042,I wonder if you're more relaxed when you sleep in parallel timelines...,Интересно, вы более расслаблены, когда спите в параллельных временных линиях... +merge_win_hint_043,"Build a situation where you consumed a baguette, a coffee, and a donut.","Создайте ситуацию, в которой вы съели багет, выпили кофе и съели пончик.",, +merge_win_hint_044,Be on a merge commit.,Находитесь на коммите слияния.,, +conflict_title_045,Contradictions,Противоречия,, +conflict_description_046,"Sometimes, timelines will contradict each other. + +For example, in this case, one of our clients wants these timelines merged, but they ate different things for breakfast in both timelines. + +Try to merge them together! You'll notice that there will be a conflict! The time machine will leave it up to you how to proceed: you can edit the problematic item, it will show you the conflicting sections. You can keep either of the two versions - or create a combination of them! Remove the >>>, <<<, and === markers, and make a new commit to finalize the merge! + +Let your finalized timeline be the ""main"" one.","Иногда временные линии противоречат друг другу. + +Например, в данном случае один из наших клиентов хочет слить эти временные линии, но в обеих он ел разные вещи на завтрак. + +Попробуйте слить их! Вы заметите, что возникнет конфликт! Машина времени оставит решение за вами: вы можете отредактировать проблемный элемент, она покажет вам конфликтующие разделы. Вы можете сохранить любую из двух версий или создать их комбинацию! Удалите маркеры >>>, <<< и === и сделайте новый коммит для завершения слияния! + +Пусть ваша окончательная временная линия будет ""main"". +",, +conflict_congrats_047,"Yum, that sounds like a good breakfast!","Мм, звучит как хороший завтрак!",, +conflict_win_hint_048,Make a breakfast compromise in the 'main' branch.,Найдите компромисс по завтраку в ветке 'main'.,, +mergeabort_title_049,Abort a merge,Прервать слияние,, +mergeabort_description_050,"Sometimes you want to merge two commits, but a merge conflict occurs that you currently don't want to resolve. + +In these situations you can abort the merge to merge later. Use +git merge --abort +when you are in a merge process. + +Try to merge both commits and abort the merge afterwards.","Иногда вы хотите слить два коммита, но возникает конфликт слияния, который вы в данный момент не хотите разрешать. + +В таких ситуациях вы можете прервать слияние, чтобы выполнить его позже. Используйте +git merge --abort +когда вы находитесь в процессе слияния. + +Попробуйте слить оба коммита, а затем прервать слияние.",, +mergeabort_congrats_051,"Aaah, let's merge later...","Ааа, давайте сольём позже...",, +mergeabort_win_hint_052,You tried to merge?,Вы пытались выполнить слияние?,, +mergeabort_win_hint_053,You aborted to merge?,Вы прервали слияние?,, +reset_title_054,Resetting files in the index,Сброс файлов в индексе,, +reset_description_055,"See the dark shadow behind the icons? That's the version of the file in the last commit! + +For example, these candles have been blown out, and that change has been added. + +But you decide that this was a mistake! You only want to blow out the red candle in the next commit! + +If you already have updated the index to a changed file, but want to reset it, you can use git reset!","Видите тёмную тень за иконками? Это версия файла в последнем коммите! + +Например, эти свечи были задуты, и это изменение было добавлено. + +Но вы решаете, что это была ошибка! Вы хотите задуть только красную свечу в следующем коммите! + +Если вы уже обновили индекс изменённым файлом, но хотите сбросить его, вы можете использовать git reset!",, +reset_win_hint_056,Reset the changes in the green and blue candles!,Сбросьте изменения в зелёной и синей свечах!,, +reset_win_hint_057,And make a commit!,И сделайте коммит!,, +change_title_058,Update files in the index,Обновление файлов в индексе,, +change_description_059,"When we change files, the index won't change on its own. We have to use git add to update the index to the changed version of the file. + +Let's try that! + +The icons in the file browser show you when the actual file (white) and the version in the index (blue) are different, and when they are the same!","Когда мы меняем файлы, индекс сам по себе не изменится. Мы должны использовать git add, чтобы обновить индекс до изменённой версии файла. + +Давайте попробуем! + +Иконки в файловом браузере показывают, когда фактический файл (белый) и версия в индексе (синий) отличаются, и когда они одинаковы!",, +rm_title_060,Delete a file in the next commit,Удалить файл в следующем коммите,, +rm_description_061,"If you want to remove a file in the next commit, you can use git rm! This will both delete the file locally, and in the index. + +If a file is modified, you'll need to reset these changes first/reset the files.","Если вы хотите удалить файл в следующем коммите, вы можете использовать git rm! Это удалит файл как локально, так и в индексе. + +Если файл изменён, вам нужно сначала сбросить эти изменения/сбросить файлы.",, +rm_win_hint_062,Make a commit where all files are deleted ¯_(^^)/¯,"Сделайте коммит, в котором удалены все файлы ¯_(^^)/¯", +steps_title_063,Adding changes step by step,Добавление изменений шаг за шагом,, +steps_description_064,"The index is really useful, because it allows us to be precise about which changes we want to include in each commit!","Индекс действительно полезен, потому что он позволяет нам точно определять, какие изменения мы хотим включить в каждый коммит!",, +steps_win_hint_065,"Make changes to all three objects, to form a logical sequence of events!","Внесите изменения во все три объекта, чтобы сформировать логическую последовательность событий!",, +steps_win_hint_066,Only add one of these changes!,Добавьте только одно из этих изменений!,, +steps_win_hint_067,And make a commit.,И сделайте коммит.,, +steps_win_hint_068,Make a second commit that only records a single change.,"Сделайте второй коммит, который фиксирует только одно изменение.", +steps_win_hint_069,And a third one.,И третий.,, +compare_title_070,Step by step,Шаг за шагом,, +compare_description_071,"Welcome to today's lesson! We're going to learn how to make commits with more precision! + +Have a look at these two timelines. They have exactly the same outcome. But one of them makes it much easier to figure out what happened.","Добро пожаловать на сегодняшний урок! Мы научимся делать коммиты с большей точностью! + +Взгляните на эти две временные линии. У них абсолютно одинаковый результат. Но одна из них значительно облегчает понимание того, что произошло.",, +compare_win_hint_072,Right! Having each change in its own commit makes it easier to understand what's going on! Let's learn how to do that!,Верно! Наличие каждого изменения в собственном коммите облегчает понимание происходящего! Давайте научимся это делать!,, +checkout_title_073,Checking out files from the index,Извлечение файлов из индекса,, +checkout_description_074,"So you've made changes to your files, but you decide that you don't want to keep them! You can use git checkout for that! + +What happens if you have already update the index, like in file c? You have to reset the index first!","Итак, вы внесли изменения в свои файлы, но решили, что не хотите их сохранять! Для этого можно использовать git checkout! + +Что произойдет, если вы уже обновили индекс, как в файле c? Сначала нужно сбросить индекс!",, +checkout_win_hint_075,Remove all changes in your local files!,Удалите все изменения в ваших локальных файлах!,, +add_title_076,Updating files in the index,Обновление файлов в индексе,, +add_description_077,"So you start working, and make changes to your files! Git lets you choose which of these changes you want to put in the next commit. This is like updating the index version of that file to the new version. + +This allows you to have smaller commits, that describe better what you changed! + +The command for this is the same - git add!","Итак, вы начинаете работать и вносите изменения в свои файлы! Git позволяет вам выбрать, какие из этих изменений вы хотите поместить в следующий коммит. Это похоже на обновление версии файла в индексе до новой версии. + +Это позволяет вам делать более мелкие коммиты, которые лучше описывают, что вы изменили! + +Команда для этого та же - git add!",, +add_congrats_078,"Well done! Try travelling between the commits using git checkout, so you can look at their contents again!","Отлично! Попробуйте перемещаться между коммитами с помощью git checkout, чтобы снова посмотреть их содержимое!",, +add_win_hint_079,Make changes to all files!,Внесите изменения во все файлы!,, +add_win_hint_080,"Add only the changes of a and c, and make a commit! Finally, make a commit which captures the changes in b!","Добавьте только изменения файлов a и c и сделайте коммит! Наконец, сделайте коммит, который зафиксирует изменения в файле b!",, +new_title_081,Add new files to the index,Добавление новых файлов в индекс,, +new_description_082,"So far, when we made a commit, we've always recorded the current status of all objects, right? + +But Git allows you to pick which changes you want to put in a commit! + +To learn how that works, we need to learn about the ""index""! In the index, we can prepare what will be in the next commit. In this game, the index is represented by a blue aura around icons in the file browser! + +Initially, the index is empty. To make a commit that contains a new file, we need to add it!","До сих пор, когда мы делали коммит, мы всегда записывали текущее состояние всех объектов, верно? + +Но Git позволяет вам выбирать, какие изменения вы хотите поместить в коммит! + +Чтобы узнать, как это работает, нам нужно узнать об ""индексе""! В индексе мы можем подготовить то, что будет в следующем коммите. В этой игре индекс представлен синей аурой вокруг иконок в файловом браузере! + +Изначально индекс пуст. Чтобы сделать коммит, содержащий новый файл, нам нужно его добавить!",, +new_win_hint_083,Add the candle.,Добавьте свечу.,, +new_win_hint_084,Make a commit.,Сделайте коммит.,, +checkoutcommit_title_085,Moving111 through time,Перемещение во времени,, +checkoutcommit_description_086,"The yellow boxes are frozen points in time, we call them ""commits""! You can travel between them using the ""checkout"" card! (Try it!) + +Can you find out what happened here? Then, while on the last commit, edit the files to fix the problem, and make a new commit!","Желтые ящики - это застывшие моменты времени, мы называем их ""коммитами""! Вы можете путешествовать между ними, используя карту ""checkout""! (Попробуйте!) + +Сможете ли вы выяснить, что здесь произошло? Затем, находясь на последнем коммите, отредактируйте файлы, чтобы исправить проблему, и сделайте новый коммит!",, +checkoutcommit_congrats_087,"Wonderful! Now that you're getting familiar with the time machine, let's look at some more complicated situations...","Замечательно! Теперь, когда вы осваиваетесь с машиной времени, давайте рассмотрим несколько более сложных ситуаций...",, +checkoutcommit_win_hint_088,Restore sisterly peace.,Восстановите сестринский мир.,, +branchcreate_title_089,Creating branches,Создание веток,, +branchcreate_description_090,"You were invited to two parties! At one of them, your favorite band is playing - and the other one is your best friend's birthday party. Where should you go? No worries - as a time travel agent in training, you can go to both parties! + +To make it easier to tell which timeline is which, you can create time portals! (We call these ""branches"".)","Вас пригласили на две вечеринки! На одной из них играет ваша любимая группа, а другая — день рождения вашего лучшего друга. Куда пойти? Не беспокойтесь — как стажер-агент по путешествиям во времени, вы можете пойти на обе вечеринки! + +Чтобы было легче различать временные линии, вы можете создавать временные порталы! (Мы называем их ""ветками"".)",, +branchcreate_congrats_091,"Now you can travel between those branches easily (using git checkout) - try it! + +Your friend is happy that you made it to the birthday party and you also got your concert ticket signed. Yay!","Теперь вы можете легко перемещаться между этими ветками (используя git checkout) - попробуйте! + +Ваш друг рад, что вы пришли на день рождения, и вы также получили автограф на билете на концерт. Ура!",, +branchcreate_win_hint_092,Create a branch called 'birthday' that points to the birthday timeline.,Создайте ветку с именем 'birthday', которая указывает на временную линию дня рождения., +branchcreate_win_hint_093,Create a branch called 'concert' that points to the concert timeline.,Создайте ветку с именем 'concert', которая указывает на временную линию концерта., +grow_title_094,Branches grow with you!,Ветки растут вместе с вами!,, +grow_description_095,"Note that there are two options to ""travel to the end of a timeline"": + +First, you can directly travel to the commit, like we've done it before. + +And second, you can travel to the branch label. In this case, when you make a new commit, the branch will grow with you, and still point at the end of the timeline!","Обратите внимание, что есть два варианта ""переместиться в конец временной линии"": + +Во-первых, вы можете напрямую переместиться к коммиту, как мы делали это раньше. + +И во-вторых, вы можете переместиться к метке ветки. В этом случае, когда вы делаете новый коммит, ветка будет расти вместе с вами и по-прежнему указывать на конец временной линии!",, +grow_win_hint_096,"Travel directly to the last yellow commit of the birthday timeline, make a change to 'you', and make a commit","Переместитесь напрямую к последнему желтому коммиту временной линии дня рождения, внесите изменение в 'you' и сделайте коммит",, +grow_win_hint_097,"Travel to the blue 'concert' branch, make a change to 'you', and a commit.","Переместитесь к синей ветке 'concert', внесите изменение в 'you' и сделайте коммит.",, +reorder_title_098,Moving branches around,Перемещение веток,, +reorder_description_099,"One of your colleagues messed up here, and put the branches in the wrong timelines! + +You could delete and re-create these branches - but you can also directly move them to different commits, by using + + `git checkout` + +on the branch names, and then using + + `git reset --hard` + +on the commit where you want the branch to be. + +The donut branch is in the right place, but the timeline is still incomplete - make you actually eat the donut in that branch!","Один из ваших коллег здесь напутал и поместил ветки в неправильные временные линии! + +Вы могли бы удалить и заново создать эти ветки, но вы также можете напрямую переместить их в другие коммиты, используя + + `git checkout` + +на именах веток, а затем используя + + `git reset --hard` + +на коммите, где вы хотите, чтобы была ветка. + +Ветка с пончиком находится в правильном месте, но временная линия все еще неполная - убедитесь, что вы действительно съели пончик в этой ветке!",, +reorder_win_hint_100,Did you eat a baguette on the baguette branch?,"Вы съели багет на ветке ""багет""?",, +reorder_win_hint_101,Did you drink a coffee on the coffee branch?,"Вы выпили кофе на ветке ""кофе""?",, +reorder_win_hint_102,Did you eat a donut on the donut branch?,"Вы съели пончик на ветке ""пончик""?",, +fork_title_103,Make parallel commits,Делайте параллельные коммиты,, +fork_description_104,"Did you know that creating parallel timelines is perfectly legal and safe? It's true! + +Can you find out when things went wrong in this zoo? Then, go back to the last good commit and create a parallel universe where everyone is happy!","Знаете ли вы, что создание параллельных временных линий совершенно законно и безопасно? Это правда! + +Сможете ли вы выяснить, когда в этом зоопарке все пошло не так? Затем вернитесь к последнему удачному коммиту и создайте параллельную вселенную, где все счастливы!",, +fork_congrats_105,"Whew, good job! This seems like a much better outcome. + +Feel free to add more parallel timelines, or make them longer. + +If you're ready, our next mission is already waiting...","Уф, хорошая работа! Это кажется гораздо лучшим исходом. + +Не стесняйтесь добавлять больше параллельных временных линий или делать их длиннее. + +Если вы готовы, наша следующая миссия уже ждет...",, +fork_win_hint_106,Make sure that the child is happy.,"Убедитесь, что ребенок счастлив.", +fork_win_hint_107,Make sure that the lion gets something to eat.,"Убедитесь, что лев получил что-нибудь поесть.", +branchremove_title_108,Deleting branches,Удаление веток,, +branchremove_description_109,"Life is full of dangers, right? Even when walking to school, it seems like there's a lot of risks! + +This Monday is especially bad. You made it to school, but there's some timelines you definitely don't want to keep around.","Жизнь полна опасностей, верно? Даже по дороге в школу, кажется, много рисков! + +Этот понедельник особенно плох. Вы добрались до школы, но есть некоторые временные линии, которые вы определенно не хотите сохранять.",, +branchremove_congrats_110,"On second thought, maybe you even prefer the ice cream timeline to the main one? :)","Хотя, если подумать, может быть, вы даже предпочитаете временную линию с мороженым основной? :)",, +branchremove_win_hint_111,Find the bad branches and delete them. Keep only the best one.,Найдите плохие ветки и удалите их. Оставьте только лучшую.,, +cli_title_112,The command line,Командная строка,, +cli_description_113,These playing cards are designed to be easy to use and to remember! We'd suggest sticking to them if you don't have a lot of experience with Git!,"Эти игральные карты разработаны так, чтобы их было легко использовать и запоминать! Мы бы посоветовали придерживаться их, если у вас не так много опыта работы с Git!" +cli_congrats_114,"Cool! Instead of using the playing cards, you can also do everything via the command line! + +The command line is pretty powerful! Often, you can use it to solve tasks faster compared to using a graphical interface.","Круто! Вместо использования игральных карт вы также можете делать все через командную строку! + +Командная строка довольно мощная! Часто вы можете использовать ее для решения задач быстрее по сравнению с использованием графического интерфейса.",, +cli_win_hint_115,Initialize the time machine!,Инициализируйте машину времени!,, +whoareyou_title_116,Welcome to time travel school!,Добро пожаловать в школу путешествий во времени!,, +whoareyou_description_117,"You're still pretty confused by everything that's going on. The next day, you decide to enroll in time travel school! + +Your time travel teacher welcomes you: ""Hello there! Wanna tell us your name?""","Вы все еще в замешательстве от всего происходящего. На следующий день вы решаете записаться в школу путешествий во времени! + +Ваш учитель по путешествиям во времени приветствует вас: ""Привет! Хочешь сказать нам свое имя?""",, +whoareyou_congrats_118,"We're so glad to have you! + +Git can help you fix problems in the past! It allows you to collaborate with other students of time travel! It's really powerful, and it's really popular! I'll see you for your first lesson tomorrow!","Мы так рады видеть вас! + +Git может помочь вам исправить проблемы в прошлом! Он позволяет вам сотрудничать с другими учениками путешествий во времени! Он действительно мощный и очень популярный! Увидимся на вашем первом уроке завтра!",, +whoareyou_win_hint_119,Introduce yourself.,Представьтесь.,, +whoareyou_win_hint_120,"Fill out the enrollment form, and commit it!",Заполните форму зачисления и закоммитьте ее!,, +init_title_121,Enter the time machine,Войдите в машину времени,, +init_description_122,"You've been accepted to time travel school! Yay! It's your first day! Your teacher explains: + +""To do anything with a time machine, you first need to initialize it!"" + +Drag that blue card up to play it!","Вас приняли в школу путешествий во времени! Ура! Это ваш первый день! Ваш учитель объясняет: + +""Чтобы что-то делать с машиной времени, сначала нужно ее инициализировать!"" + +Перетащите эту синюю карту вверх, чтобы сыграть ею!",, +init_congrats_123,"Nice! See that little owl squirrel that appeared? It will be your companion, and always show you where you are in time!","Отлично! Видите эту маленькую сову-белку, которая появилась? Она будет вашим спутником и всегда будет показывать, где вы находитесь во времени!",, +risky_title_124,Living dangerously,Жить опасно,, +risky_description_125,"So you have decided to apply for time travel school, to learn how to use this time machine called ""Git""! + +How exciting! + +You're almost done with the paperwork! You just need to fill in one more reason why you want to learn Git.","Итак, вы решили подать заявление в школу путешествий во времени, чтобы научиться пользоваться этой машиной времени под названием ""Git""! + +Как захватывающе! + +Вы почти закончили с документами! Вам просто нужно указать еще одну причину, почему вы хотите изучать Git.",, +risky_congrats_126,"Suddenly, your cat jumps on the table, snatches away the form, and runs away! Oh no. All your hard work, gone! + +You clearly need a better solution. + +(Click ""Next Level"" as soon as you're ready!)","Внезапно ваша кошка запрыгивает на стол, хватает анкету и убегает! О нет. Вся ваша тяжелая работа насмарку! + +Вам явно нужно лучшее решение. + +(Нажмите ""Следующий уровень"", как только будете готовы!)",, +risky_win_hint_127,Add another line to form.txt!,Добавьте еще одну строку в form.txt!,, +remote_title_128,Working together,Работаем вместе,, +remote_description_129,"Let's add your name to our list of students! + +I already have a second commit of it in my time machine - let's work together!","Давайте добавим ваше имя в наш список студентов! + +У меня уже есть второй коммит этого в моей машине времени - давайте работать вместе!",, +remote_congrats_130,Welcome to time travel school! :) I'll see you for your first class tomorrow!,Добро пожаловать в школу путешествий во времени! :) Увидимся на вашем первом занятии завтра!,, +remote_win_hint_131,Get the second commit from your teacher using git pull.,Получите второй коммит от вашего учителя, используя git pull., +remote_win_hint_132,Add your name to the list of students,Добавьте свое имя в список студентов,, +remote_win_hint_133,Commit your result.,Закоммитьте свой результат.,, +commit_title_134,Your first commit,Ваш первый коммит,, +commit_description_135,"You can use your time machine to make snapshots of objects around you! Here, let's practice this! + +(Your teacher pours some water into a glass.)","Вы можете использовать свою машину времени, чтобы делать снимки объектов вокруг вас! Давайте попрактикуемся! + +(Ваш учитель наливает немного воды в стакан.)",, +commit_congrats_136,"Nice! You can try making some additional commits. When you feel comfortable, click on ""Next Level"".","Отлично! Вы можете попробовать сделать еще несколько коммитов. Когда почувствуете себя уверенно, нажмите ""Следующий уровень"".",, +commit_win_hint_137,"Make a snapshot of the glass (a ""commit"")","Сделайте снимок стакана (""коммит"")",, +commit_win_hint_138,Change the contents of the glass!,Измените содержимое стакана!,, +commit_win_hint_139,And make a second commit!,И сделайте второй коммит!,, +copies_title_140,Making backups,Создание резервных копий,, +copies_description_141,"This time, you're making a lot of backup copies - you can look at them by clicking on them!","На этот раз вы делаете много резервных копий - вы можете посмотреть их, кликнув по ним!",, +copies_congrats_142,"Okay, this kind of works. + +But you're a bit worried that you'll end up with hundreds of copies of this form, and it will be hard to keep track of all of them. + +And especially when working with other people, sending copies back and forth doesn't seem ideal. + +You can't wait to try these time machines!","Хорошо, это вроде бы работает. + +Но вы немного обеспокоены тем, что у вас окажутся сотни копий этой формы, и будет трудно отслеживать их все. + +И особенно при работе с другими людьми, отправка копий туда и обратно не кажется идеальным решением. + +Вам не терпится опробовать эти машины времени!",, +copies_win_hint_143,Add another line to form2_really_final.txt!,Добавьте еще одну строку в form2_really_final.txt!,, +stash_title_144,Stashing,Сохранение в тайнике (Stashing),, +stash_description_145,"You will encounter situations in which you are working on your project but you need to put your current changes aside temporarily. To do so, you can use the stash function. Use `git stash push` to add your current changes to the stash stack. + +--- +tipp1 +--- +tipp2 +--- +tipp3","Вы столкнетесь с ситуациями, в которых вы работаете над своим проектом, но вам нужно временно отложить текущие изменения. Для этого вы можете использовать функцию stash. Используйте `git stash push` чтобы добавить ваши текущие изменения в стек тайника (stash). + +--- +tipp1 +--- +tipp2 +--- +tipp3", +stash_congrats_146,Nice stash you got there! :),Хороший у вас тайник! :),, +stash_win_hint_147,Did you stash the current changes?,Вы сохранили текущие изменения в тайнике?,, +stashpop_title_148,Pop from Stash,Извлечь из тайника (Pop from Stash),, +stashpop_description_149,"When you stashed your changes and you want to apply them back to your current working directory, you can use `git stash pop`. +This will remove the changes from the stash stack. If you also want to keep the changes on the stash stack, use `git stash apply`. + +--- +tipp1 +--- +tipp2 +--- +tipp3","Когда вы сохранили свои изменения в тайнике и хотите применить их обратно в свой текущий рабочий каталог, вы можете использовать `git stash pop` +Это удалит изменения из стека тайника. Если вы также хотите сохранить изменения в стеке тайника, используйте `git stash apply`. + +--- +tipp1 +--- +tipp2 +--- +tipp3",, +stashpop_congrats_150,"Yay, you got your changes back! :)","Ура, вы вернули свои изменения! :)",, +stashpop_win_hint_151,Did you pop the changes from the stash stack?,Вы извлекли изменения из стека тайника?,, +stashclear_title_152,Clear the Stash,Очистить тайник (Clear the Stash),, +stashclear_description_153,"If you want to inspect your stash stack, use the command + + git stash list + +Oh, you don't want to keep your stashed changes? There are way too many? Then go ahead and clear the stack with + + git stash clear + +If you only want to discard a certain stash entry, you can use + + git stash drop + +Clear your stash stack! + +--- +tipp1 +--- +tipp2 +--- +tipp3","Если вы хотите просмотреть свой стек тайника, используйте команду + + git stash list + +О, вы не хотите сохранять свои изменения из тайника? Их слишком много? Тогда смело очищайте стек с помощью + + git stash clear + +Если вы хотите отбросить только определенную запись тайника, вы можете использовать + + git stash drop + +Очистите свой стек тайника! + +--- +tipp1 +--- +tipp2 +--- +tipp3",, +stashclear_congrats_154,All clear! :),Все чисто! :),, +stashclear_win_hint_155,Did you clear your stash stack?,Вы очистили свой стек тайника?,, +stashmerge_title_156,Merging popped stash,Слияние извлеченных из тайника изменений,, +stashmerge_description_157,"When you want to re-apply your changes but you already continued working on your file, you might get a merge conflict! Let's practice this situation. +Pop the changes from the stash with + + git stash pop + +and resolve the merge conflict. Commit the resolved changes and clear the stash stack afterwards. + +--- +tipp1 +--- +tipp2 +--- +tipp3","Когда вы хотите повторно применить свои изменения, но уже продолжили работу над файлом, вы можете получить конфликт слияния! Давайте попрактикуемся в этой ситуации. +Извлеките изменения из тайника с помощью + + git stash pop + +и разрешите конфликт слияния. Закоммитьте разрешенные изменения и после этого очистите стек тайника. + +--- +tipp1 +--- +tipp2 +--- +tipp3",, +stashmerge_win_hint_158,Did you resolve the conflict and commit?,Вы разрешили конфликт и закоммитили?,, +stashmerge_win_hint_159,Did you clear stash stack?,Вы очистили стек тайника?,, +stashbranch_title_160,Branch from stash,Ветка из тайника,, +stashbranch_description_161,"If you want to keep your changes but they don't belong to the main branch, you can easily create a new branch from your stashed changes. Just use + + git stash branch + +If you just want to use the latest stash entry, you can leave the option empty. + +Create a new branch from the stashed changes! + +--- +tipp1 +--- +tipp2 +--- +tipp3","Если вы хотите сохранить свои изменения, но они не относятся к основной ветке, вы можете легко +создать новую ветку из ваших изменений в тайнике. Просто используйте + + git stash branch <имя_ветки> + +Если вы просто хотите использовать последнюю запись из тайника, вы можете оставить опцию пустой. + +Создайте новую ветку из изменений в тайнике! + +--- +tipp1 +--- +tipp2 +--- +tipp3",, +stashbranch_congrats_162,Stashed changes are in a new branch! :),Изменения из тайника теперь в новой ветке! :),, +stashbranch_win_hint_163,Did you create a new branch from the stashed changes?,Вы создали новую ветку из изменений в тайнике?,, +whoareyou_title_164,Nice to meet you!,Приятно познакомиться!,, +whoareyou_description_165,"Introduce yourself using + + git config --global user.name Firstname + git config --global user.email ""your@mail.com""","Представьтесь, используя + + git config --global user.name Имя + git config --global user.email ""your@mail.com""`" +whoareyou_win_hint_166,Have a name configured.,Имя настроено.,, +whoareyou_win_hint_167,Have an email address configured.,Адрес электронной почты настроен.,, +clone_title_168,Cloning a repo,Клонирование репозитория,, +clone_description_169,"Get your friend's repo using `clone`, change something, push it back.","Получите репозиторий вашего друга с помощью `clone`, измените что-нибудь, отправьте обратно.",, +init_title_170,Welcome!,Добро пожаловать!,, +init_win_hint_171,"Again, initialize your time machine!",Снова инициализируйте вашу машину времени!,, +split_title_172,Split a commit!,Разделить коммит!,, +split_description_173,"Here, both changes happened in one commit! Split them to be in two commits instead.",Здесь оба изменения произошли в одном коммите! Разделите их на два коммита.,, +steps_title_174,One step after another,Шаг за шагом,, +steps_description_175,"Sometimes, you might want to record the order in which things changed, instead of making a single commit. + +What happened here? Make two commits from the changes (using the ""add"" card), in an order that makes sense!","Иногда вы можете захотеть записать порядок, в котором происходили изменения, вместо того, чтобы делать один коммит. + +Что здесь произошло? Сделайте два коммита из изменений (используя карту ""add""), в осмысленном порядке!",, +commita_title_176,"Make a commit, but faster!","Сделай коммит, но быстрее!",, +commita_description_177,"There is a time-saving trick, where instead of a plain git commit, you can use + + git commit -a + +This will automatically add all changes you made to local files! Very convenient.","Есть трюк для экономии времени, где вместо обычного git commit вы можете использовать + + git commit -a + +Это автоматически добавит все изменения, которые вы внесли в локальные файлы! Очень удобно.",, +commita_win_hint_178,"Make a commit where all files contain ""x"".","Сделайте коммит, в котором все файлы содержат ""x"".",, +filesmove_title_179,No sleep required,Сон не требуется,, +filesmove_description_180,"Actually, you decide that you don't need any sleep. + +Because of that, you won't require a bed, and can build some other piece of furniture from the wood!","На самом деле, вы решаете, что вам не нужен сон. + +Из-за этого вам не понадобится кровать, и вы можете сделать какой-нибудь другой предмет мебели из дерева!",, +filesmove_congrats_181,"Neat! It even still looks a bit comfortable! + +You head out, eager for your first lesson at time travel school!","Классно! Она даже все еще выглядит немного удобной! + +Вы отправляетесь, с нетерпением ожидая своего первого урока в школе путешествий во времени!",, +filesmove_win_hint_182,"Rename the bed into something else, and give it a new description!",Переименуйте кровать во что-то другое и дайте ей новое описание!,, +remotesdelete_title_183,Deleting and renaming a remote,Удаление и переименование удаленного репозитория,, +remotesdelete_description_184,"Here, you already have two remotes configured! You can list them using `git remote`.",Здесь у вас уже настроено два удаленных репозитория! Вы можете их перечислить с помощью `git remote`,, +remotesdelete_win_hint_185,Rename the remote with the typo (using `git remote rename [old name] [new name]`),Переименуйте удаленный репозиторий с опечаткой (используя `git remote rename [старое имя] [новое имя]`),, +remotesdelete_win_hint_186,The remote with the typo is gone.,Удаленный репозиторий с опечаткой исчез.,, +remotesdelete_win_hint_187,Delete the remote you don't want to keep (using `git remote remove [remote]`),Удалите удаленный репозиторий, который вы не хотите сохранять (используя `git remote remove [remote]`), +commit_title_188,Make a commit \o/,Сделайте коммит \o/,, +commit_description_189,"For practice, make a commit where all files contain an ""x""!","Для практики сделайте коммит, в котором все файлы содержат ""x""!",, +commit_win_hint_190,"File a contains ""x"" in the last main commit.","Файл a содержит ""x"" в последнем коммите ветки main.",, +commit_win_hint_191,"File b contains ""x"" in the last main commit.","Файл b содержит ""x"" в последнем коммите ветки main.",, +commit_win_hint_192,"File c contains ""x"" in the last main commit.","Файл c содержит ""x"" в последнем коммите ветки main.",, +pullpush_title_193,Helping each other,Помогая друг другу,, +pullpush_description_194,"The events and timelines you see are always only what your own time machine knows about! + +Of course, time agents don't have to work alone! Here, your sidekick has already prepared a merge for you! You can use the ""pull"" card to transfer it to your own time machine. + +Then, add another event on top (what does Sam have for dinner?), and push the result, to transfer it back to your sidekick! + +You can only ever manipulate things in your own time machine (the one on the bottom).","События и временные линии, которые вы видите, - это всегда только то, что знает ваша собственная машина времени! + +Конечно, временные агенты не обязаны работать в одиночку! Здесь ваш помощник уже подготовил для вас слияние! Вы можете использовать карту ""pull"", чтобы перенести его в свою машину времени. + +Затем добавьте еще одно событие сверху (что Сэм ест на ужин?) и push результат, чтобы передать его обратно вашему помощнику! + +Вы можете манипулировать вещами только в своей собственной машине времени (той, что внизу).",, +pullpush_congrats_195,"In reality, in many cases, a lot of time agents work together to build a really good future together! :)","В реальности, во многих случаях, множество временных агентов работают вместе, чтобы построить действительно хорошее будущее! :)",, +fetch_title_196,Fetching from remotes,Получение данных с удаленных репозиториев,, +fetch_description_197,"Here, you already have two remotes configured! You can list them using `git remote`. + +Fetch from both, and look at the suggestions. + +Then, make a new commit on top of your original one that introduces a compromise.","Здесь у вас уже настроено два удаленных репозитория! Вы можете их перечислить, используя `git remote`. + +Получите данные с обоих и посмотрите на предложения. + +Затем сделайте новый коммит поверх вашего оригинального, который вводит компромисс.",, +fetch_win_hint_198,Your proposal is acceptable for friend1.,Ваше предложение приемлемо для friend1.,, +fetch_win_hint_199,Your proposal is acceptable for friend2.,Ваше предложение приемлемо для friend2.,, +remotesadd_title_200,Adding a remote,Добавление удаленного репозитория,, +remotesadd_description_201,"Let's work together with others! Your friend has their own repo at the URL `../friend` - you can add it using + + git remote add [name] [URL] + +where `[name]` is an arbitrary, short name you pick for the remote. + +When you've done that, you can get all commits from that remote using + + git pull friend + +There's a letter for you!","Давайте работать вместе с другими! У вашего друга есть свой собственный репозиторий по URL `../friend` - вы можете добавить его, используя + + git remote add [имя] [URL] + +где `[имя]` - это произвольное, короткое имя, которое вы выбираете для удаленного репозитория. + +Когда вы это сделаете, вы можете получить все коммиты с этого удаленного репозитория, используя + + git pull friend + +Для вас есть письмо!",, +remotesadd_win_hint_202,Add a remote that points to ../friend.,Добавьте удаленный репозиторий, который указывает на `../friend`., +remotesadd_win_hint_203,Pull from the remote.,Получите данные с удаленного репозитория.,, +checkout_title_204,Getting the last version,Получение последней версии,, +checkout_description_205,"You've been working on your essay for a while. But - ughh! Now your cat walks over your keyboard and ""helps you"", so now it's all messed up! :/ + +But Git is here to help! To discard all changes your cat made, and go back to the version in the last commit, use checkout!","Вы уже некоторое время работаете над своим эссе. Но - ух! Теперь ваша кошка прошлась по клавиатуре и ""помогла вам"", так что теперь все испорчено! :/ + +Но Git здесь, чтобы помочь! Чтобы отменить все изменения, которые сделала ваша кошка, и вернуться к версии в последнем коммите, используйте checkout!",, +checkout_win_hint_206,Restore the version from the last commit.,Восстановите версию из последнего коммита.,, +restore_title_207,Looking into the past,Заглядывая в прошлое,, +restore_description_208,"You've been working on your essay for a while. But you're not happy with the changes you've made recently. You want to go back to the version called ""Best version""! + +No problem, you can use the checkout card to restore your essay from an older commit!","Вы уже некоторое время работаете над своим эссе. Но вы недовольны недавними изменениями. Вы хотите вернуться к версии под названием ""Лучшая версия""! + +Нет проблем, вы можете использовать карту checkout, чтобы восстановить свое эссе из более старого коммита!",, +restore_win_hint_209,"For nostalgic reasons, restore the very first backup you made!","Из ностальгических соображений восстановите самую первую резервную копию, которую вы сделали!",, +indexmv_title_210,Rename a file in the next commit,Переименовать файл в следующем коммите,, +indexmv_description_211,"Other times, you might want to rename a file in the next commit. Use + + git mv [file] [new name] + +for that. The effect is very similar as if you had created a copy with a new name, and removed the old version.","В других случаях вы можете захотеть переименовать файл в следующем коммите. Используйте + + git mv [файл] [новое имя] + +для этого. Эффект очень похож на то, как если бы вы создали копию с новым именем и удалили старую версию.",, +indexmv_win_hint_212,"Make a commit where you rename the file b to ""x"".","Сделайте коммит, в котором вы переименовываете файл b в ""x"".",, +reflog_title_213,Go back to where you were before,"Вернуться туда, где вы были раньше",, +reflog_description_214,"Say you were looking at something in the past, and then switched back to the main branch. + +But then, you got reaaally distracted, and after your lunch break, you can't remember which past commit you were on before. How can you find out? + +There's a convenient command that shows you all the places your `HEAD` has pointed to in the past: + + git reflog","Допустим, вы смотрели что-то в прошлом, а затем переключились обратно на основную ветку. + +Но затем вы ооочень отвлеклись, и после обеденного перерыва не можете вспомнить, на каком прошлом коммите вы были. Как это выяснить? + +Есть удобная команда, которая показывает все места, на которые указывал ваш `HEAD` в прошлом: + + git reflog",, +reflog_win_hint_215,"Find out where you've been before, and go back there!","Узнайте, где вы были раньше, и вернитесь туда!",, +pushedsomethingbroken_title_216,I pushed something broken,Я отправил что-то сломанное,, +pushedsomethingbroken_description_217,"We were talking about how to undo a commit, and fix it. This only helps when you haven't already pushed it to a remote. When that has happened, and you want to undo the effects of the commit completely, your best option is `git revert`","Мы говорили о том, как отменить коммит и исправить его. Это помогает только тогда, когда вы еще не отправили его на удаленный репозиторий. Когда это произошло, и вы хотите полностью отменить эффекты коммита, ваш лучший вариант — `git revert`",, +badcommit_title_218,Undo a bad commit,Отменить плохой коммит,, +badcommit_description_219,"Oh no, we made a bad commit! How can we undo making the commit, and go back to a point where we can try again? + +The answer is using `git reset [commit]`, which does two things: + +It resets the current branch ref to the commit you specify. + +And it resets the index to that commit. + +It does not change your working directory in any way, which means that after that, you can try making the commit you want again.","О нет, мы сделали плохой коммит! Как мы можем отменить создание коммита и вернуться к моменту, когда мы можем попробовать снова? + +Ответ — использование `git reset [коммит]`, которое делает две вещи: + +Сбрасывает ссылку текущей ветки на указанный вами коммит. + +И сбрасывает индекс к этому коммиту. + +Это никак не изменяет ваш рабочий каталог, что означает, что после этого вы можете снова попытаться сделать нужный коммит.",, +badcommit_win_hint_220,"In the last main commit, the numbers file contains the numbers from 1 to 10.",В последнем коммите ветки main файл numbers содержит числа от 1 до 10.,, +badcommit_win_hint_221,"The commit message of that commit is ""More numbers"".","Сообщение этого коммита — ""Больше чисел"".",, +badcommit_win_hint_222,The commit with the typo is not part of the main branch anymore.,Коммит с опечаткой больше не является частью основной ветки.,, +restoreafilefromthepast_title_223,Restore a file from the past,Восстановить файл из прошлого,, +restoreafilefromthepast_description_224,"Here's a similar problem: you really liked the essay from the very first commit, and want to have it back! Well, checkout can also restore things from older commits, Here's how: + + git checkout [commit] [file]","Вот похожая проблема: вам очень понравилось эссе из самого первого коммита, и вы хотите его вернуть! Что ж, checkout также может восстанавливать вещи из более старых коммитов. Вот как: + + git checkout [коммит] [файл]",, +restoreafilefromthepast_win_hint_225,"Get the first version of your essay, and make a new commit with it.",Получите первую версию вашего эссе и сделайте с ней новый коммит.,, +restoreafile_title_226,Restore a deleted file,Восстановить удаленный файл,, +restoreafile_description_227,"Oops - you deleted the ""essay"" file, which you worked on all night! + +Luckily, Git is here to help! You can use `git checkout` to restore the file!","Ой - вы удалили файл ""эссе"", над которым работали всю ночь! + +К счастью, Git здесь, чтобы помочь! Вы можете использовать `git checkout`, чтобы восстановить файл!",, +restoreafile_win_hint_228,"Restore the essay to contain ""important content""","Восстановите эссе, чтобы оно содержало ""важное содержимое""",, +remotetag_title_229,Remote Tags,Удаленные теги,, +remotetag_description_230,"When you work with remote repositories, tags are not pushed or pulled automatically. + +You can push a tag with + git push +Or all tags with: + git push --tags + +Deleting tags on your remote works with: + git push --delete + +You can also sync + git fetch --prune --prune-tags + +Add a tag named ""v2"" to the last commit and push it to the remote. Also pull the v1 tag to your local repository.","При работе с удаленными репозиториями теги не отправляются и не загружаются автоматически. + +Вы можете отправить тег с помощью + git push <удаленный_репозиторий> <имя_тега> +Или все теги с помощью: + git push <удаленный_репозиторий> --tags + +Удаление тегов на удаленном репозитории работает с помощью: + git push <удаленный_репозиторий> --delete <имя_тега> + +Вы также можете синхронизировать + git fetch <удаленный_репозиторий> --prune --prune-tags + +Добавьте тег с именем ""v2"" к последнему коммиту и отправьте его на удаленный репозиторий. Также загрузите тег v1 в свой локальный репозиторий.",, +remotetag_win_hint_231,v1 tag in your repo,тег v1 в вашем репозитории,, +remotetag_win_hint_232,v2 tag in your repo,тег v2 в вашем репозитории,, +addtaglater_title_233,Tagging later,Добавление тега позже,, +addtaglater_description_234,"But what happens if you forgot to tag your current commit? +No Prob! You can also tag older commits via + + git tag + +Tag the commit ""Adding feature 2"" with the name ""v1""! + +--- +tipp1 +--- +tipp2 +--- +tipp3","Но что делать, если вы забыли поставить тег на текущий коммит? +Нет проблем! Вы также можете ставить теги на более старые коммиты с помощью + + git tag <имя_тега> <хэш_коммита> + +Поставьте тег с именем ""v1"" на коммит ""Adding feature 2""! + +--- +tipp1 +--- +tipp2 +--- +tipp3" +addtaglater_congrats_235,Well done :),Отлично :), +addtaglater_win_hint_236,Did you create a new tag?,Вы создали новый тег?, +removetag_title_237,Removing tags,Удаление тегов, +removetag_description_238,"You added way too many tags? No prob! Delete them with + + git tag -d + +Remove all tags in this repo! + +--- +tipp1 +--- +tipp2 +--- +tipp3","Вы добавили слишком много тегов? Нет проблем! Удалите их с помощью + + git tag -d <имя_тега> + +Удалите все теги в этом репозитории! + +--- +tipp1 +--- +tipp2 +--- +tipp3",, +removetag_win_hint_239,Did you remove all tags?,Вы удалили все теги?,, +addtag_title_240,Creating tags,Создание тегов,, +addtag_description_241,"Some of your commits may be special commits. Maybe you reached a milestone or a new version number. + +You can mark these commits with a special flag called 'tag'. + +Write + + git tag + +to tag your commit.","Некоторые из ваших коммитов могут быть особенными. Возможно, вы достигли важной вехи или нового номера версии. + +Вы можете пометить эти коммиты специальным флагом, называемым 'тег'. + +Напишите + + git tag <имя-тега> + +чтобы пометить ваш коммит.",, +addtag_congrats_242,Nice! You tagged your first commit :),Отлично! Вы пометили свой первый коммит :),, +filesdelete_title_243,Unexpected Roommates,Неожиданные соседи по комнате,, +filesdelete_description_244,"The first day at Time Travel School comes to an end and you receive the key to your room. +Full of excitement you open the door just to find... spider webs! Spider webs everywhere! + +Remove all the spider webs you can find with the remove card!","Первый день в Школе Путешествий во Времени подходит к концу, и вы получаете ключ от своей комнаты. +Полные восторга, вы открываете дверь и обнаруживаете... паутину! Паутина повсюду! + +Уберите всю паутину, которую сможете найти, с помощью карты удаления!",, +filesdelete_congrats_245,Your room looks now very tidy and cozy! Time to unpack your stuff!,Ваша комната теперь выглядит очень опрятной и уютной! Время распаковывать вещи!,, +filesdelete_win_hint_246,Remove all spider webs.,Уберите всю паутину.,, +filesdelete_win_hint_247,But make sure you keep your bed!,"Но убедитесь, что вы оставили свою кровать!", +filesadd_title_248,Interior design,Дизайн интерьера,, +filesadd_description_249,"Now that your room looks tidy, you can start to unpack your stuff. You brought two new pieces of furniture with you and with a bright smile, +you see that their colors match the color of your bed! + +Build up your two pieces of furniture by playing the touch card. +Then name your furniture - you can choose whatever you like. + +Make sure the colors match! You can find the bed's color in its description. +Don't forget to add a color and description to your new furnitures, too!","Теперь, когда ваша комната выглядит опрятно, вы можете начать распаковывать свои вещи. Вы привезли с собой два новых предмета мебели и с яркой улыбкой +замечаете, что их цвета совпадают с цветом вашей кровати! + +Соберите свои два предмета мебели, сыграв карту касания. +Затем назовите свою мебель - вы можете выбрать любое название. + +Убедитесь, что цвета совпадают! Цвет кровати вы можете найти в ее описании. +Не забудьте также добавить цвет и описание для вашей новой мебели!",, +filesadd_congrats_250,Don't you immediately feel more at home?,Разве вы не чувствуете себя сразу как дома?,, +filesadd_win_hint_251,Add two more pieces of furniture,Добавьте еще два предмета мебели,, +filesadd_win_hint_252,Make sure the colors match your bed's color.,Убедитесь, что цвета соответствуют цвету вашей кровати., +rebase_title_253,Rebasing,Перебазирование (Rebasing),, +rebase_description_254,"Okay - turns out that saving time in the morning by utilizing parallel universes is against the regulations of the International Time Travel Association. You'll have to do your tasks in sequence after all. + +See the ""rebase"" card? When you drag it to a commit, it will copy the events in your current timeline after the specified one! This way, make a clean, linear timeline where you visit all three shops. + +Again, we want to make that our base reality - the ""main"" branch should point to that timeline!","Хорошо - оказывается, экономия времени по утрам за счет использования параллельных вселенных противоречит правилам Международной Ассоциации Путешествий во Времени. В конце концов, вам придется выполнять свои задачи последовательно. + +Видите карту ""rebase""? Когда вы перетаскиваете ее на коммит, она скопирует события из вашей текущей временной линии после указанного! Таким образом, создайте чистую, линейную временную линию, где вы посещаете все три магазина. + +Опять же, мы хотим сделать это нашей базовой реальностью - ветка ""main"" должна указывать на эту временную линию!",, +rebase_congrats_255,"Notice how the other timelines and commits are still there - if anything goes wrong, you can also travel back to them. + +It's really hard to actually destroy stuff with your time machine.","Обратите внимание, как другие временные линии и коммиты все еще на месте - если что-то пойдет не так, вы также можете вернуться к ним. + +На самом деле очень трудно уничтожить что-либо с помощью вашей машины времени.",, +rebase_win_hint_256,Order all tree branches into one and move the main branch ref,Упорядочите все ветви дерева в одну и переместите ссылку основной ветви,, +reorder_title_257,Reordering events,Изменение порядка событий,, +reorder_description_258,"Oops, looks like there's something messed up here. Can you put the events back into their correct order? + +There are two ways to do this: You can drag the ""interactive rebase"" card to the commit before the one you want to change, then reorder the lines in the file that opens, and save it. + +Or you can reset the main tag to the very first commit, and then cherry-pick single commits in the order you want. You have cards for both approaches!","Ой, похоже, здесь что-то напутано. Можете ли вы вернуть события в правильном порядке? + +Есть два способа сделать это: Вы можете перетащить карту ""interactive rebase"" на коммит перед тем, который вы хотите изменить, затем изменить порядок строк в открывшемся файле и сохранить его. + +Или вы можете сбросить основной тег на самый первый коммит, а затем выбрать отдельные коммиты (`cherry-pick`) в нужном порядке. У вас есть карты для обоих подходов!",, +reorder_congrats_259,Feel free to reset the level and try the other strategy! Which one do you like better?,Не стесняйтесь сбросить уровень и попробовать другую стратегию! Какая вам нравится больше?,, +reorder_win_hint_260,Reorder the commits to dress yourself in the correct way,"Измените порядок коммитов, чтобы одеться правильно", +bisect_title_261,Yellow brick road,Дорога из желтого кирпича,, +bisect_description_262,"(Please zoom out a bit using your mouse wheel! :D) + +Oh no! You have lost your key at some point during the day! + +Sure, you could look at every single commit in an attempt to find it - but there's a better way: your time machine has a built-in way to find the point in time where things went wrong quickly! + +First, play the ""bisect start"" card. Then, go to a commit where you don't have the key, and play the ""bisect bad"" card. Likewise, go to a commit early on where you have the key in your pocket, and play the ""bisect good"" card. + +After you've found the last good commit, reset the main branch to it. What happened to the key after you lost it?","(Пожалуйста, немного уменьшите масштаб с помощью колеса мыши! :D) + +О нет! Вы потеряли свой ключ в какой-то момент в течение дня! + +Конечно, вы могли бы просмотреть каждый отдельный коммит в попытке найти его - но есть способ лучше: у вашей машины времени есть встроенный способ быстро найти момент времени, когда все пошло не так! + +Сначала сыграйте карту ""bisect start"". Затем перейдите к коммиту, где у вас нет ключа, и сыграйте карту ""bisect bad"". Аналогично, перейдите к раннему коммиту, где у вас есть ключ в кармане, и сыграйте карту ""bisect good"". + +После того, как вы найдете последний хороший коммит, сбросьте основную ветку на него. Что случилось с ключом после того, как вы его потеряли?",, +bisect_congrats_263,"Well done! :) The only problem is that you now have to walk all the way back home, again...","Отлично! :) Единственная проблема в том, что теперь вам снова придется идти пешком до самого дома...",, +bisect_win_hint_264,Find the last good commit,Найдите последний хороший коммит,, +gitignore_title_265,Ignoring files,Игнорирование файлов,, +gitignore_description_266,"That chicken is running around a lot, and changing often. We don't want to have it in our commits. + +Add it to the file .gitignore, and try using `git add .`!","Эта курица много бегает и часто меняется. Мы не хотим, чтобы она была в наших коммитах. + +Добавьте ее в файл .gitignore и попробуйте использовать `git add .`!",, +pr_description_267,"Your friend has a problem! Clone the repo located in ../friend, create a branch called ""solution"", and fix the problem in this branch. When you're ready, make a ""Pull Request"" by using git tag pr.","У вашего друга проблема! Клонируйте репозиторий, находящийся в ../friend, создайте ветку с именем ""solution"" и исправьте проблему в этой ветке. Когда будете готовы, сделайте ""Pull Request"", используя git tag pr.",, +empty_title_268,Empty sandbox,Пустая песочница,, +empty_description_269,This is an empty sandbox you can play around in.,Это пустая песочница, в которой вы можете поиграть., +threecommits_title_270,Sandbox with three commits,Песочница с тремя коммитами,, +threecommits_description_271,"Here's a sandbox you can play around in. + +You can use both the playing cards, as well as the terminal. This is a real Git terminal! Fun things to try: + +Make a commit that merges three timelines together at once! + +Create and delete some tags! + +Make a timeline that's completely independent of the rest!","Вот песочница, в которой можно поиграть. + +Вы можете использовать как игральные карты, так и терминал. Это настоящий Git-терминал! Что можно попробовать: + +Сделать коммит, который объединяет три временные линии одновременно! + +Создать и удалить несколько тегов! + +Создать временную линию, полностью независимую от остальных!",, +remote_title_272,Sandbox with a remote,Песочница с удаленным репозиторием,, +remote_description_273,"Here's a sandbox with a remote! Try pulling, fetching, or pushing! + +How can you push tags and branches on a remote? How can you delete them again?","Вот песочница с удаленным репозиторием! Попробуйте pull, fetch или push! + +Как можно отправлять теги и ветки на удаленный репозиторий? Как их можно снова удалить?",, +treenested_description_274,"Trees can also point to other trees! This way, they can describe nested directory structures. + +When you add a file inside of a directory to the index, and then call `git write-tree`, it will create a nested tree for the directory, and attach the blob to it. + +To solve this level, build a little stick figure, as shown on the left - a tree that points to two blobs, as well to a tree that points to two blobs.","Деревья также могут указывать на другие деревья! Таким образом, они могут описывать вложенные структуры каталогов. + +Когда вы добавляете файл внутри каталога в индекс, а затем вызываете `git write-tree`, это создаст вложенное дерево для каталога и прикрепит к нему блоб. + +Чтобы решить этот уровень, постройте маленькую фигурку из палочек, как показано слева - дерево, которое указывает на два блоба, а также на дерево, которое указывает на два блоба.",, +indexupdate_description_275,"Instead of removing an entry from the index and adding one with the same name, you can also directly update that entry! + +Put the content you want in a file with a matching name, and then run + + git update-index + +This will create a new blob, and update the hash of the entry to that blob. + +Update an entry in the index!","Вместо удаления записи из индекса и добавления новой с тем же именем, вы также можете напрямую обновить эту запись! + +Поместите желаемое содержимое в файл с соответствующим именем, а затем выполните + + git update-index <файл> + +Это создаст новый блоб и обновит хэш записи до этого блоба. + +Обновите запись в индексе!",, +indexupdate_win_hint_276,This is not really a good test for the winning condition...,Это не очень хороший тест для условия победы...,, +indexremove_description_277,"To remove an entry from the index, use a command like this: + + git update-index --force-remove + +Remove all entries from the index!","Чтобы удалить запись из индекса, используйте команду вроде этой: + + git update-index --force-remove <файл> + +Удалите все записи из индекса!",, +commitcreate_description_278,"So a tree describes a directory structure at a specific point in time. + +It would be nice if we could remember when that state existed, and who authored it, right? + +Enter: commits. They are objects that point to a tree and contain some additional metadata. You can create a commit using + + git commit-tree -m ""Description of your commit"" + +Make a commit from the tree in this repository!","Итак, дерево описывает структуру каталогов в определенный момент времени. + +Было бы неплохо, если бы мы могли запомнить, когда это состояние существовало и кто его автор, верно? + +Представляем: коммиты. Это объекты, которые указывают на дерево и содержат некоторые дополнительные метаданные. Вы можете создать коммит, используя + + git commit-tree <дерево> -m ""Описание вашего коммита"" + +Сделайте коммит из дерева в этом репозитории!",, +treeread_description_279,"As soon as you have some tree objects, you can always read them and set the index exactly to their content! Unsurprisingly, the command is called + + git read-tree + +For , you can provide the hash of any tree object - you can right-click one to insert its hash into the terminal! + +Try reading some of the trees in this repository into the index!","Как только у вас появятся какие-либо объекты-деревья, вы всегда можете прочитать их и установить индекс в точности в соответствии с их содержимым! Неудивительно, что команда называется + + git read-tree <дерево> + +Для <дерева> вы можете указать хэш любого объекта-дерева - вы можете щелкнуть правой кнопкой мыши по одному из них, чтобы вставить его хэш в терминал! + +Попробуйте прочитать некоторые из деревьев в этом репозитории в индекс!",, +commitrhombus_description_280,"A commit can have multiple parents! You can specify the -p option multiple times, like this: + + git commit-tree -m ""Description"" -p -p + +Build a rhombus shape from commits, where two commits point to the same parent, and then a fourth commit points to both of them.","Коммит может иметь несколько родителей! Вы можете указать опцию -p несколько раз, вот так: + + git commit-tree <дерево> -m ""Описание"" -p <родитель1> -p <родитель2> + +Постройте ромбовидную форму из коммитов, где два коммита указывают на одного и того же родителя, а затем четвертый коммит указывает на них обоих.",, +commitrhombus_win_hint_281,My first parent's parents has to be the same as my second parent's parent.,Родители моего первого родителя должны быть такими же, как родитель моего второго родителя., +refmove_description_282,"You can point refs to a new location using the same command you use to create them: + + git update-ref refs/ + +As an exercise, make all refs in this repository point to the tree object!","Вы можете указать ссылкам на новое местоположение, используя ту же команду, которую вы используете для их создания: + + git update-ref refs/<имя_ссылки> <объект> + +В качестве упражнения, сделайте так, чтобы все ссылки в этом репозитории указывали на объект-дерево!",, +blobremove_description_283,"There's a simple command to remove all objects that are not referenced by anything: + + git prune + +Remove all blobs in this repository.","Есть простая команда для удаления всех объектов, на которые ничего не ссылается: + + git prune + +Удалите все блобы в этом репозитории.",, +blobremove_congrats_284,"Generally, git prune will be useful if you want to clean up some objects you made. + +Alternatively, you can also click the ""Reload"" button to restart a level.","В общем, git prune будет полезен, если вы хотите очистить некоторые созданные вами объекты. + +В качестве альтернативы вы также можете нажать кнопку ""Перезагрузить"", чтобы перезапустить уровень.",, +symrefcreate_description_285,"Instead of pointing directly to objects, refs can also point to other refs! + +When that happens, they are called ""symbolic refs"". You can create or update a symbolic ref using + + git symbolic-ref + +Create a symbolic ref called ""refs/rainbow""!","Вместо того чтобы указывать непосредственно на объекты, ссылки могут также указывать на другие ссылки! + +Когда это происходит, их называют ""символическими ссылками"". Вы можете создать или обновить символическую ссылку, используя + + git symbolic-ref <имя> <ссылка> + +Создайте символическую ссылку с именем ""refs/rainbow""!",, +commitparents_description_286,"When using the commit-tree command, you can optionally specify a parent: + + git commit-tree -m ""Description"" -p + +Make a string of three commits! + +Hint: You'll need a tree object. What could be the easiest way to obtain one?","При использовании команды commit-tree вы можете опционально указать родителя: + + git commit-tree <дерево> -m ""Описание"" -p <родительский коммит> + +Создайте цепочку из трех коммитов! + +Подсказка: Вам понадобится объект-дерево. Какой самый простой способ его получить?",, +blobcreate_description_287,"At its core, Git is very simple. It stores ""objects"", which are basically files identified by an ""identifier"" (short: ID). + +There are four types of objects: blobs, trees, commits, and tags. The simplest type is a ""blob"", which is just a piece of text. + +Let's create some blobs! To do that, create a file with the desired content, and then use + + git hash-object -w + +The flag -w means ""write"", and tells Git to actually write the new blob to the disk. + +Create three new blobs!","В своей основе Git очень прост. Он хранит ""объекты"", которые по сути являются файлами, идентифицируемыми ""идентификатором"" (сокращенно: ID). + +Существует четыре типа объектов: блобы, деревья, коммиты и теги. Самый простой тип - ""блоб"", который представляет собой просто фрагмент текста. + +Давайте создадим несколько блобов! Для этого создайте файл с желаемым содержимым, а затем используйте + + git hash-object -w <файл> + +Флаг -w означает ""запись"" и указывает Git фактически записать новый блоб на диск. + +Создайте три новых блоба!",, +blobcreate_congrats_288,"Tip: You can also use a command like this to create a blob in a single line: + + echo ""awesome content"" | git hash-object -w --stdin + +Did you already notice that you can drag and drop all objects? :)","Совет: Вы также можете использовать команду вроде этой, чтобы создать блоб в одну строку: + + echo ""отличное содержимое"" | git hash-object -w --stdin + +Вы уже заметили, что можете перетаскивать все объекты? :)",, +treecreate_description_289,"After carefully building the index we want, it would be nice to save a permanent snapshot of it, right? + +This is what the second type of objects is for: trees! You can convert the index into a tree using + + git write-tree + +Try it! :)","После того, как мы тщательно построили нужный нам индекс, было бы неплохо сохранить его постоянный снимок, верно? + +Для этого и предназначен второй тип объектов: деревья! Вы можете преобразовать индекс в дерево, используя + + git write-tree + +Попробуйте! :)",, +treecreate_congrats_290,"Nice! + +Can you make a different tree? Modify the index, then call git write-tree again!","Отлично! + +Можете ли вы создать другое дерево? Измените индекс, затем снова вызовите git write-tree!",, +welcome_description_291,"This is prototype #1 for the Git learning game by @bleeptrack and @blinry. Thanks for checking it out! <3 + +You can interact with the repository labelled ""yours"" by typing Bash commands in the terminal below! The visualization will show you its internal status. + +Let's get started by initializing an empty Git repository in the current directory by typing: + + git init","Это прототип №1 обучающей игры по Git от @bleeptrack и @blinry. Спасибо, что заглянули! <3 + +Вы можете взаимодействовать с репозиторием с меткой ""yours"", вводя команды Bash в терминале ниже! Визуализация покажет вам его внутреннее состояние. + +Давайте начнем с инициализации пустого репозитория Git в текущем каталоге, набрав: + + git init" +welcome_congrats_292,"Well done! + +An empty Git repository is... well, quite empty. The only thing that always exists is a reference called ""HEAD"" - we'll learn what that is later! + +But first, let's look at some basics! + +(Click ""Next Level"" as soon as you're ready!)","Отлично! + +Пустой репозиторий Git... ну, довольно пустой. Единственное, что всегда существует, это ссылка под названием ""HEAD"" - мы узнаем, что это такое, позже! + +Но сначала давайте рассмотрим некоторые основы! + +(Нажмите ""Следующий уровень"", как только будете готовы!)",, +basics_description_293,"For this prototype, we assume you have some experience with the command line. Here are some commands that will be useful: + +ls + +echo content > file + +cat file + +mkdir dir + +Find the riddle in your current directory and put the answer into the file ""answer""!","Для этого прототипа мы предполагаем, что у вас есть некоторый опыт работы с командной строкой. Вот несколько команд, которые будут полезны: + +ls + +echo содержимое > файл + +cat файл + +mkdir папка + +Найдите загадку в вашем текущем каталоге и поместите ответ в файл ""answer""!",, +basics_congrats_294,"Omnomnom! + +For technical reasons, you can't use cd in this prototype yet. But there won't be a lot of interaction with the file system anyways. :)","Омномном! + +По техническим причинам вы пока не можете использовать cd в этом прототипе. Но в любом случае взаимодействия с файловой системой будет немного. :)",, +puzzlepreciousblob_description_295,Create two trees pointing to the same blob!,"Создайте два дерева, указывающих на один и тот же блоб!", +indexadd_description_296,"Blobs usually represent the content of a file. But on their own, they don't have any metadata, not even a name! + +Git has a very powerful concept to store metadata related to blobs: the index! It's a list that relates blobs to filenames and access permissions. + +The most convenient option to add an entry to the index is via an existing file: + + echo ""my content"" > file + git update-index --add file + +Add three entries to the index! For a bonus challenge: can you add a file that is inside of a directory, like ""directory/file""?","Блобы обычно представляют содержимое файла. Но сами по себе они не имеют никаких метаданных, даже имени! + +У Git есть очень мощная концепция для хранения метаданных, связанных с блобами: индекс! Это список, который связывает блобы с именами файлов и правами доступа. + +Самый удобный способ добавить запись в индекс - через существующий файл: + + echo ""мое содержимое"" > файл + git update-index --add файл + +Добавьте три записи в индекс! Для дополнительного задания: можете ли вы добавить файл, который находится внутри каталога, например, ""каталог/файл""?",, +indexadd_congrats_297,"There's another way to add an entry to the index directly: + + git update-index --add --cacheinfo ,, + +The first three numbers of the mode describe the type of the entry, ""100"" is a regular file. + +The second three number describe the permissions. Only ""644"" (non-executable) and ""755"" (executable) are supported. + +You can insert the hash of an object into the terminal by right-clicking on it! :)","Есть еще один способ добавить запись в индекс напрямую: + + git update-index --add --cacheinfo <режим>,<хэш_блоба>,<имя> + +Первые три числа режима описывают тип записи, ""100"" - это обычный файл. + +Вторые три числа описывают права доступа. Поддерживаются только ""644"" (неисполняемый) и ""755"" (исполняемый). + +Вы можете вставить хэш объекта в терминал, щелкнув по нему правой кнопкой мыши! :)",, +puzzletreesallthewaydown_description_298,"Construct a chain of three trees, which don't point to anything else. + +This is hard! The git mktree command might be useful.","Создайте цепочку из трех деревьев, которые не указывают ни на что другое. + +Это сложно! Команда git mktree может быть полезна.",, +puzzletreesallthewaydown_win_hint_299,"So the tree has exactly one child, and it is a tree!","Итак, у дерева ровно один дочерний элемент, и это дерево!",, +puzzletreesallthewaydown_win_hint_300,Same for its child! \o/,То же самое для его дочернего элемента! \o/,, +symrefnoderef_description_301,"When you have a symbolic ref (a ref pointing at another ref), and you decide you want it to be a regular ref again (pointing to an object), you're in for some trouble! :) + +What happens when you try pointing the symbolic ref directly to the blob using git update-ref? + +Oops! Turns out that when you reference a symbolic ref, it acts as if you had specified the ref it points to. To de-symbolic-ize it, use the --no-deref option directly after update-ref! + +Weird, huh?","Когда у вас есть символическая ссылка (ссылка, указывающая на другую ссылку), и вы решаете, что хотите, чтобы она снова стала обычной ссылкой (указывающей на объект), вас ждут неприятности! :) + +Что произойдет, если вы попытаетесь указать символическую ссылку прямо на блоб с помощью git update-ref? + +Ой! Оказывается, когда вы ссылаетесь на символическую ссылку, она ведет себя так, как если бы вы указали ссылку, на которую она указывает. Чтобы ""де-символизировать"" ее, используйте опцию --no-deref сразу после update-ref! + +Странно, да?",, +symrefnoderef_congrats_302,"Whew, we've covered a lot of things: Blobs! The index! Trees! Commits! Refs! + +You now know about almost everything about how Git repositories look like on the inside! We think that's pretty cool! :) + +Everything else is just convention and high-level commands that make interacting with the objects more convenient. + +We haven't covered: + +tag objects (they are the fourth object type - a bit like refs with a description and an author) + +configuration (allows you to specify remote repositories, for example) + +working with local files (which is, uh, arguably pretty important :P) + +Thanks for playing! You're welcome to check out the ""puzzle"" levels in the dropdown, some of them are more advanced!","Уф, мы рассмотрели много всего: Блобы! Индекс! Деревья! Коммиты! Ссылки! + +Теперь вы знаете почти все о том, как репозитории Git выглядят изнутри! Мы думаем, это довольно круто! :) + +Все остальное - это просто соглашения и высокоуровневые команды, которые делают взаимодействие с объектами более удобным. + +Мы не рассмотрели: + +объекты-теги (это четвертый тип объектов - немного похожи на ссылки с описанием и автором) + +конфигурация (позволяет указывать удаленные репозитории, например) + +работа с локальными файлами (что, э-э, пожалуй, довольно важно :P) + +Спасибо за игру! Вы можете ознакомиться с уровнями-""загадками"" в выпадающем списке, некоторые из них более продвинутые!",, +puzzleapocalypse_description_303,"Delete all objects in this repository using git commands only! + +Useful commands: + + git prune + git reflog expire","Удалите все объекты в этом репозитории, используя только команды git! + +Полезные команды: + + git prune + git reflog expire" +refremove_description_304,"And finally, to delete a ref, use + + git update-ref -d refs/ + +Delete all refs! :P (Well, except for HEAD. HEAD is special.)","И, наконец, чтобы удалить ссылку, используйте + + git update-ref -d refs/<имя_ссылки> + +Удалите все ссылки! :P (Ну, кроме HEAD. HEAD - особенная.)",, +refcreate_description_305,"Let's take a look at ""refs"" (short for ""references"")! Refs are not objects, but rather very simple pointers to objects! They can help you keep track of what's where. + +You can create or update a ref with + + git update-ref refs/ + +Make sure to always start a ref's name with ""refs/""! That's a convention that helps Git find all refs you create. If you forget the ""refs/"", you will not see the ref. + +Create refs that point to all objects in this repository!","Давайте посмотрим на ""ссылки"" (сокращенно от ""references"")! Ссылки - это не объекты, а скорее очень простые указатели на объекты! Они могут помочь вам отслеживать, что где находится. + +Вы можете создать или обновить ссылку с помощью + + git update-ref refs/<имя_ссылки> <новое_значение> + +Убедитесь, что имя ссылки всегда начинается с ""refs/""! Это соглашение, которое помогает Git находить все созданные вами ссылки. Если вы забудете ""refs/"", вы не увидите ссылку. + +Создайте ссылки, которые указывают на все объекты в этом репозитории!",, +problems_title_306,Problems,Проблемы,, +problems_description_307,"Both you and your friend have been working on the file, and want to sync up!","И вы, и ваш друг работали над файлом и хотите синхронизироваться!",, +problems_win_hint_308,Commit your local changes.,Закоммитьте ваши локальные изменения.,, +friend_title_309,Friend,Друг,, +friend_description_310,"Your friend added another line to your essay! Get it, add a third one and send it to them! + +Take turns until you have five lines!","Ваш друг добавил еще одну строку в ваше эссе! Получите ее, добавьте третью и отправьте ему! + +Делайте это по очереди, пока у вас не будет пяти строк!",, +friend_win_hint_311,Got the second line from your friend,Получил вторую строку от друга,, +friend_win_hint_312,Got the fourth line from your friend.,Получил четвертую строку от друга.,, +card_init_desc_313,Drag this card into the empty space above to initialize the time machine!,Перетащите эту карту в пустое пространство выше, чтобы инициализировать машину времени!, +card_clone_desc_314,Create your own copy of someone else's repo.,Создайте свою собственную копию чужого репозитория.,, +card_configname_desc_315,"Set your name. + +(Will not change anything outside of this game.)","Установите свое имя. + +(Ничего не изменит вне этой игры.)",, +card_configemail_desc_316,Set your email address.,Установите свой адрес электронной почты.,, +card_checkout_desc_317,Drag this card to a commit or to a branch to travel to it!,"Перетащите эту карту на коммит или на ветку, чтобы переместиться к ней!", +card_checkoutfile_desc_318,Reset changes in a local file.,Сбросить изменения в локальном файле.,, +card_checkoutfrom_desc_319,"Get the file contents from the specified commits, and reset both the working directory, as well as the index, to it.","Получить содержимое файла из указанных коммитов и сбросить к нему как рабочий каталог, так и индекс.",, +card_commita_desc_320,"Make a new commit, after automatically adding all changes to the index. +You'll be asked to enter a short description of what you changed.","Сделайте новый коммит, автоматически добавив все изменения в индекс. +Вас попросят ввести краткое описание того, что вы изменили.",, +card_commitauto_desc_321,Make a new commit containing your current environment! Type in a description of what changed!,Сделайте новый коммит, содержащий ваше текущее окружение! Введите описание того, что изменилось! +card_merge_desc_322,"Merge the specified timeline into yours. If necessary, will create a merge commit.",Слейте указанную временную линию в свою. При необходимости будет создан коммит слияния.,, +card_mergeabort_desc_323,"Abort the current merge attempt, and reconstruct the previous state.",Прервать текущую попытку слияния и восстановить предыдущее состояние.,, +card_rebase_desc_324,Put the events in your current timeline on top of the specified one.,Поместите события из вашей текущей временной линии поверх указанной.,, +card_pull_desc_325,"Get someone else's version of the current timeline, and try to merge it into yours.",Получите чужую версию текущей временной линии и попробуйте слить ее со своей.,, +card_fetch_desc_326,Get a someone else's version of the current timeline.,Получить чужую версию текущей временной линии.,, +card_push_desc_327,Give the current timeline to someone else.,Передайте текущую временную линию кому-нибудь еще.,, +card_rebaseinteractive_desc_328,"Make changes to the events in your current timeline, back to the commit you drag this to.","Внесите изменения в события вашей текущей временной линии, вплоть до коммита, на который вы перетащите это.",, +card_rebasecontinue_desc_329,Continue the current rebasing process.,Продолжить текущий процесс перебазирования.,, +card_resethard_desc_330,Move the branch you're on to the specified commit.,"Переместите ветку, на которой вы находитесь, к указанному коммиту." +card_reset_desc_331,"Jump to the commit, and update the index. Keep the current environment.",Перейти к коммиту и обновить индекс. Сохранить текущее окружение.,, +card_resetfile_desc_332,Reset the index version of a file to the version in the commit you're on.,"Сбросить версию файла в индексе до версии в коммите, на котором вы находитесь.", +card_cherrypick_desc_333,Repeat the specified action on top of your current timeline.,Повторите указанное действие поверх вашей текущей временной линии.,, +card_revert_desc_334,Make a new commit that reverts the changes of the specified commit.,"Создайте новый коммит, который отменяет изменения указанного коммита.", +card_bisectstart_desc_335,Start looking for the commit where things got bad.,"Начать поиск коммита, в котором все пошло не так.", +card_bisectgood_desc_336,"State that the current commit is good! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит хороший! Когда вас автоматически перенесут, продолжайте играть картами good и bad!",, +card_bisectbad_desc_337,"State that the current commit is bad! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит плохой! Когда вас автоматически перенесут, продолжайте играть картами good и bad!",, +card_add_desc_338,Update the index version of the file to its current real content.,Обновите версию файла в индексе до его текущего реального содержимого.,, +card_rm_desc_339,"Delete a file both in the working directory, as well as the index.","Удалить файл как в рабочем каталоге, так и в индексе.",, +card_commit_desc_340,Make a commit from the current index.,Сделать коммит из текущего индекса.,, +card_show_desc_341,Show what changed in the commit.,"Показать, что изменилось в коммите.", +card_branch_desc_342,Create a new branch at your current location.,Создать новую ветку в вашем текущем местоположении.,, +card_branchdelete_desc_343,Delete a branch.,Удалить ветку.,, +card_reflog_desc_344,Display a log of where the ref pointed to in the past.,"Отобразить журнал того, куда указывала ссылка в прошлом.", +card_filenew_desc_345,Create a new file.,Создать новый файл.,, +card_filedelete_desc_346,Delete a file.,Удалить файл.,, +card_filerename_desc_347,Rename a file.,Переименовать файл.,, +card_filecopy_desc_348,Make a copy of a file.,Сделать копию файла.,, +cli_remote_001,"To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice.","Чтобы вернуться к старым командам, вы можете нажимать стрелки вверх и вниз. Таким образом, вам не придется дважды вводить длинные команды.",, +cli_commit_002,"Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below!","Опять же, вместо использования карты, вы также можете вводить команды, напечатанные на ней, в черный терминал ниже!",, +cli_commit_003,This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :),Это совершенно необязательно! Но это будет суперполезный навык в реальном мире - и он даст вам сверкающий золотой значок! :),, +cli_cli_004,But there's another way to interact with Git:,Но есть и другой способ взаимодействия с Git:,, +cli_cli_005,"Try typing git init into the black terminal below, and pressing the enter key!",Попробуйте набрать git init в черном терминале ниже и нажать клавишу Enter!,, +cli_new_006,"You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time!","Вы можете использовать автодополнение по Tab в терминале! Начните вводить имя файла, затем нажмите клавишу Tab, чтобы дополнить его имя. Это часто сэкономит вам время!",, +cli_grow_007,"To travel to a branch, type `git checkout name_of_the_branch`","Чтобы переместиться на ветку, введите `git checkout имя_ветки`",, +cli_grow_008,"And to travel to the last commit, type `git checkout --detach name_of_the_branch`","А чтобы переместиться к последнему коммиту, введите `git checkout --detach имя_ветки`.",, +cli_branchcreate_009,"Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called ""birthday"", you can type `git checkout birthday` to travel to it!","Ветки также значительно упрощают перемещение между разными местами с помощью командной строки! Как только у вас появится ветка с именем ""birthday"", вы сможете набрать `git checkout birthday`, чтобы переместиться на нее!",, +cli_fork_010,"The blue animal represents a concept known as the ""HEAD pointer"" in Git: It shows you which commit is the current one.","Синее животное представляет собой концепцию, известную в Git как ""указатель HEAD"": он показывает вам, какой коммит является текущим.",, +cli_fork_011,Here's a cool trick to go to the previous commit:,"Вот крутой трюк, чтобы перейти к предыдущему коммиту:",, +cli_fork_012,`git checkout HEAD^`,`git checkout HEAD^`,, +cli_fork_013,"You can also go back two commits by typing, for example:","Вы также можете вернуться на два коммита назад, набрав, например:",, +cli_fork_014,`git checkout HEAD~2`,`git checkout HEAD~2`,, +cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want!","Чтобы переключиться на определенный коммит, введите `git checkout`, затем пробел, а затем щелкните правой кнопкой мыши по нужному коммиту!",, +cli_checkoutcommit_016,This will insert the commit's unique identifier!,Это вставит уникальный идентификатор коммита!,, +cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:","В командной строке вы можете легко удалить все файлы, заканчивающиеся на -web, с помощью этой команды:",, +cli_filesdelete_018, `rm *web`, `rm *web`,, +chapter_intro,Introduction,Введение,, +chapter_files,Files,Файлы,, +chapter_branches,Branches,Ветви,, +chapter_merge,Merging,Слияние,, +chapter_index,The Index,Индекс,, +chapter_remotes,Remotes,Удалённые репозитории,, +chapter_changing-the-past,Changing the Past,Изменение прошлого,, +chapter_shit-happens,When Things Go Wrong,Когда всё идёт не так,, +chapter_workflows,Workflows,Рабочие процессы,, +chapter_bisect,Bisect,Поиск ошибки (Bisect),, +chapter_stash,Stash,Тайник (Stash),, +chapter_tags,Tags,Метки,, +chapter_sandbox,Sandbox,Песочница,, +new_win_hint_085,Make a change to the candle.,Измените свечу.,, +change_win_060," Good! The index is sometimes also called the ""staging area"" - it contains exactly what ends up in the next commit when you use `git commit`!","Отлично! Индекс также иногда называют ""областью подготовки"" (staging area) — он содержит именно то, что попадёт в следующий коммит, когда вы используете `git commit`!" +friend_win_hint_313,The friend got a third line from you,Друг получил от тебя третью строку,, +friend_win_hint_314,The friend got a fifth line from you,Друг получил от тебя пятую строку,, +problems_win_hint_309,"Look at your friend's suggestion, make a compromise, and push it back.","Посмотри на предложение твоего друга, найди компромисс и отправь его обратно.",, +pushed_win_hint_1,The team's main branch no longer contains the bad thing.,Командная ветка main больше не содержит плохой вещи. +pushed_win_hint_2,And the history has not been modified.,И история не была изменена. +default_win_desc_key,Complete the goal of this level,Выполните цель этого уровня diff --git a/translations.csv.import b/translations.csv.import index 5eaaa1fc..8e9e35d5 100644 --- a/translations.csv.import +++ b/translations.csv.import @@ -5,10 +5,10 @@ type="Translation" [deps] -files=[ "res://translations.en.translation", "res://translations.ru.translation" ] +files=[ "res://translations.en.translation", "res://translations.ru.translation", "res://translations..translation", "res://translations..translation" ] source_file="res://translations.csv" -dest_files=[ "res://translations.en.translation", "res://translations.ru.translation" ] +dest_files=[ "res://translations.en.translation", "res://translations.ru.translation", "res://translations..translation", "res://translations..translation" ] [params] diff --git a/translations.en.translation b/translations.en.translation index f047f2689c7074d9900ee141e32efd2273025d75..da9113ef84a17a122d1c096e0be7752e85dc95e1 100644 GIT binary patch literal 3977 zcmb_fdsLI>8UOMnhD!(_R00@*lo&2cjOc1xKrkqmpa@IgM1vy)NJ}6ROhUb_w(4}P zy*Wk!TX%*PyVgosoyViIQ|5gfEv54~*LHZBwr=*q>d^^xANxI@-)GaF?yoJ!$LD>2 z@AEwGbA7*q#cG+)2tO&f97KFFsG`K_Z>;n=Tl^kp!0l}T^uPT=p&k$Nx%}QXU%kuW z@zy&%j)2$UuXnY$n8@I>7Uyyo69#0t%kOtS?(#Ds*zg)IMuBA`ymJJcbsiU^#I~-j zzS$KJ0J_N^@VQ$azo+J}_qkgG02xLC3J39)vW>{w_j0^TqV|Z!oD>Ke?nM44Zc}eKQHih zf%kyFF0947_6YmE;0Hj5LB~NKfG&VWK-WQEfk@{LI47)SNL)BbwDnyc{XJ)iz*2&6 zUC=sMUk`kiaF#3Z0)bD${VAXl?D3DM4yR`2RCEZnLX3dX*~>Cx$xU$TBr3Zo-}8^g zm|DnFCsE&t_}{}Gd*e~yQNZGY@GpSRK*4_itRx6;K9yePgFN{}B-$AsnDJ)j_uzNO zCsYbF6pnae1s&s&e=f|zdKG9G^u~z0uRlmmw0q^??c#sKk66g4Kq9{Uhhu-54teTD zil6$H&SnixH;`Wsf^@V$z2TK891;dI%tsw-k4?cM0qaDNsONk2ZuUwzNx7lHXn&jg zTMhQ)FOh5@IbN(kcpii}@nu_w< zH#N;(0_SbOxe{2{6C%csMyW=ps1Z4|$4-JN<04&3~h|A0)I|d;~{Y)g{b!_%uek}MwwG?slu5nKh^0Et< z0U$*9v*)G^KXMRjsx#G3by)p@5`8B6E9&PxJV|>A=Tv{HwTR~fH^G=1SXL0;_hhGG zGK45M!Tr}`*|TyVFwt+(kJz|BN*_g>ROfWizKo`yrh!wPXtu@s%Farp3d8}?Z^eD` z`7yR0Lhl1#2~IOkwmMO}XP3osOpbAf!C++0oN1Mt&aj4DY4I5Y5mSKb3+pZr~xFw&lOH*maHt;*$FgYkgwN=7C@Iv>;CM<=30%TKiXlgt6ZlK z{j2l@cCq@=IW4%iQl67zTid&lV+x%0%?xLm!%9o*^`q-}iyUKhKH)+n=4dt7T%9^G zsie@fpoZa0`F&jTyA5jJK}IRUdG; z8yId8>)qEBPD#jE!;&d(G0fP!NFQg_<>qFl_9EyBNqYJFFPUoXev@P2X?ysDBm>7c zl#2Lrt~u`&xoP)f`I1N42Dp5rPadJ~ewX`FDCX%D5Q!N|1-V{%HEI7_st9SkR^X-R~fm!W_>8H77meRkp zdhpcw3QG<2rX5!*G)d|Z+hV2SxqHRpZ=q5q#A&VxF*YGV7^p*kEOb7^X-~- zK;(8L6CNelGYdD@3Yt}|4bFgz;mTwvP>lxv>nQ`de#3NRgW=NpqPVo04Oe6M>Mwd^ zPgRukUSIwHm*lPgBFB_UZE)25P;%44P$Y*-TVcplXr3LPcXY^Foo8cn7e86vx;OI5 z-l#b(E$~Y}I$P#}hAled=TsN;s+Jo3p=2&C6-gPq{jw=+HD^4X)MJeh~D#{A@C*EhZ}z%k~Q2G^==hO2@n zjrRv=k?RSU$Io!(zMQBfd2K76x)~N0%0_o1yt1h|MSRdSW-SeM-c_ik&Y+!{S3OtN zh4L{ua(R;dUJdUxNl6cvwkOhuVa%(Y3CGQel)iSm@oe%~1c%F;dQ; z3F^}2#?W={Tx6HI^t-8!O(DvmpGn@Dt3|UYS%YOv5)g%&M!ips`C{`q8${&I#`U?zN2J|uk8w@ zG%1Tz3&i$w+b?b*tKnp*GNPEeT)6(;OwlWKaU*7}=Vtfr_O>v6mztWgB=U-)Z(EcC z&e&w$+ZZPcVy=>#EKmBMDL}ZCfVbB7$L9L&w!TvJZPuVQ-t5lfYpVP@8D>iB9qJbb zR%1%=igL|2a^EtpNl|V$)qZ*|S#@UGLbc{vdz--?^&Z{}{(ZHuc!HIRk&zMY<;#~l z@+a82bLZZP;F_my3b})t;1#21&(avRB=n>0v515p`bBK2^#YI0qeyov6|TN0*C2~- zF7^ge+yTuuujm>3cRm9Jy3wSa=cKy#UOd`^n05^4JV`t4vK$>NE$rB#*Wc*K-x;5L zoF;crAl&qZCuPCYdZoYs2`e0K!H7d6*5{o|#H=9CSTiX9H8| jZiQ|7oP^0dRXzMK@mqN&7g%2!T2MM)TxR|OzVn?6FP@0E zksC$e5`eh^IMF4nY|<1tOBc3gsg2tZiF`l+ zSi7mYq2VBvv4r@iXC6i|5Ckd#jsk)QRpzdDxXj-6y6YO3>%kGA73gxcUT~kg&bXWf zZvuh`oI&UYc*Ww=?meJ8@0&UBKPO%51U?gG$H57Fg*R! z+>a#JD=s{};_J85kD&1$d-Zg4X0>?=IlmPTjAz4p1N9wZCz!DZXb3)790uw4Jp-}?NOd;6b4=eH>b zcvkFr8915OY-*%7VGda#N^0XFa$;sndEb%zxyfICf2p$lzC%v?;oW9r%J0x2N{HN0 z#<)naY_R82uv4=`G&z`3B5!^=qvX^MPW#Ie4z&suS+BBEoicXef<$d3QeQpigs9-F zi+#8gJ=#O9`~k~>){FoE diff --git a/translations.ru.translation b/translations.ru.translation index 59f85e34f9684e206575309fded6e665f47d21c4..1a3bec24476540ebe5fd70c9b4b664d6a5960bfb 100644 GIT binary patch literal 7368 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 From 28f4951925c66ef28d9707b8bd5e008662844209 Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 07/15] Fix parse script bugs Initialize point for transfering to official godot localization mechanism --- levels/intro/remote | 2 +- levels/tags/remote-tag | 2 +- translations..translation | Bin 2194 -> 2194 bytes translations.csv | 8 +++++--- translations.en.translation | Bin 3977 -> 3977 bytes translations.ru.translation | Bin 7368 -> 7368 bytes 6 files changed, 7 insertions(+), 5 deletions(-) diff --git a/levels/intro/remote b/levels/intro/remote index d0889a89..70315172 100644 --- a/levels/intro/remote +++ b/levels/intro/remote @@ -46,5 +46,5 @@ test "$(git show main:students |wc -l)" -ge 5 [win teacher] -# And use `git push` to send it to your teacher! +# remote_win_hint_134 test "$(git show main:students |wc -l)" -ge 5 diff --git a/levels/tags/remote-tag b/levels/tags/remote-tag index 6ea65e17..67a1d64c 100644 --- a/levels/tags/remote-tag +++ b/levels/tags/remote-tag @@ -40,5 +40,5 @@ test "$(git show v2 -s --format=%h)" = "$(git show HEAD -s --format=%h)" [win friend] -# v2 tag in the remote +# remote_tag_win_hint_1 test "$(git show v2 -s --format=%h)" = "$(git show HEAD -s --format=%h)" diff --git a/translations..translation b/translations..translation index 70b9febbc3fd675ecd9bd3fea23e454463c9e49d..38bc1dd633c4c8c78c2a572556a24fd7513edb87 100644 GIT binary patch literal 2194 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 E2Q36y-v9sr delta 1451 zcmZ8fYfM~47@d3f?%sXCLZMt>i@=J!R$whC%2GkfyYkSbl~<)KyK7jWEG|&6O`xI0 zNKB()6pGe}(ngwCF_n-QwIykY#-yRtKR&8$)K;UYSW+X1cRjOm4e`gx%$)B#-}lX# z8HpQ-d-pQW?-1!CFPT;eAv!=0aGRL?sWq%wq<(~RL_$J9OIyOf>Ykd;&`_&NGWifz zBgCMnm*z9hT10w4C0PstA;<`T-%PPy{Qc3L*!KfV!1Onsb29>c9o7EU5E2e55>Tog zynpSpM1d}G0kc0W09+*cRn^ZH4NVc$@DYQndi)0C46eQEvrtTehjk#Isz~Q zeKXh67qPPWnLQipt8*KWGby{PBHwQ*c7zGES}mFK5oWWqmsP^Imp(R@iF8n%!549K zMlI!7k-}zRfFO{0L;EFnXH(58cmF^H6X*=WpMw7X$7|tjUp&dv>l(>Yf*YJcN;;%Uv*#n09(o@fv+*t<@U#=!S}jV^+rY7FY<;Uq``dl9bU=)>x7Q}U>qLY?Qpge*`Cd- z_Bhj420UC<+qz6@9EaQ_*IFJLBeypu_|;{_1w~CnF33M8w}1FXdb-umnTgBeBl2E; zJ>f7f6S?R-Up$(&V(@Uwpn8$R$f1H|zM#B1N-q;{OPkx-bHL*was}_5ZPT+MLQ@a( ztd?8_QLR^!sZDF9Nx@et>l=-}N9sF**8E(4V8EI13Da7nhaMX^ar`b(_U2c%`c zoH7r9(KMioT;CYoU@3mKc~iNs%jM{CQ$tWPb?UO{QJn;swB6TbvPV@b(59U*OFtevF)x$yPM5piM&y0FqHebSXG?|qkh`Os$ko2wkh;9yrw3PcIxQc1 z5^XDYC$H!AzHQPiP7qK3BK-y_fZMoLK7ZiTCuF=|@@R9 z!$DK@wiy0Eb!&X(Gx4Pe!O~_fZ_Hb|pjnW~edO_8PYu{01o-Wj3F6)GjeUkx~YR2yPx$@+bRh3jBg&>r_g4| z2M|kvBrs)usrc=u7MND ze6;NED;ZXrm(>TyaQ7l4D4hwM2*WxW8C*T~Uv7cIS z7j6XBON9$pWZG_3{mnOpPkk~QEP%cSF~P#)1II(SU&mP>oC)^Wwz6#&I&H8k-on{BFpKfZ~4 z6bOEv`=+iOAA%2O0s0%R-zc4`YQx#w+b_u54~sTcYsUI&APLOweFujdD{K^nJb%;w z-jo|9|F=Gg7Hz8cW30!HR|Mu`gQ>hc2ot8~v}o4ss7%FnRojR3Ts$N&yWM?3;l5Joc$&;L#GRy~gKceGo zM~kQW3D3Q)T{%>cP)`T5yfp9dR-V#B`UNn~^fUT-bU1HZ!@P(0;WWtu`~{|;&_f6W z_+XAmLp$E9Uo7mEm>59>w_PUC0ZGCt*`o7Pfhk=Vcpoj3N2a#zp6z}DIo|4WI zI+;~KONkmSCT9K*+0O`%5k7=I5j_geV!|+DQ{Wu9$Y4KeOdApNO+%j+6EXc&#QULy z#2#0sf6egJ%L5)X8poD;Ma`uCAs^b!4HTye(?`49+2NxpzshubvX5q5HI_3}q-BTmGH#P-DYKNWI{kFiwT`}z_lElt v>Lf~a)l!iom!5W)g=>=R5_LE>g)8HREY8#LK8f~*WqQkzudv#kwUz$@a>cZw delta 1426 zcmYjPYfM{Z82)+=y_ZT`dguxwtz#R_D03I3-JDsFZN?x7Kit5ufW~mi=5XpX(*(+8 zM&_8jGq@XyuB9>yXF3F!2K^@a22GH5I4 z`b@^~OF^f#%i#~+_0T?92~F4-O9w50J}HHw=|7*`j&n2e1Q3}kIMnNU zN0LA1<1X9?q+KqUuaM}eG$q;tEj@hZi|c&}6Jsu<2+Y6s)`@I0V~aQo2x);j({{Ea zlls$?Q1~77a3-8BW7!mW{`FHVR8_GB0ETF4D8!D~)+(xxV#lH<^+@J(>`Y-KE=c0#>8pBed zOsY|doQ7I1G6eL6-L!mfH~?`cVgfJj>a*BE25}ZRd!pu*Ym{!v^8W-&`dalKt@3l% z_IqfnNr{djwh{#bzs!ES`$yydUlJ-)w$81;RGN?1Dy9feo?U3S$V zJ1z9JS&_PAnl}gNtTp81{d}5FYHfU!Pw~n4lAjEjXK?uh7-xKlk7=!3)!L}v7swyN zsT229t`^gdu+2qJWaK29YaU!O?kwH*crD}aQ;W+(Z~C0pY2;1w1RteacAsIG9>|W; zP)^X*`1~HOLicSx!4p~xyvw?l+N}ZVu~f%Z?{0}Uc_WnNtE7i*1+>?@`o4ZX274;M z0IO(Ab?!$^CYLRj-t&d*!-7K`d!k%RF)5Bh*FZ{8)eeiO)`eNt zxHrd393F%1Bp=mU;kG*v-{M@5odYPI(t6+n{R4E>>ZgYEj`$6CkrZ5#(JfZ{jI`y- zAIWBxTvgj=byOu;c|%^=>v=mGUk=cIo7b_9@m{T4>x9xc{cX*oTj>#!y$=~S(3m?| qD9ng0h<6u9?{=J0`(j))AIIo;8wlb*K)+emQkQL&kyTbzmiz~Q)u}lE From 62b072854c415616e78ef12f64b925855e559589 Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 08/15] Port to the official localization mechanism --- project.godot | 2 +- scenes/card.gd | 2 +- scenes/game.gd | 109 +++++++++++++++++++++++++++-------------- scenes/global_menu.gd | 12 ++--- scenes/level.gd | 12 ++--- scenes/level_select.gd | 2 +- scenes/title.gd | 11 +++-- scripts/translator.gd | 20 -------- 8 files changed, 92 insertions(+), 78 deletions(-) delete mode 100644 scripts/translator.gd diff --git a/project.godot b/project.godot index b06a33d0..d91ca6c0 100644 --- a/project.godot +++ b/project.godot @@ -151,7 +151,7 @@ mute={ [locale] -translations=PoolStringArray( ) +translations=PoolStringArray( "res://translations.en.translation", "res://translations.ru.translation" ) [network] diff --git a/scenes/card.gd b/scenes/card.gd index 7c8771d6..cd5623f6 100644 --- a/scenes/card.gd +++ b/scenes/card.gd @@ -104,7 +104,7 @@ func set_command(new_command): #$Label.text = command func set_description(new_description): - description = game.tr_custom(new_description) + description = tr(new_description) $Description.text = description func set_energy(new_energy): diff --git a/scenes/game.gd b/scenes/game.gd index 3cb497b9..5f90a267 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -12,8 +12,8 @@ var current_chapter = 0 var current_level = 0 var skipped_title = false -var translations = {} -var current_locale +var available_languages = [] +var current_language var _file = "user://savegame.json" var state = {} @@ -24,8 +24,6 @@ func _ready(): mutex = Mutex.new() load_state() - TranslationServer.set_locale("en") - if OS.has_feature("standalone"): get_tree().set_auto_accept_quit(false) else: @@ -34,6 +32,9 @@ func _ready(): if OS.get_name() == "Windows": start_remote_shell() global_shell = new_shell() + + _load_translations() + _set_initial_language() # var cmd = global_shell.run("echo hi") # print(cmd) # cmd = global_shell.run("seq 1 10") @@ -165,48 +166,80 @@ func new_shell(): else: return Shell.new() -# --- ДОБАВИТЬ ЭТИ ДВЕ ФУНКЦИИ В КОНЕЦ ФАЙЛА --- - -# Загружает наш CSV в словарь для быстрого доступа func _load_translations(): var file = File.new() - if not file.file_exists("res://translations.csv"): - print_debug("Локализация: Файл translations.csv не найден.") + var path = "res://translations.csv" + + if not file.file_exists(path): + printerr("ЛОКАЛИЗАЦИЯ (ОШИБКА): Файл %s не найден." % path) return + + file.open(path, File.READ) + + # ★ Читаем заголовок, чтобы узнать, какие языки есть в CSV + var header = file.get_csv_line() + # header = ["key", "en", "ru", "de", ...] + + if header.size() < 2: + printerr("ЛОКАЛИЗАЦИЯ (ОШИБКА): Некорректный формат CSV.") + file.close() + return + + # ★★ Создаем словарь: язык → объект Translation + var translations_map = {} + + # Пропускаем первую колонку (это "key"), остальные — языки + for i in range(1, header.size()): + var locale = header[i].strip_edges() # "en", "ru", "de"... + + if locale == "": + continue + + available_languages.append(locale) - file.open("res://translations.csv", File.READ) - var headers = file.get_csv_line() # Пропускаем первую строку с заголовками + # Создаем Translation для каждого языка + var translation = Translation.new() + translation.set_locale(locale) + translations_map[locale] = translation + print_debug("ЛОКАЛИЗАЦИЯ: Найдены языки: %s" % str(available_languages)) + + # ★★★ Читаем все строки и заполняем переводы для ВСЕХ языков + var loaded_keys = 0 while not file.eof_reached(): var line = file.get_csv_line() - # Проверяем, что в строке есть все нужные столбцы - if line != null and line.size() >= 3: - var key = line[0] - var en_text = line[1] - var ru_text = line[2] - translations[key] = {"en": en_text, "ru": ru_text} + + if line == null or line.size() < 2 or line[0].strip_edges() == "": + continue + + var key = line[0].strip_edges() + + # Для каждого языка добавляем перевод + for i in range(1, min(line.size(), header.size())): + var locale = header[i].strip_edges() + var translated_text = line[i] + + if translations_map.has(locale): + translations_map[locale].add_message(key, translated_text) + + loaded_keys += 1 + file.close() + + # ★★★★ Регистрируем ВСЕ переводы в TranslationServer + for locale in translations_map.keys(): + TranslationServer.add_translation(translations_map[locale]) + print_debug("ЛОКАЛИЗАЦИЯ: Загружено %d ключей для языка '%s'" % [loaded_keys, locale]) + +func _set_initial_language(): + var system_language = OS.get_locale_language() # Возвращает "ru", "en", "de"... -# Наша собственная функция перевода -# Улучшенная, "безопасная" версия функции -func tr_custom(key): - # Если ключ - это не строка, всегда возвращаем ПУСТУЮ СТРОКУ, а не Nil. - if typeof(key) != TYPE_STRING: - return "" - - if translations.has(key) and translations[key].has(current_locale): - var translated_text = translations[key][current_locale] - # Эта проверка гарантирует, что мы не вернем null/Nil - if translated_text != null and translated_text != "": - return translated_text - # Если перевод пустой, возвращаем английский текст - var en_text = translations[key]["en"] - return en_text if en_text != null else "" + if system_language in available_languages: + current_language = system_language + else: + current_language = "en" - # Если ключ не найден, возвращаем сам ключ (или пустую строку, если ключ пустой) - return key if key != null else "" + TranslationServer.set_locale(current_language) + + -func _init(): - # --- ПРИВЕСТИ ФУНКЦИЮ _init() К ТАКОМУ ВИДУ --- - _load_translations() - current_locale = "ru" diff --git a/scenes/global_menu.gd b/scenes/global_menu.gd index 2a25c8e0..b0537869 100644 --- a/scenes/global_menu.gd +++ b/scenes/global_menu.gd @@ -15,12 +15,12 @@ func _ready(): $NextLevelButton.visible = show_next_level_button $CLIBadge.visible = show_cli_badge - $BackButton.text = game.tr_custom("main_backbutton_016") - $ReloadButton2.text = game.tr_custom("main_reloadbutton2_017") - $CardsButton.text = game.tr_custom("main_cardsbutton_018") - $"Tip!".text = game.tr_custom("main_tip_019") - $Button3.text = game.tr_custom("music_button_button3_003") - $NextLevelButton.text = game.tr_custom("main_nextlevelbutton_020") + $BackButton.text = tr("main_backbutton_016") + $ReloadButton2.text = tr("main_reloadbutton2_017") + $CardsButton.text = tr("main_cardsbutton_018") + $"Tip!".text = tr("main_tip_019") + $Button3.text = tr("music_button_button3_003") + $NextLevelButton.text = tr("main_nextlevelbutton_020") func _on_BackButton_pressed(): emit_signal("back_pressed") diff --git a/scenes/level.gd b/scenes/level.gd index 8dfddee7..8ea2f3b3 100644 --- a/scenes/level.gd +++ b/scenes/level.gd @@ -20,9 +20,9 @@ func load(path): var config = helpers.parse(path) # --- Перевод однострочных ключей --- - title = game.tr_custom(config.get("title", "default_title_key")) - var description_text = game.tr_custom(config.get("description", "default_description_key")) - congrats = game.tr_custom(config.get("congrats", "default_congrats_key")) + title = tr(config.get("title", "default_title_key")) + var description_text = tr(config.get("description", "default_description_key")) + congrats = tr(config.get("congrats", "default_congrats_key")) # --- ПРАВИЛЬНАЯ ОБРАБОТКА МНОГОСТРОЧНОГО [CLI] --- var cli_hints_keys_block = config.get("cli", "") # Получаем блок с ключами @@ -34,7 +34,7 @@ func load(path): var stripped_key = key.strip_edges(true, true) if stripped_key != "": # Переводим каждый ключ индивидуально - translated_cli_lines.push_back(game.tr_custom(stripped_key)) + translated_cli_lines.push_back(tr(stripped_key)) else: # Сохраняем пустые строки для форматирования translated_cli_lines.push_back("") @@ -102,12 +102,12 @@ func load(path): if not repos.has(repo): repos[repo] = LevelRepo.new() - var desc = game.tr_custom(config.get("win_desc", "default_win_desc_key")) + var desc = tr(config.get("win_desc", "default_win_desc_key")) for line in Array(config[k].split("\n")): if line.length() > 0 and line[0] == "#": # --- ДОПОЛНИТЕЛЬНОЕ ИЗМЕНЕНИЕ: ПЕРЕВОДИМ ПОДСКАЗКИ В [WIN] --- var hint_key = line.substr(1).strip_edges(true, true) - desc = game.tr_custom(hint_key) + desc = tr(hint_key) else: if not repos[repo].win_conditions.has(desc): repos[repo].win_conditions[desc] = "" diff --git a/scenes/level_select.gd b/scenes/level_select.gd index 7d8fae63..ae3e42a6 100644 --- a/scenes/level_select.gd +++ b/scenes/level_select.gd @@ -27,7 +27,7 @@ func reload(): var l = Label.new() var chapter_key = "chapter_" + chapter.slug - l.text = game.tr_custom(chapter_key) + l.text = tr(chapter_key) l.set("custom_fonts/font", preload("res://fonts/big.tres")) l.align = HALIGN_CENTER level_list.add_child(l) diff --git a/scenes/title.gd b/scenes/title.gd index 0a96aa7f..a4c930cd 100644 --- a/scenes/title.gd +++ b/scenes/title.gd @@ -5,11 +5,12 @@ func _ready(): game.skipped_title = true get_tree().change_scene("res://scenes/level_select.tscn") - $Label2.text = game.tr_custom("title_label2_007") - $Label3.text = game.tr_custom("title_label3_008") - $VBoxContainer/Button.text = game.tr_custom("title_button_009") # Кнопка Levels - $VBoxContainer/Button3.text = game.tr_custom("title_button3_010") # Кнопка Sandbox - $VBoxContainer/Button2.text = game.tr_custom("title_button2_011") # Кнопка Quit + + $Label2.text = tr("title_label2_007") + $Label3.text = tr("title_label3_008") + $VBoxContainer/Button.text = tr("title_button_009") # Кнопка Levels + $VBoxContainer/Button3.text = tr("title_button3_010") # Кнопка Sandbox + $VBoxContainer/Button2.text = tr("title_button2_011") # Кнопка Quit func quit(): diff --git a/scripts/translator.gd b/scripts/translator.gd deleted file mode 100644 index ae680ebc..00000000 --- a/scripts/translator.gd +++ /dev/null @@ -1,20 +0,0 @@ -extends Node - -# Свойство, которое нужно перевести (например, "text" или "window_title") -export var property_to_translate : String = "text" - -func _ready(): - var parent = get_parent() - if not parent: - return - - # Проверяем, существует ли у родителя такое свойство - if parent.get(property_to_translate) != null: - # Получаем ключ из свойства - var key = parent.get(property_to_translate) - - # Переводим ключ с помощью нашей глобальной функции - var translated_text = game.tr_custom(key) - - # Устанавливаем переведенный текст обратно в свойство - parent.set(property_to_translate, translated_text) From 43aa93e85ad107b80de0f96882a73e93366dce7c Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 09/15] Add option button on title scene --- scenes/game.gd | 14 ++++++++++++++ scenes/optionbutton.gd | 37 +++++++++++++++++++++++++++++++++++++ scenes/title.tscn | 15 ++++++++++----- 3 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 scenes/optionbutton.gd diff --git a/scenes/game.gd b/scenes/game.gd index 5f90a267..b17f2c03 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -240,6 +240,20 @@ func _set_initial_language(): current_language = "en" TranslationServer.set_locale(current_language) + +func get_available_languages() -> Array: + return available_languages +func _update_all_ui(): + get_tree().reload_current_scene() +func change_language(new_language: String): + if not new_language in available_languages: + printerr("ЛОКАЛИЗАЦИЯ: Язык '%s' не поддерживается. Доступны: %s" % [new_language, str(available_languages)]) + return + + current_language = new_language + TranslationServer.set_locale(new_language) + + _update_all_ui() diff --git a/scenes/optionbutton.gd b/scenes/optionbutton.gd new file mode 100644 index 00000000..9db89730 --- /dev/null +++ b/scenes/optionbutton.gd @@ -0,0 +1,37 @@ +extends OptionButton + + +func _ready(): + # Заполняем список языков + var languages = game.get_available_languages() + + for i in range(languages.size()): + var locale = languages[i] + add_item(_get_language_name(locale), i) + set_item_metadata(i, locale) + + # Выбираем текущий язык + _select_current_language() + + connect("item_selected", self, "_on_language_selected") + + +func _select_current_language(): + var current = TranslationServer.get_locale() + for i in range(get_item_count()): + if get_item_metadata(i) == current: + select(i) + break + +func _on_language_selected(index: int): + var selected_language = get_item_metadata(index) + game.change_language(selected_language) + +func _get_language_name(locale: String) -> String: + # Человекочитаемые названия языков + var names = { + "en": "English", + "ru": "Русский", + } + return names.get(locale, locale.to_upper()) + diff --git a/scenes/title.tscn b/scenes/title.tscn index 94d0c547..cb9aa8af 100644 --- a/scenes/title.tscn +++ b/scenes/title.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=6 format=2] [ext_resource path="res://styles/theme.tres" type="Theme" id=1] [ext_resource path="res://images/oh-my-git.png" type="Texture" id=2] [ext_resource path="res://scenes/title.gd" type="Script" id=3] +[ext_resource path="res://scenes/optionbutton.gd" type="Script" id=4] [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=5] [node name="Title" type="Control"] @@ -39,9 +40,6 @@ margin_left = 784.553 margin_top = 702.517 margin_right = 1136.55 margin_bottom = 885.517 -__meta__ = { -"_edit_use_anchors_": false -} [node name="Button" type="Button" parent="VBoxContainer"] margin_right = 351.0 @@ -54,10 +52,17 @@ margin_right = 351.0 margin_bottom = 83.0 text = "title_button3_010" -[node name="Button2" type="Button" parent="VBoxContainer"] +[node name="OptionButton" type="OptionButton" parent="VBoxContainer"] margin_top = 88.0 margin_right = 351.0 margin_bottom = 127.0 +align = 1 +script = ExtResource( 4 ) + +[node name="Button2" type="Button" parent="VBoxContainer"] +margin_top = 132.0 +margin_right = 351.0 +margin_bottom = 171.0 text = "title_button2_011" [node name="Sprite" type="Sprite" parent="."] From 8c1ef8dff5fc0f6f3b1355d605c7d4d9a708fa97 Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 10/15] Add shell echo commands to localization mechanism Fix bug with SaveButton, when it grow beyond the monitor Fix bug with step by step scene --- levels/bisect/bisect | 8 +- levels/branches/branch-create | 6 +- levels/branches/branch-remove | 14 +- levels/branches/checkout-commit | 10 +- levels/branches/fork | 11 +- levels/branches/grow | 6 +- levels/branches/reorder | 36 +- levels/changing-the-past/rebase | 42 +- levels/changing-the-past/reorder | 50 +- levels/cli_translations_for_csv.txt | 18 - levels/files/files-add | 2 +- levels/files/files-delete | 8 +- levels/index/change | 2 +- levels/index/compare | 24 +- levels/index/new | 2 +- levels/index/reset | 12 +- levels/index/steps | 6 +- levels/intro/commit | 2 +- levels/intro/copies | 13 +- levels/intro/remote | 6 +- levels/intro/risky | 5 +- levels/intro/who-are-you | 2 +- levels/low-level/basics | 4 +- levels/low-level/blob-remove | 6 +- levels/low-level/index-add | 6 +- levels/low-level/index-remove | 12 +- levels/low-level/index-update | 14 +- levels/low-level/puzzle-apocalypse | 4 +- levels/low-level/puzzle-precious-blob | 2 +- levels/low-level/ref-create | 8 +- levels/low-level/ref-move | 8 +- levels/low-level/ref-remove | 8 +- levels/low-level/tree-create | 12 +- levels/low-level/tree-nested | 8 +- levels/low-level/tree-read | 20 +- levels/merge/conflict | 12 +- levels/merge/merge | 42 +- levels/merge/merge-abort | 6 +- levels/py_levels.py | 119 ---- levels/remotes/friend | 4 +- levels/remotes/problems | 6 +- levels/sandbox/remote | 4 +- levels/sandbox/three-commits | 6 +- levels/shit-happens/bad-commit | 4 +- levels/shit-happens/pushed-something-broken | 32 +- levels/shit-happens/restore-a-file | 4 +- .../shit-happens/restore-a-file-from-the-past | 4 +- levels/stash/stash | 6 +- levels/stash/stash-branch | 6 +- levels/stash/stash-clear | 10 +- levels/stash/stash-merge | 8 +- levels/stash/stash-pop | 6 +- levels/tags/add-tag | 6 +- levels/tags/add-tag-later | 6 +- levels/tags/remote-tag | 4 +- levels/tags/remove-tag | 6 +- levels/unused/checkout | 3 +- levels/unused/fetch | 6 +- levels/unused/files-move | 6 +- levels/unused/index-mv | 2 +- levels/unused/pull-push | 8 +- levels/unused/remotes-add | 2 +- levels/unused/restore | 8 +- levels/unused/split | 12 +- levels/unused/steps | 8 +- levels/workflows/gitignore | 2 +- levels/workflows/pr | 2 +- scenes/file_browser.tscn | 6 +- scenes/shell.gd | 25 +- tr_localization.py | 166 ------ translations..translation | Bin 2194 -> 2194 bytes translations.csv | 554 +++++++++++++++++- translations.csv.import | 4 +- translations.en.translation | Bin 3977 -> 297 bytes translations.ru.translation | Bin 7368 -> 297 bytes 75 files changed, 809 insertions(+), 703 deletions(-) delete mode 100644 levels/cli_translations_for_csv.txt delete mode 100644 levels/py_levels.py delete mode 100644 tr_localization.py diff --git a/levels/bisect/bisect b/levels/bisect/bisect index b3666708..51765ffe 100644 --- a/levels/bisect/bisect +++ b/levels/bisect/bisect @@ -7,15 +7,15 @@ bisect_description_262 [setup] -echo "You still have your key." > you +echo "@@setup_auto_217@@" > you for i in {1..30}; do if test $i -eq 12; then - echo "Your pocket is empty." > you - echo "Is on the ground." > key + echo "@@setup_auto_218@@" > you + echo "@@setup_auto_219@@" > key fi if test $i -eq 13; then - echo "Is holding a key in its beak." > bird + echo "@@setup_auto_220@@" > bird rm key fi if test $i -eq 14; then diff --git a/levels/branches/branch-create b/levels/branches/branch-create index f11b30f1..49e7a3e8 100644 --- a/levels/branches/branch-create +++ b/levels/branches/branch-create @@ -11,15 +11,15 @@ cli_branchcreate_009 [setup] -echo "You wrap the birthday present, and grab your concert ticket." > you +echo "@@setup_auto_193@@" > you git add . git commit -m "Evening preparations" -echo "You go to the birthday party!" >> you +echo "@@setup_auto_194@@" >> you git add . git commit -m "Go to the birthday" git checkout HEAD~1 -echo "You go to the concert!" > you +echo "@@setup_auto_195@@" > you git add . git commit -m "Go to the concert" diff --git a/levels/branches/branch-remove b/levels/branches/branch-remove index 373261ba..6e029122 100644 --- a/levels/branches/branch-remove +++ b/levels/branches/branch-remove @@ -7,29 +7,29 @@ branchremove_description_109 [setup] -echo You leave your house and start walking to school. > you +echo @@setup_auto_186@@ > you git add . git commit -m "Good morning!" -echo You walk on the right side of the street. >> you +echo @@setup_auto_187@@ >> you git commit -am "Right side" -echo You jump over an manhole in the walkway, and arrive at school on time. >> you +echo @@setup_auto_188@@ >> you git commit -am "Jump" git checkout HEAD^ -b friend -echo Suddenly, you fall down, splash into stinking water, and are eaten by an alligator. >> you +echo @@setup_auto_189@@ >> you git commit -am "A new friend" git checkout HEAD~2 -b music -echo You walk on the left side of the street. >> you +echo @@setup_auto_190@@ >> you git commit -am "Left side" -echo Because you\'re kind of late, you start running. Someone throws a piano out of their windows, and it smashes you. >> you +echo @@setup_auto_191@@ >> you git commit -am "Sounds nice" git checkout HEAD^ -b ice-cream -echo You\'re not in a hurry, and walk slowly. You even get some ice cream on your way. You arrive at school too late, your teacher is angry, and you are expelled. >> you +echo @@setup_auto_192@@ >> you git commit -am "Yum" git branch -M main leap diff --git a/levels/branches/checkout-commit b/levels/branches/checkout-commit index d76d6944..c8ee1fcf 100644 --- a/levels/branches/checkout-commit +++ b/levels/branches/checkout-commit @@ -13,18 +13,16 @@ cli_checkoutcommit_016 [setup] -echo "This piggy bank belongs to the big sister. -It contains 10 coins." > piggy_bank +echo "@@setup_auto_201@@" > piggy_bank git add . git commit -m "The beginning" -echo "A young girl with brown, curly hair." > little_sister +echo "@@setup_auto_202@@" > little_sister git add . git commit -m "Little sister comes in" -echo "Has 10 coins." >> little_sister -echo "This piggy bank belongs to the big sister. -It is empty." > piggy_bank +echo "@@setup_auto_203@@" >> little_sister +echo "@@setup_auto_204@@" > piggy_bank git add . git commit -m "Little sister does something" diff --git a/levels/branches/fork b/levels/branches/fork index adaec340..23fde3c1 100644 --- a/levels/branches/fork +++ b/levels/branches/fork @@ -20,14 +20,13 @@ cli_fork_013 [setup] mkdir cage -echo "Looks very hungry." > cage/lion +echo "@@setup_auto_196@@" > cage/lion -echo "A small child. -It really loves cats!" > child +echo "@@setup_auto_197@@" > child git add . git commit -m "The beginning" -echo "It's holding a lollipop." >> child +echo "@@setup_auto_198@@" >> child git commit -am "The child buys something" mv child cage @@ -35,11 +34,11 @@ git add . git commit -m "The child climbs somewhere" git rm cage/child -echo "Looks happy. :)" > cage/lion +echo "@@setup_auto_199@@" > cage/lion git add . git commit -m "Oh no" -echo "It's sleeping." > cage/lion +echo "@@setup_auto_200@@" > cage/lion git add . git commit -m "Nap time!" diff --git a/levels/branches/grow b/levels/branches/grow index c75df78b..380fde9e 100644 --- a/levels/branches/grow +++ b/levels/branches/grow @@ -13,16 +13,16 @@ cli_grow_008 [setup] -echo "You wrap the birthday present, and grab your concert ticket." > you +echo "@@setup_auto_183@@" > you git add . git commit -m "Evening preparations" -echo "You go to the birthday party!" >> you +echo "@@setup_auto_184@@" >> you git add . git commit -m "Go to the birthday" git branch birthday git checkout HEAD~1 -echo "You go to the concert!" > you +echo "@@setup_auto_185@@" > you git add . git commit -m "Go to the concert" git branch concert diff --git a/levels/branches/reorder b/levels/branches/reorder index 7de933ee..00d3d0d4 100644 --- a/levels/branches/reorder +++ b/levels/branches/reorder @@ -7,55 +7,31 @@ reorder_description_099 [setup] -echo "You do not have a baguette. - -You do not have coffee. - -You do not have a donut." > you +echo "@@setup_auto_177@@" > you git add . git commit -m "The Beginning" git checkout -b coffee -echo "You have a baguette. - -You do not have coffee. - -You do not have a donut." > you +echo "@@setup_auto_178@@" > you git add . git commit -m "You buy a baguette" -echo "You ate a baguette. - -You do not have coffee. - -You do not have a donut." > you +echo "@@setup_auto_179@@" > you git add . git commit -m "You eat the baguette" git checkout -b baguette main -echo "You do not have a baguette. - -You have coffee. - -You do not have a donut." > you +echo "@@setup_auto_180@@" > you git add . git commit -m "You buy some coffee" -echo "You do not have a baguette. - -You drank coffee. - -You do not have a donut." > you +echo "@@setup_auto_181@@" > you git add . git commit -m "You drink the coffee" git checkout -b donut main -echo "You do not have a baguette. - -You do not have coffee. - -You have a donut." > you +echo "@@setup_auto_182@@" > you git add . git commit -m "You buy a donut" diff --git a/levels/changing-the-past/rebase b/levels/changing-the-past/rebase index c89742fd..211d25b1 100644 --- a/levels/changing-the-past/rebase +++ b/levels/changing-the-past/rebase @@ -7,63 +7,35 @@ rebase_description_254 [setup] -echo "You do not have a baguette. - -You do not have coffee. - -You do not have a donut." > you +echo "@@setup_auto_147@@" > you git add . git commit -m "The Beginning" git checkout -b baguette main -echo "You have a baguette. - -You do not have coffee. - -You do not have a donut." > you +echo "@@setup_auto_148@@" > you git add . git commit -m "You buy a baguette" -echo "You ate a baguette. - -You do not have coffee. - -You do not have a donut." > you +echo "@@setup_auto_149@@" > you git add . git commit -m "You eat the baguette" git checkout -b coffee main -echo "You do not have a baguette. - -You have coffee. - -You do not have a donut." > you +echo "@@setup_auto_150@@" > you git add . git commit -m "You buy some coffee" -echo "You do not have a baguette. - -You drank coffee. - -You do not have a donut." > you +echo "@@setup_auto_151@@" > you git add . git commit -m "You drink the coffee" git checkout -b donut main -echo "You do not have a baguette. - -You do not have coffee. - -You have a donut." > you +echo "@@setup_auto_152@@" > you git add . git commit -m "You buy a donut" -echo "You do not have a baguette. - -You do not have coffee. - -You ate a donut." > you +echo "@@setup_auto_153@@" > you git add . git commit -m "You eat the donut" diff --git a/levels/changing-the-past/reorder b/levels/changing-the-past/reorder index 6a0ce74a..e17f20ba 100644 --- a/levels/changing-the-past/reorder +++ b/levels/changing-the-past/reorder @@ -7,61 +7,21 @@ reorder_description_258 [setup] -echo "You just woke up. - -You are NOT wearing underwear. - -You are NOT wearing pants. - -You are NOT wearing a shirt. - -You are NOT wearing shoes." > you +echo "@@setup_auto_142@@" > you git add . git commit -m "The Beginning" -echo "You just woke up. - -You are NOT wearing underwear. - -You are NOT wearing pants. - -You are NOT wearing a shirt. - -You are wearing shoes." > you +echo "@@setup_auto_143@@" > you git commit -am "Put on shoes" -echo "You just woke up. - -You are NOT wearing underwear. - -You are wearing pants. - -You are NOT wearing a shirt. - -You are wearing shoes." > you +echo "@@setup_auto_144@@" > you git commit -am "Put on pants" -echo "You just woke up. - -You are wearing underwear. - -You are wearing pants. - -You are NOT wearing a shirt. - -You are wearing shoes." > you +echo "@@setup_auto_145@@" > you git commit -am "Put on underwear" -echo "You just woke up. - -You are wearing underwear. - -You are wearing pants. - -You are wearing a shirt. - -You are wearing shoes." > you +echo "@@setup_auto_146@@" > you git commit -am "Put on shirt" [win] diff --git a/levels/cli_translations_for_csv.txt b/levels/cli_translations_for_csv.txt deleted file mode 100644 index fbc4fa81..00000000 --- a/levels/cli_translations_for_csv.txt +++ /dev/null @@ -1,18 +0,0 @@ -cli_remote_001,"To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice.", -cli_commit_002,"Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below!", -cli_commit_003,"This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :)", -cli_cli_004,"But there's another way to interact with Git:", -cli_cli_005,"Try typing `git init` into the black terminal below, and pressing the enter key!", -cli_new_006,"You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time!", -cli_grow_007,"To travel to a branch, type `git checkout name_of_the_branch`.", -cli_grow_008,"And to travel to the last commit, type `git checkout --detach name_of_the_branch`.", -cli_branchcreate_009,"Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called ""birthday"", you can type `git checkout birthday` to travel to it!", -cli_fork_010,"The blue animal represents a concept known as the ""HEAD pointer"" in Git: It shows you which commit is the current one.", -cli_fork_011,"Here's a cool trick to go to the previous commit:", -cli_fork_012,"git checkout HEAD^", -cli_fork_013,"You can also go back two commits by typing, for example:", -cli_fork_014,"git checkout HEAD~2", -cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want!", -cli_checkoutcommit_016,"This will insert the commit's unique identifier!", -cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:", -cli_filesdelete_018,"rm *web", diff --git a/levels/files/files-add b/levels/files/files-add index acc87851..8e5b22c1 100644 --- a/levels/files/files-add +++ b/levels/files/files-add @@ -7,7 +7,7 @@ filesadd_description_249 [setup] -echo A yellow cozy bed. > bed +echo @@setup_auto_221@@ > bed [win] diff --git a/levels/files/files-delete b/levels/files/files-delete index b0adf76e..e0ef8a40 100644 --- a/levels/files/files-delete +++ b/levels/files/files-delete @@ -13,10 +13,10 @@ cli_filesdelete_017 [setup] -echo A tiny spider web is next to your window. > tiny_web -echo A big spider web sticks above your bed. > big_web -echo A cozy bed. > bed -echo An extra thick spider web is right beside your door. > thick_web +echo @@setup_auto_222@@ > tiny_web +echo @@setup_auto_223@@ > big_web +echo @@setup_auto_224@@ > bed +echo @@setup_auto_225@@ > thick_web [win] diff --git a/levels/index/change b/levels/index/change index 97af008f..a779d06e 100644 --- a/levels/index/change +++ b/levels/index/change @@ -11,7 +11,7 @@ change_win_060 [setup] -echo "The candle is burning with a blue flame." > candle +echo "@@setup_auto_024@@" > candle git add . git commit -m "The beginning" diff --git a/levels/index/compare b/levels/index/compare index 52a24008..a08291c2 100644 --- a/levels/index/compare +++ b/levels/index/compare @@ -12,38 +12,38 @@ git branch --show-current | grep step-by-step [setup] -echo "A small, but heavy glass ball." > ball -echo "A thin book, that's standing upright." > book -echo "A candle, burning with a blue flame." > candle -echo "A smoke detector. It's absolutely silent." > smoke_detector +echo "@@setup_auto_025@@" > ball +echo "@@setup_auto_026@@" > book +echo "@@setup_auto_027@@" > candle +echo "@@setup_auto_028@@" > smoke_detector git add . git commit -m "The beginning" git branch -M all-at-once -echo "The ball is now touching the book." > ball -echo "The book has fallen over." > book -echo "The candle has been blown out." > candle +echo "@@setup_auto_029@@" > ball +echo "@@setup_auto_030@@" > book +echo "@@setup_auto_031@@" > candle git commit -am "The end" -terminal_button2_022 +git checkout HEAD^ git checkout -b step-by-step -echo "The ball is now touching the book." > ball +echo "@@setup_auto_032@@" > ball git commit -am "The ball rolls towards the book" -echo "The book has fallen over." > book +echo "@@setup_auto_033@@" > book git commit -am "The book falls over" -echo "The candle has been blown out." > candle +echo "@@setup_auto_034@@" > candle git commit -am "The book blows out the candle" git checkout HEAD~3 [win] -# Pick the timeline that's clearer, and make the alarm go off! +# compare_win_hint_073 git show step-by-step:smoke_detector | tail -n 1 | grep -v "absolutely silent" diff --git a/levels/index/new b/levels/index/new index 18c64e72..3623f586 100644 --- a/levels/index/new +++ b/levels/index/new @@ -11,7 +11,7 @@ cli_new_006 [setup] -echo "The candle is burning with a blue flame." > candle +echo "@@setup_auto_038@@" > candle [win] diff --git a/levels/index/reset b/levels/index/reset index 1229ad3e..f62cffda 100644 --- a/levels/index/reset +++ b/levels/index/reset @@ -7,15 +7,15 @@ reset_description_055 [setup] -echo "It's burning!" > red_candle -echo "It's burning!" > green_candle -echo "It's burning!" > blue_candle +echo "@@setup_auto_039@@" > red_candle +echo "@@setup_auto_040@@" > green_candle +echo "@@setup_auto_041@@" > blue_candle git add . git commit -m "The beginning" -echo "It's been blown out." > red_candle -echo "It's been blown out." > green_candle -echo "It's been blown out." > blue_candle +echo "@@setup_auto_042@@" > red_candle +echo "@@setup_auto_043@@" > green_candle +echo "@@setup_auto_044@@" > blue_candle git add . [win] diff --git a/levels/index/steps b/levels/index/steps index d8782317..2e412325 100644 --- a/levels/index/steps +++ b/levels/index/steps @@ -7,9 +7,9 @@ steps_description_064 [setup] -echo "A hammer, balancing on its handle." > hammer -echo "A bottle, containing a clear liquid." > bottle -echo "A white sugar cube." > sugar_cube +echo "@@setup_auto_035@@" > hammer +echo "@@setup_auto_036@@" > bottle +echo "@@setup_auto_037@@" > sugar_cube git add . git commit -m "The beginning" diff --git a/levels/intro/commit b/levels/intro/commit index 268d91d3..25b244ad 100644 --- a/levels/intro/commit +++ b/levels/intro/commit @@ -13,7 +13,7 @@ cli_commit_003 [setup] -echo "The glass is full of water." > glass +echo "@@setup_auto_018@@" > glass [win] diff --git a/levels/intro/copies b/levels/intro/copies index f1635306..1b5e93fd 100644 --- a/levels/intro/copies +++ b/levels/intro/copies @@ -13,20 +13,13 @@ copies_congrats_142 rm -rf .git -echo "~ Why I want to learn Git ~ +echo "@@setup_auto_021@@" >> form.txt -(I still need to write this.)" >> form.txt +echo "@@setup_auto_022@@" >> form2.txt -echo "~ Why I want to learn Git ~ -- So that I can undo mistakes" >> form2.txt - - -echo "~ Why I want to learn Git ~ - -- So that I can undo mistakes -- To track my projects over time" >> form2_final.txt +echo "@@setup_auto_023@@" >> form2_final.txt cp form2_final.txt form2_really_final.txt diff --git a/levels/intro/remote b/levels/intro/remote index 70315172..e8e5c9d6 100644 --- a/levels/intro/remote +++ b/levels/intro/remote @@ -15,7 +15,7 @@ remote_congrats_130 [setup] -echo "~ List of current students ~" > students +echo "@@setup_auto_016@@" > students git add . git commit -m "Initial version" git push -u teacher main @@ -26,9 +26,7 @@ git update-ref -d refs/remotes/teacher/main git reset --hard main -echo " -- Sam -- Alex" >> students +echo "@@setup_auto_017@@" >> students git add . git commit -m "Added two students" diff --git a/levels/intro/risky b/levels/intro/risky index ff38bc16..77d3709d 100644 --- a/levels/intro/risky +++ b/levels/intro/risky @@ -13,10 +13,7 @@ risky_congrats_126 rm -rf .git -echo "~ Why I want to learn Git ~ - -- So that I can undo mistakes -- To track my projects over time" >> form.txt +echo "@@setup_auto_019@@" >> form.txt [actions] diff --git a/levels/intro/who-are-you b/levels/intro/who-are-you index 9bc1d580..3c53ee84 100644 --- a/levels/intro/who-are-you +++ b/levels/intro/who-are-you @@ -9,7 +9,7 @@ whoareyou_description_117 git config --global user.name "You" -echo "~ Why do you want to learn how to use time machines? ~ +echo @@setup_auto_020@@ [ ] To make sure that my cat doesn't eat my homework. [ ] So I don't have to keep copies of all my essays. diff --git a/levels/low-level/basics b/levels/low-level/basics index 1603fd18..c0c25e14 100644 --- a/levels/low-level/basics +++ b/levels/low-level/basics @@ -9,8 +9,8 @@ basics_congrats_294 [setup] mkdir riddle -echo "ppl p" > riddle/consonants -echo "ae ie" > riddle/vowels +echo "@@setup_auto_077@@" > riddle/consonants +echo "@@setup_auto_078@@" > riddle/vowels [win] diff --git a/levels/low-level/blob-remove b/levels/low-level/blob-remove index ba6706b6..ff0d9f12 100644 --- a/levels/low-level/blob-remove +++ b/levels/low-level/blob-remove @@ -8,9 +8,9 @@ blobremove_congrats_284 [setup] -echo "My master password is a1b2c3d4e5" | git hash-object -w --stdin -echo "This blob really should not exist" | git hash-object -w --stdin -echo "This is a virus" | git hash-object -w --stdin +echo "@@setup_auto_112@@" | git hash-object -w --stdin +echo "@@setup_auto_113@@" | git hash-object -w --stdin +echo "@@setup_auto_114@@" | git hash-object -w --stdin [setup goal] diff --git a/levels/low-level/index-add b/levels/low-level/index-add index 070e4c49..b227d510 100644 --- a/levels/low-level/index-add +++ b/levels/low-level/index-add @@ -10,9 +10,9 @@ indexadd_congrats_297 [setup goal] -echo "file 1" > file1 -echo "file 2" > file2 -echo "file 3" > file3 +echo "@@setup_auto_085@@" > file1 +echo "@@setup_auto_086@@" > file2 +echo "@@setup_auto_087@@" > file3 git add . [win] diff --git a/levels/low-level/index-remove b/levels/low-level/index-remove index e3f8eb3c..d8ab2233 100644 --- a/levels/low-level/index-remove +++ b/levels/low-level/index-remove @@ -4,16 +4,16 @@ indexremove_description_277 [setup] -echo "file 1" > file1 -echo "file 2" > file2 -echo "file 3" > file3 +echo "@@setup_auto_079@@" > file1 +echo "@@setup_auto_080@@" > file2 +echo "@@setup_auto_081@@" > file3 git add . [setup goal] -echo "file 1" > file1 -echo "file 2" > file2 -echo "file 3" > file3 +echo "@@setup_auto_082@@" > file1 +echo "@@setup_auto_083@@" > file2 +echo "@@setup_auto_084@@" > file3 git add . git update-index --force-remove file1 diff --git a/levels/low-level/index-update b/levels/low-level/index-update index fcfbed91..05a012cc 100644 --- a/levels/low-level/index-update +++ b/levels/low-level/index-update @@ -4,19 +4,19 @@ indexupdate_description_275 [setup] -echo "file 1" > file1 -echo "file 2" > file2 -echo "file 3" > file3 +echo "@@setup_auto_090@@" > file1 +echo "@@setup_auto_091@@" > file2 +echo "@@setup_auto_092@@" > file3 git add . [setup goal] -echo "file 1" > file1 -echo "file 2" > file2 -echo "file 3" > file3 +echo "@@setup_auto_093@@" > file1 +echo "@@setup_auto_094@@" > file2 +echo "@@setup_auto_095@@" > file3 git add . -echo "new content" > file1 +echo "@@setup_auto_096@@" > file1 git update-index file1 [win] diff --git a/levels/low-level/puzzle-apocalypse b/levels/low-level/puzzle-apocalypse index 5cfc71ae..3f0bdf61 100644 --- a/levels/low-level/puzzle-apocalypse +++ b/levels/low-level/puzzle-apocalypse @@ -9,7 +9,7 @@ BLOB=$(git hash-object -w foo) echo bar > bar git add . git commit -m "Initial commit" -echo blabber >> bar +echo @@setup_auto_115@@ >> bar git commit -a -m "Second commit" git update-ref refs/important HEAD git update-ref refs/interesting "$BLOB" @@ -21,7 +21,7 @@ BLOB=$(git hash-object -w foo) echo bar > bar git add . git commit -m "Initial commit" -echo blabber >> bar +echo @@setup_auto_116@@ >> bar git commit -a -m "Second commit" git update-ref refs/important HEAD git update-ref refs/interesting "$BLOB" diff --git a/levels/low-level/puzzle-precious-blob b/levels/low-level/puzzle-precious-blob index fa17c3d3..0f7ab41f 100644 --- a/levels/low-level/puzzle-precious-blob +++ b/levels/low-level/puzzle-precious-blob @@ -6,7 +6,7 @@ puzzlepreciousblob_description_295 [setup goal] -BLOB=$(echo "I am precious" | git hash-object -w --stdin) +BLOB=$(echo "@@setup_auto_072@@" | git hash-object -w --stdin) git update-index --add --cacheinfo 100644,$BLOB,a git write-tree git update-index --force-remove a diff --git a/levels/low-level/ref-create b/levels/low-level/ref-create index 967aebee..1ed6d0ca 100644 --- a/levels/low-level/ref-create +++ b/levels/low-level/ref-create @@ -4,8 +4,8 @@ refcreate_description_305 [setup] -echo hello > hello -echo world > world +echo @@setup_auto_097@@ > hello +echo @@setup_auto_098@@ > world BLOB1=$(git hash-object -w hello) BLOB2=$(git hash-object -w world) git add . @@ -14,8 +14,8 @@ COMMIT=$(git commit-tree $TREE -m "Initial commit") [setup goal] -echo hello > hello -echo world > world +echo @@setup_auto_099@@ > hello +echo @@setup_auto_100@@ > world BLOB1=$(git hash-object -w hello) BLOB2=$(git hash-object -w world) git add . diff --git a/levels/low-level/ref-move b/levels/low-level/ref-move index 98f40be8..bef937eb 100644 --- a/levels/low-level/ref-move +++ b/levels/low-level/ref-move @@ -4,8 +4,8 @@ refmove_description_282 [setup] -echo hello > hello -echo world > world +echo @@setup_auto_123@@ > hello +echo @@setup_auto_124@@ > world BLOB1=$(git hash-object -w hello) BLOB2=$(git hash-object -w world) git add . @@ -17,8 +17,8 @@ git update-ref refs/b "$COMMIT" [setup goal] -echo hello > hello -echo world > world +echo @@setup_auto_125@@ > hello +echo @@setup_auto_126@@ > world BLOB1=$(git hash-object -w hello) BLOB2=$(git hash-object -w world) git add . diff --git a/levels/low-level/ref-remove b/levels/low-level/ref-remove index b6ed3338..ee6d295c 100644 --- a/levels/low-level/ref-remove +++ b/levels/low-level/ref-remove @@ -4,8 +4,8 @@ refremove_description_304 [setup] -echo hello > hello -echo world > world +echo @@setup_auto_073@@ > hello +echo @@setup_auto_074@@ > world BLOB1=$(git hash-object -w hello) BLOB2=$(git hash-object -w world) git add . @@ -17,8 +17,8 @@ git update-ref refs/beautiful_commit "$COMMIT" [setup goal] -echo hello > hello -echo world > world +echo @@setup_auto_075@@ > hello +echo @@setup_auto_076@@ > world BLOB1=$(git hash-object -w hello) BLOB2=$(git hash-object -w world) git add . diff --git a/levels/low-level/tree-create b/levels/low-level/tree-create index c2dbdeea..1e5a8a2e 100644 --- a/levels/low-level/tree-create +++ b/levels/low-level/tree-create @@ -8,16 +8,16 @@ treecreate_congrats_290 [setup] -echo "file 1" > file1 -echo "file 2" > file2 -echo "file 3" > file3 +echo "@@setup_auto_117@@" > file1 +echo "@@setup_auto_118@@" > file2 +echo "@@setup_auto_119@@" > file3 git add . [setup goal] -echo "file 1" > file1 -echo "file 2" > file2 -echo "file 3" > file3 +echo "@@setup_auto_120@@" > file1 +echo "@@setup_auto_121@@" > file2 +echo "@@setup_auto_122@@" > file3 git add . git write-tree diff --git a/levels/low-level/tree-nested b/levels/low-level/tree-nested index 2ab69f82..3fb7abd0 100644 --- a/levels/low-level/tree-nested +++ b/levels/low-level/tree-nested @@ -6,11 +6,11 @@ treenested_description_274 [setup goal] -echo "I'm the left arm" > arm1 -echo "I'm the right arm" > arm2 +echo "@@setup_auto_127@@" > arm1 +echo "@@setup_auto_128@@" > arm2 mkdir hip -echo "I'm the left leg" > hip/leg1 -echo "I'm the right leg" > hip/leg2 +echo "@@setup_auto_129@@" > hip/leg1 +echo "@@setup_auto_130@@" > hip/leg2 git add . git write-tree diff --git a/levels/low-level/tree-read b/levels/low-level/tree-read index 6c8034c7..7bb98cde 100644 --- a/levels/low-level/tree-read +++ b/levels/low-level/tree-read @@ -6,15 +6,15 @@ treeread_description_279 EMPTY_TREE=$(git write-tree) -echo "file 1" > file1 -echo "file 2" > file2 +echo "@@setup_auto_102@@" > file1 +echo "@@setup_auto_103@@" > file2 git add . git write-tree rm * -echo "file A" > fileA -echo "file B" > fileB -echo "file C" > fileC +echo "@@setup_auto_104@@" > fileA +echo "@@setup_auto_105@@" > fileB +echo "@@setup_auto_106@@" > fileC git add . TRIPLE_TREE=$(git write-tree) @@ -24,15 +24,15 @@ git read-tree "$EMPTY_TREE" EMPTY_TREE=$(git write-tree) -echo "file 1" > file1 -echo "file 2" > file2 +echo "@@setup_auto_107@@" > file1 +echo "@@setup_auto_108@@" > file2 git add . git write-tree rm * -echo "file A" > fileA -echo "file B" > fileB -echo "file C" > fileC +echo "@@setup_auto_109@@" > fileA +echo "@@setup_auto_110@@" > fileB +echo "@@setup_auto_111@@" > fileC git add . TRIPLE_TREE=$(git write-tree) diff --git a/levels/merge/conflict b/levels/merge/conflict index f535891c..387fb230 100644 --- a/levels/merge/conflict +++ b/levels/merge/conflict @@ -7,26 +7,24 @@ conflict_description_046 [setup] -echo "Just woke up. Is hungry." > sam +echo "@@setup_auto_011@@" > sam git add . git commit -m "The beginning" git checkout -b pancakes -echo "Had blueberry pancakes with maple syrup for breakfast." > sam +echo "@@setup_auto_012@@" > sam git add . git commit -m "Pancakes!" -echo " -Is at work." >> sam +echo "@@setup_auto_013@@" >> sam git commit -am "Go to work" git checkout -b muesli main -echo "Had muesli with oats and strawberries for breakfast." > sam +echo "@@setup_auto_014@@" > sam git add . git commit -m "Muesli!" -echo " -Is at work." >> sam +echo "@@setup_auto_015@@" >> sam git commit -am "Go to work" git checkout main diff --git a/levels/merge/merge b/levels/merge/merge index d1b59523..4483bf12 100644 --- a/levels/merge/merge +++ b/levels/merge/merge @@ -7,62 +7,34 @@ merge_description_041 [setup] -echo "You do not have a baguette. - -You do not have coffee. - -You do not have a donut." > you +echo "@@setup_auto_001@@" > you git add . git commit -m "The Beginning" -echo "You have a baguette. - -You do not have coffee. - -You do not have a donut." > you +echo "@@setup_auto_002@@" > you git add . git commit -m "You buy a baguette" -echo "You ate a baguette. - -You do not have coffee. - -You do not have a donut." > you +echo "@@setup_auto_003@@" > you git add . git commit -m "You eat the baguette" git checkout HEAD~2 -echo "You do not have a baguette. - -You have coffee. - -You do not have a donut." > you +echo "@@setup_auto_004@@" > you git add . git commit -m "You buy some coffee" -echo "You do not have a baguette. - -You drank coffee. - -You do not have a donut." > you +echo "@@setup_auto_005@@" > you git add . git commit -m "You drink the coffee" git checkout HEAD~2 -echo "You do not have a baguette. - -You do not have coffee. - -You have a donut." > you +echo "@@setup_auto_006@@" > you git add . git commit -m "You buy a donut" -echo "You do not have a baguette. - -You do not have coffee. - -You ate a donut." > you +echo "@@setup_auto_007@@" > you git add . git commit -m "You eat the donut" diff --git a/levels/merge/merge-abort b/levels/merge/merge-abort index 5cd9f5dd..0a6e2f60 100644 --- a/levels/merge/merge-abort +++ b/levels/merge/merge-abort @@ -7,12 +7,12 @@ mergeabort_description_050 [setup] -echo "A new day is starting" > you +echo "@@setup_auto_008@@" > you git add . git commit -m "Start" -echo "Walking down the Main Lane." >> you +echo "@@setup_auto_009@@" >> you git add . git commit -m "Main Lane" @@ -20,7 +20,7 @@ git commit -m "Main Lane" git checkout HEAD~1 -echo "Walking down the Side Lane." >> you +echo "@@setup_auto_010@@" >> you git add . git commit -m "Side Lane" diff --git a/levels/py_levels.py b/levels/py_levels.py deleted file mode 100644 index e51bab0a..00000000 --- a/levels/py_levels.py +++ /dev/null @@ -1,119 +0,0 @@ -import os -import re -import csv - -# --- Конфигурация --- -# Имя файла, в который будут сохранены пары ключ-текст -OUTPUT_FILENAME = "cli_translations_for_csv.txt" - -# --- Глобальные переменные --- -# Список для хранения всех найденных пар [ключ, текст] -key_text_pairs = [] -# Глобальный счетчик для обеспечения уникальности ключей -key_counter = 1 - -def sanitize_for_key(text): - """Превращает имя файла в безопасную часть ключа.""" - return re.sub(r'[^a-zA-Z0-9_]+', '', text.lower()) - -def process_level_file(filepath): - """ - Обрабатывает один файл уровня: находит секции [cli], - извлекает текст, генерирует ключи и готовит новые строки файла. - """ - global key_counter - - # Создаем базовое имя для ключей из имени файла - base_filename = sanitize_for_key(os.path.splitext(os.path.basename(filepath))[0]) - - try: - with open(filepath, 'r', encoding='utf-8') as f: - lines = f.readlines() - except Exception as e: - print(f" ОШИБКА: Не удалось прочитать файл {filepath}. Пропуск. {e}") - return - - new_lines = [] - in_cli_section = False - file_changed = False - - for line in lines: - stripped_line = line.strip() - - # Проверяем, не находимся ли мы в новой секции - if stripped_line.startswith('[') and stripped_line.endswith(']'): - in_cli_section = (stripped_line == '[cli]') - new_lines.append(line) - continue - - # Если мы в секции [cli] и строка не пустая - if in_cli_section and stripped_line: - original_text = stripped_line - - # Генерируем новый ключ - key = f"cli_{base_filename}_{str(key_counter).zfill(3)}" - key_counter += 1 - - # Сохраняем пару для будущего TXT-файла - key_text_pairs.append([key, original_text]) - - # Заменяем оригинальную строку на ключ - # Сохраняем исходные отступы, заменяя только текст - indentation = line[:len(line) - len(line.lstrip())] - new_lines.append(f"{indentation}{key}\n") - - file_changed = True - print(f" Найден текст в {os.path.basename(filepath)}: \"{original_text[:60]}...\" -> {key}") - else: - # Если мы не в секции [cli] или строка пустая, оставляем ее как есть - new_lines.append(line) - - # Если в файле были изменения, перезаписываем его - if file_changed: - try: - with open(filepath, 'w', encoding='utf-8') as f: - f.writelines(new_lines) - print(f" -> Файл {os.path.basename(filepath)} успешно изменен.") - except Exception as e: - print(f" ОШИБКА: Не удалось записать в файл {filepath}. {e}") - -def main(): - """Главная функция скрипта.""" - print("Запуск скрипта для перевода секций [cli]...") - print(f"Рабочая директория: {os.getcwd()}") - print("ВАЖНО: Убедитесь, что вы сделали резервную копию (коммит в Git)!") - input("Нажмите Enter для продолжения...") - - # Рекурсивно обходим все файлы и папки, начиная с текущей ('.') - for root, _, files in os.walk('.'): - for filename in files: - # Пропускаем файлы 'sequence' - if filename == 'sequence': - continue - - filepath = os.path.join(root, filename) - process_level_file(filepath) - - # Если мы нашли хотя бы один текст для перевода - if key_text_pairs: - print(f"\nНайдено {len(key_text_pairs)} строк текста.") - print(f"Сохранение пар ключ-текст в файл '{OUTPUT_FILENAME}'...") - try: - with open(OUTPUT_FILENAME, 'w', newline='', encoding='utf-8') as f: - # Используем csv.writer для корректной обработки кавычек и запятых - writer = csv.writer(f, quoting=csv.QUOTE_ALL) - for key, text in key_text_pairs: - # Записываем в формате: "ключ","английский текст", - # Пустая строка в конце добавляет ту самую висячую запятую - writer.writerow([key, text, '']) - print(f" Файл '{OUTPUT_FILENAME}' успешно создан.") - print("\nТеперь скопируйте содержимое этого файла и вставьте в конец вашего основного translations.csv") - except Exception as e: - print(f" ОШИБКА: Не удалось создать файл '{OUTPUT_FILENAME}'. {e}") - else: - print("\nТекст в секциях [cli] для перевода не найден.") - - print("\nСкрипт завершил работу.") - -if __name__ == "__main__": - main() diff --git a/levels/remotes/friend b/levels/remotes/friend index 3ec5062f..b8dd649e 100644 --- a/levels/remotes/friend +++ b/levels/remotes/friend @@ -7,7 +7,7 @@ friend_description_310 [setup yours] -echo "Line 1" > essay +echo "@@setup_auto_226@@" > essay git add . git commit -m "One line" @@ -16,7 +16,7 @@ git push -u friend main [setup friend] git checkout main -echo "Line 2, gnihihi" >> essay +echo "@@setup_auto_227@@" >> essay git commit -am "Another line" [actions friend] diff --git a/levels/remotes/problems b/levels/remotes/problems index 05664ff2..97dd7050 100644 --- a/levels/remotes/problems +++ b/levels/remotes/problems @@ -7,19 +7,19 @@ problems_description_307 [setup yours] -echo "The bike shed should be ???" > file +echo "@@setup_auto_228@@" > file git add . git commit -m "initial" git push -u friend main -echo "The bike shed should be green" > file +echo "@@setup_auto_229@@" > file [setup friend] git checkout main -echo "The bike shed should be blue" > file +echo "@@setup_auto_230@@" > file git commit -a -m "friends version" [win] diff --git a/levels/sandbox/remote b/levels/sandbox/remote index 24d1dc42..585a81bc 100644 --- a/levels/sandbox/remote +++ b/levels/sandbox/remote @@ -7,7 +7,7 @@ remote_description_273 [setup yours] -echo "Line 1" > essay +echo "@@setup_auto_157@@" > essay git add . git commit -m "Initial commit" @@ -16,5 +16,5 @@ git push -u friend main [setup friend] git checkout main -echo "Line 2" >> essay +echo "@@setup_auto_158@@" >> essay git commit -am "Another line" diff --git a/levels/sandbox/three-commits b/levels/sandbox/three-commits index 09f68ac0..3ccde7bd 100644 --- a/levels/sandbox/three-commits +++ b/levels/sandbox/three-commits @@ -3,14 +3,14 @@ cards = checkout add reset-file checkout-file commit merge rebase [setup] -echo "You wake up." > you +echo "@@setup_auto_154@@" > you git add . git commit -m "The beginning" -echo "You drink coffee." >> you +echo "@@setup_auto_155@@" >> you git commit -am "First things first" -echo "You hear a knock on the door." >> you +echo "@@setup_auto_156@@" >> you git commit -am "Who's there?" git branch not_main diff --git a/levels/shit-happens/bad-commit b/levels/shit-happens/bad-commit index 914ed492..fea29c7b 100644 --- a/levels/shit-happens/bad-commit +++ b/levels/shit-happens/bad-commit @@ -7,10 +7,10 @@ badcommit_description_219 [setup] -echo "1 2 3 4" > numbers +echo "@@setup_auto_209@@" > numbers git add . git commit -m "Initial commit" -echo "1 2 3 4 5 6 7 8 9 11" > numbers +echo "@@setup_auto_210@@" > numbers git commit -am "More numberrrrrs" [win] diff --git a/levels/shit-happens/pushed-something-broken b/levels/shit-happens/pushed-something-broken index c91c8762..7372f7dd 100644 --- a/levels/shit-happens/pushed-something-broken +++ b/levels/shit-happens/pushed-something-broken @@ -7,38 +7,14 @@ pushedsomethingbroken_description_217 [setup] -echo "this is fine - -? - -? - -?" > text +echo "@@setup_auto_211@@" > text git add . git commit -m fine -echo "this is fine - -this is also fine - -? - -?" > text +echo "@@setup_auto_212@@" > text git commit -am "also fine" -echo "this is fine - -this is also fine - -this is very bad - -?" > text +echo "@@setup_auto_213@@" > text git commit -am "very bad" -echo "this is fine - -this is also fine - -this is very bad - -this is fine again" > text +echo "@@setup_auto_214@@" > text git commit -am "fine again" git push team main diff --git a/levels/shit-happens/restore-a-file b/levels/shit-happens/restore-a-file index 1cebb802..ae0272c1 100644 --- a/levels/shit-happens/restore-a-file +++ b/levels/shit-happens/restore-a-file @@ -7,10 +7,10 @@ restoreafile_description_227 [setup] -echo important > essay +echo @@setup_auto_205@@ > essay git add . git commit -m "Initial commit" -echo "important content" > essay +echo "@@setup_auto_206@@" > essay git commit -am "Improve essay" rm essay diff --git a/levels/shit-happens/restore-a-file-from-the-past b/levels/shit-happens/restore-a-file-from-the-past index 98c151e5..13f3ca31 100644 --- a/levels/shit-happens/restore-a-file-from-the-past +++ b/levels/shit-happens/restore-a-file-from-the-past @@ -7,10 +7,10 @@ restoreafilefromthepast_description_224 [setup] -echo "good version" > essay +echo "@@setup_auto_207@@" > essay git add . git commit -m "Initial commit" -echo "bad version" > essay +echo "@@setup_auto_208@@" > essay git commit -am "\"Improve\" essay" [win] diff --git a/levels/stash/stash b/levels/stash/stash index 433184ee..020afbd2 100644 --- a/levels/stash/stash +++ b/levels/stash/stash @@ -7,17 +7,17 @@ stash_description_145 [setup] -echo "Apple Pie:" > recipe +echo "@@setup_auto_171@@" > recipe git add . git commit -m "creating a recipe" -echo "- 4 Apples" >> recipe +echo "@@setup_auto_172@@" >> recipe git add . git commit -m "Adding ingredients" -echo "- 500g Flour" >> recipe +echo "@@setup_auto_173@@" >> recipe git checkout main diff --git a/levels/stash/stash-branch b/levels/stash/stash-branch index 71b67148..c0d1362f 100644 --- a/levels/stash/stash-branch +++ b/levels/stash/stash-branch @@ -7,17 +7,17 @@ stashbranch_description_161 [setup] -echo "Apple Pie:" > recipe +echo "@@setup_auto_174@@" > recipe git add . git commit -m "creating a recipe" -echo "- 4 Apples" >> recipe +echo "@@setup_auto_175@@" >> recipe git add . git commit -m "Adding ingredients" -echo "- 500g Flour" >> recipe +echo "@@setup_auto_176@@" >> recipe git stash push git checkout main diff --git a/levels/stash/stash-clear b/levels/stash/stash-clear index 280589e0..da6bea02 100644 --- a/levels/stash/stash-clear +++ b/levels/stash/stash-clear @@ -7,23 +7,23 @@ stashclear_description_153 [setup] -echo "Apple Pie:" > recipe +echo "@@setup_auto_159@@" > recipe git add . git commit -m "creating a recipe" -echo "- 4 Apples" >> recipe +echo "@@setup_auto_160@@" >> recipe git add . git commit -m "Adding ingredients" -echo "- 500g Flour" >> recipe +echo "@@setup_auto_161@@" >> recipe git stash push -echo "- 200g Sugar" >> recipe +echo "@@setup_auto_162@@" >> recipe git stash push -echo "- Pinch of Salt" >> recipe +echo "@@setup_auto_163@@" >> recipe git stash push git checkout main diff --git a/levels/stash/stash-merge b/levels/stash/stash-merge index 5cc74959..a3b37c91 100644 --- a/levels/stash/stash-merge +++ b/levels/stash/stash-merge @@ -7,21 +7,21 @@ stashmerge_description_157 [setup] -echo "Apple Pie:" > recipe +echo "@@setup_auto_167@@" > recipe git add . git commit -m "creating a recipe" -echo "- 4 Apples" >> recipe +echo "@@setup_auto_168@@" >> recipe git add . git commit -m "Adding ingredients" -echo "- 500g Flour" >> recipe +echo "@@setup_auto_169@@" >> recipe git stash push -echo "- Pinch of Salt" >> recipe +echo "@@setup_auto_170@@" >> recipe git checkout main git add recipe diff --git a/levels/stash/stash-pop b/levels/stash/stash-pop index e4aa28bb..e54061bd 100644 --- a/levels/stash/stash-pop +++ b/levels/stash/stash-pop @@ -7,17 +7,17 @@ stashpop_description_149 [setup] -echo "Apple Pie:" > recipe +echo "@@setup_auto_164@@" > recipe git add . git commit -m "creating a recipe" -echo "- 4 Apples" >> recipe +echo "@@setup_auto_165@@" >> recipe git add . git commit -m "Adding ingredients" -echo "- 500g Flour" >> recipe +echo "@@setup_auto_166@@" >> recipe git stash push git checkout main diff --git a/levels/tags/add-tag b/levels/tags/add-tag index 33774e18..dc6cb18d 100644 --- a/levels/tags/add-tag +++ b/levels/tags/add-tag @@ -7,17 +7,17 @@ addtag_description_241 [setup] -echo "event 1" > feature-list +echo "@@setup_auto_131@@" > feature-list git add . git commit -m "Adding feature 1" -echo "event 2" >> feature-list +echo "@@setup_auto_132@@" >> feature-list git add . git commit -m "Adding feature 2" -echo "event 3" >> feature-list +echo "@@setup_auto_133@@" >> feature-list git add . git commit -m "Adding feature 3" diff --git a/levels/tags/add-tag-later b/levels/tags/add-tag-later index 466aa5c2..28a103e9 100644 --- a/levels/tags/add-tag-later +++ b/levels/tags/add-tag-later @@ -7,17 +7,17 @@ addtaglater_description_234 [setup] -echo "event 1" > feature-list +echo "@@setup_auto_134@@" > feature-list git add . git commit -m "Adding feature 1" -echo "event 2" >> feature-list +echo "@@setup_auto_135@@" >> feature-list git add . git commit -m "Adding feature 2" -echo "event 3" >> feature-list +echo "@@setup_auto_136@@" >> feature-list git add . git commit -m "Adding feature 3" diff --git a/levels/tags/remote-tag b/levels/tags/remote-tag index 67a1d64c..5f0892e4 100644 --- a/levels/tags/remote-tag +++ b/levels/tags/remote-tag @@ -9,11 +9,11 @@ remotetag_description_230 git checkout main git checkout main -echo "toothbrush sharing" > project-ideas +echo "@@setup_auto_137@@" > project-ideas git add . git commit -m "First idea" -echo "Is my phone upside down? App" >> project-ideas +echo "@@setup_auto_138@@" >> project-ideas git commit -am "Another idea" diff --git a/levels/tags/remove-tag b/levels/tags/remove-tag index bc88bccb..39058f03 100644 --- a/levels/tags/remove-tag +++ b/levels/tags/remove-tag @@ -7,17 +7,17 @@ removetag_description_238 [setup] -echo "event 1" > feature-list +echo "@@setup_auto_139@@" > feature-list git add . git commit -m "Adding feature 1" -echo "event 2" >> feature-list +echo "@@setup_auto_140@@" >> feature-list git add . git commit -m "Adding feature 2" -echo "event 3" >> feature-list +echo "@@setup_auto_141@@" >> feature-list git add . git commit -m "Adding feature 3" diff --git a/levels/unused/checkout b/levels/unused/checkout index e375ab04..4f905a99 100644 --- a/levels/unused/checkout +++ b/levels/unused/checkout @@ -20,8 +20,7 @@ git commit -a -m "Even better version" echo "D" >> essay.txt git commit -a -m "Marvelous version" -echo "blarg -blaaaargh" > essay.txt +echo "@@setup_auto_053@@" > essay.txt [win] diff --git a/levels/unused/fetch b/levels/unused/fetch index ae08fd61..9d34e36b 100644 --- a/levels/unused/fetch +++ b/levels/unused/fetch @@ -7,20 +7,20 @@ fetch_description_197 [setup] -echo "The bikeshed should be ???" > proposal +echo "@@setup_auto_049@@" > proposal git add . git commit -m "What do you think?" [setup friend1] git pull yours main -echo "The bikeshed should be green" > proposal +echo "@@setup_auto_050@@" > proposal git commit -am "Green" [setup friend2] git pull yours main -echo "The bikeshed should be blue" > proposal +echo "@@setup_auto_051@@" > proposal git commit -am "Blue" [win] diff --git a/levels/unused/files-move b/levels/unused/files-move index 8f620427..e87e5e2b 100644 --- a/levels/unused/files-move +++ b/levels/unused/files-move @@ -8,9 +8,9 @@ filesmove_description_180 [setup] -echo A yellow cupboard with lots of drawers. > cupboard -echo A really big yellow shelf. > shelf -echo A comfortable, yellow bed with yellow cushions. > bed +echo @@setup_auto_054@@ > cupboard +echo @@setup_auto_055@@ > shelf +echo @@setup_auto_056@@ > bed [win] diff --git a/levels/unused/index-mv b/levels/unused/index-mv index 014d86b3..bbc42bed 100644 --- a/levels/unused/index-mv +++ b/levels/unused/index-mv @@ -8,7 +8,7 @@ indexmv_description_211 [setup] echo a > a -echo SPECIAL > b +echo @@setup_auto_067@@ > b echo x > c git add . git commit -m "Initial commit" diff --git a/levels/unused/pull-push b/levels/unused/pull-push index c2884772..bc33876c 100644 --- a/levels/unused/pull-push +++ b/levels/unused/pull-push @@ -7,17 +7,17 @@ pullpush_description_194 [setup yours] -echo "Just woke up. Is hungry." > sam +echo "@@setup_auto_068@@" > sam git add . git commit -m "The beginning" git checkout -b pancakes -echo "Had blueberry pancakes with maple syrup for breakfast." > sam +echo "@@setup_auto_069@@" > sam git add . git commit -m "Pancakes!" git checkout -b muesli main -echo "Had muesli with oats and strawberries for breakfast." > sam +echo "@@setup_auto_070@@" > sam git add . git commit -m "Muesli!" @@ -31,7 +31,7 @@ git checkout main git merge pancakes git merge muesli -echo "Had pancakes with strawberries for breakfast." > sam +echo "@@setup_auto_071@@" > sam git add . git commit -m "Let's make this breakfast compromise" --author="Sidekick " diff --git a/levels/unused/remotes-add b/levels/unused/remotes-add index d98608dd..ae33d295 100644 --- a/levels/unused/remotes-add +++ b/levels/unused/remotes-add @@ -11,7 +11,7 @@ git remote remove friend [setup friend] -echo "I'm really committed to our friendship! <3" > love_letter +echo "@@setup_auto_052@@" > love_letter git add . git commit -m "Write a letter" diff --git a/levels/unused/restore b/levels/unused/restore index bbca6ac9..5fb3278b 100644 --- a/levels/unused/restore +++ b/levels/unused/restore @@ -7,17 +7,17 @@ restore_description_208 [setup] -echo "Initial version" > essay.txt +echo "@@setup_auto_045@@" > essay.txt git add . git commit -m "Initial commit" -echo "Improved version" > essay.txt +echo "@@setup_auto_046@@" > essay.txt git commit -a -m "Improved version" -echo "Best version" > essay.txt +echo "@@setup_auto_047@@" > essay.txt git commit -a -m "Best version" -echo "Less-good version" > essay.txt +echo "@@setup_auto_048@@" > essay.txt git commit -a -m "Less-good version" [win] diff --git a/levels/unused/split b/levels/unused/split index 77a38046..8e40a8d6 100644 --- a/levels/unused/split +++ b/levels/unused/split @@ -7,17 +7,17 @@ split_description_173 [setup] -echo something > file1 -echo something else > file2 +echo @@setup_auto_061@@ > file1 +echo @@setup_auto_062@@ > file2 git add . git commit -m "Initial commit" -echo this should happen first >> file1 -echo and this should happen after that >> file2 +echo @@setup_auto_063@@ >> file1 +echo @@setup_auto_064@@ >> file2 git commit -am "Both together" -echo this is some other change >> file1 -echo this is some other change >> file2 +echo @@setup_auto_065@@ >> file1 +echo @@setup_auto_066@@ >> file2 git commit -am "Something else" [win] diff --git a/levels/unused/steps b/levels/unused/steps index c336a842..6929ca7b 100644 --- a/levels/unused/steps +++ b/levels/unused/steps @@ -7,13 +7,13 @@ steps_description_175 [setup] -echo something > file1 -echo something else > file2 +echo @@setup_auto_057@@ > file1 +echo @@setup_auto_058@@ > file2 git add . git commit -m "Initial commit" -echo this should happen first >> file1 -echo and this should happen after that >> file2 +echo @@setup_auto_059@@ >> file1 +echo @@setup_auto_060@@ >> file2 [win] diff --git a/levels/workflows/gitignore b/levels/workflows/gitignore index d59b11f4..cd0a2bc0 100644 --- a/levels/workflows/gitignore +++ b/levels/workflows/gitignore @@ -7,7 +7,7 @@ gitignore_description_266 [setup] touch .gitignore -echo important > important +echo @@setup_auto_215@@ > important git add important git commit -m "Initial commit" diff --git a/levels/workflows/pr b/levels/workflows/pr index 5d54b54e..8eec03a6 100644 --- a/levels/workflows/pr +++ b/levels/workflows/pr @@ -12,7 +12,7 @@ rm -rf .git [setup friend] -echo "2 + 3 = " > file +echo "@@setup_auto_216@@" > file git add . git commit -m "Initial commit" diff --git a/scenes/file_browser.tscn b/scenes/file_browser.tscn index 0e0e7850..da877ad8 100644 --- a/scenes/file_browser.tscn +++ b/scenes/file_browser.tscn @@ -10,9 +10,6 @@ anchor_bottom = 1.0 rect_min_size = Vector2( 0, 142 ) theme = ExtResource( 3 ) script = ExtResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} [node name="Panel" type="Panel" parent="."] anchor_right = 1.0 @@ -74,6 +71,8 @@ size_flags_horizontal = 3 size_flags_vertical = 3 [node name="Grid" type="GridContainer" parent="Panel/Margin/Rows/Scroll"] +margin_right = 1904.0 +margin_bottom = 1064.0 size_flags_horizontal = 3 size_flags_vertical = 3 custom_constants/vseparation = 16 @@ -101,6 +100,7 @@ margin_left = -114.396 margin_top = -59.399 margin_right = -14.3955 margin_bottom = -14.399 +grow_horizontal = 0 focus_mode = 0 custom_fonts/font = ExtResource( 2 ) enabled_focus_mode = 0 diff --git a/scenes/shell.gd b/scenes/shell.gd index 83988472..655ec24f 100644 --- a/scenes/shell.gd +++ b/scenes/shell.gd @@ -19,7 +19,7 @@ func cd(dir): # output of the command. func run(command, crash_on_fail=true): var shell_command = ShellCommand.new() - shell_command.command = command + shell_command.command = translate_shell_command(command) shell_command.crash_on_fail = crash_on_fail run_async_thread(shell_command) @@ -28,8 +28,8 @@ func run(command, crash_on_fail=true): func run_async(command, pretty_command=null, crash_on_fail=true): var shell_command = ShellCommand.new() - shell_command.command = command - shell_command.pretty_command = command + shell_command.command = translate_shell_command(command) + shell_command.pretty_command = shell_command.command if pretty_command: shell_command.pretty_command = pretty_command shell_command.crash_on_fail = crash_on_fail @@ -125,6 +125,25 @@ func _shell_binary(): # c.disconnect_from_host() # s.stop() +func translate_shell_command(command: String) -> String: + var regex = RegEx.new() + var compile_result = regex.compile("@@([^@]+)@@") + + + if compile_result != OK: + print_debug("[Shell] ОШИБКА: Не удалось скомпилировать regex для перевода команд") + return command + + var result = command + var matches = regex.search_all(command) + + for match_obj in matches: + var key = match_obj.get_string(1) + var translated = tr(key) + result = result.replace("@@%s@@" % key, translated) + + return result + func read_from(c): var total_available = c.get_available_bytes() print(str(total_available)+" bytes available") diff --git a/tr_localization.py b/tr_localization.py deleted file mode 100644 index e1735e33..00000000 --- a/tr_localization.py +++ /dev/null @@ -1,166 +0,0 @@ -import os -import re -import csv -import json -from collections import OrderedDict - -# ... (секция конфигурации и глобальных переменных остается той же) ... -CSV_FILENAME = 'translations.csv' -DIRS_TO_PROCESS = ['scenes', 'levels'] -CARDS_JSON_PATH = 'resources/cards.json' -text_to_key_map = OrderedDict() -key_counter = 1 - -def sanitize_for_key(text): - return re.sub(r'[^a-zA-Z0-9_]+', '', text.lower()) - -def generate_key(base_name): - global key_counter - key = f"{base_name}_{str(key_counter).zfill(3)}" - key_counter += 1 - return key - -def add_text(text, base_name): - cleaned_text = text.strip() - if not cleaned_text or cleaned_text in text_to_key_map: - return cleaned_text - key = generate_key(base_name) - text_to_key_map[cleaned_text] = key - print(f" Найден текст: \"{cleaned_text[:60].replace(chr(10), ' ')}...\" -> Ключ: {key}") - return cleaned_text - -# --- ИСПРАВЛЕННАЯ ЛОГИКА СБОРА ДЛЯ УРОВНЕЙ --- -def collect_from_level_file(filepath, base_key): - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - - title_regex = re.compile(r'^\s*title\s*=\s*(.*)', re.MULTILINE) - match = title_regex.search(content) - if match: add_text(match.group(1), f"{base_key}_title") - - # Собираем description и congrats как единые блоки - for section_name in ['description', 'congrats']: - regex = re.compile(rf'\[{section_name}\]\n(.*?)(?=\n\[|$)', re.DOTALL) - match = regex.search(content) - if match: add_text(match.group(1), f"{base_key}_{section_name}") - - # Собираем подсказки из [win] построчно - win_hint_regex = re.compile(r'^\s*#\s*(.*)', re.MULTILINE) - win_regex = re.compile(r'\[win\]\n(.*?)(?=\n\[|$)', re.DOTALL) - win_match = win_regex.search(content) - if win_match: - for match in win_hint_regex.finditer(win_match.group(1)): - add_text(match.group(1), f"{base_key}_win_hint") - -# --- ИСПРАВЛЕННАЯ ЛОГИКА ЗАМЕНЫ ДЛЯ УРОВНЕЙ --- -def replace_in_level_file(filepath): - with open(filepath, 'r', encoding='utf-8') as f: - content = f.read() - original_content = content - - # Заменяем в обратном порядке, чтобы избежать замены частей ключей - for text, key in reversed(list(text_to_key_map.items())): - # Используем re.escape для безопасной замены текста со спецсимволами - escaped_text = re.escape(text) - content = re.sub(f'^{escaped_text}$', key, content, flags=re.MULTILINE) # Для блоков - content = re.sub(f'(?<=title = ){escaped_text}', key, content) # Для title - content = re.sub(f'(?<=# ){escaped_text}', key, content) # Для win hints - - if content != original_content: - with open(filepath, 'w', encoding='utf-8') as f: f.write(content) - print(f" Замена в уровне: {filepath}") - -# ... (остальной код скрипта, включая main, tscn, cards.json, остается таким же, как в localize_final.py) -# ... Я вставлю его целиком ниже для удобства. -def collect_from_tscn(filepath, base_key): - node_name_regex = re.compile(r'^\[node name="([^"]+)"') - text_regex = re.compile(r'^\s*(text|bbcode_text)\s*=\s*"((?:\\"|[^"])*)"') - current_node_name = "node" - with open(filepath, 'r', encoding='utf-8') as f: - for line in f: - match = node_name_regex.match(line) - if match: current_node_name = match.group(1) - match = text_regex.match(line) - if match: add_text(match.group(2).replace('\\"', '"'), f"{base_key}_{sanitize_for_key(current_node_name)}") - -def collect_from_cards_json(): - if not os.path.exists(CARDS_JSON_PATH): return - base_key = sanitize_for_key(os.path.splitext(os.path.basename(CARDS_JSON_PATH))[0]) - with open(CARDS_JSON_PATH, 'r', encoding='utf-8') as f: data = json.load(f) - for card in data: - card_id = card.get('id', 'card') - add_text(card.get('description'), f"card_{sanitize_for_key(card_id)}_desc") - -def replace_in_tscn(filepath): - text_regex = re.compile(r'^\s*(text|bbcode_text)\s*=\s*"((?:\\"|[^"])*)"') - with open(filepath, 'r', encoding='utf-8') as f: lines = f.readlines() - new_lines, changed = [], False - for line in lines: - match = text_regex.match(line) - if match: - prop, text = match.group(1), match.group(2).replace('\\"', '"').strip() - if text in text_to_key_map: - key = text_to_key_map[text] - indent = line[:line.find(prop)] - new_lines.append(f'{indent}{prop} = "{key}"\n') - changed = True - else: new_lines.append(line) - else: new_lines.append(line) - if changed: - with open(filepath, 'w', encoding='utf-8') as f: f.writelines(new_lines) - print(f" Замена в сцене: {filepath}") - -def replace_in_cards_json(): - if not os.path.exists(CARDS_JSON_PATH): return - with open(CARDS_JSON_PATH, 'r', encoding='utf-8') as f: - data = json.load(f, object_pairs_hook=OrderedDict) - changed = False - for card in data: - desc = card.get('description', "").strip() - if desc in text_to_key_map: - card['description'] = text_to_key_map[desc] - changed = True - if changed: - with open(CARDS_JSON_PATH, 'w', encoding='utf-8') as f: - json.dump(data, f, indent=4, ensure_ascii=False) - print(f" Замена в карточках: {CARDS_JSON_PATH}") - -def main(): - print("--- Фаза 1: Сбор всего текста ---") - for directory in DIRS_TO_PROCESS: - for root, _, files in os.walk(directory): - for filename in files: - filepath = os.path.join(root, filename) - base_key = sanitize_for_key(os.path.splitext(filename)[0]) - if filename.endswith('.tscn'): - collect_from_tscn(filepath, base_key) - elif directory == 'levels' and filename != 'sequence': - collect_from_level_file(filepath, base_key) - collect_from_cards_json() - if not text_to_key_map: - print("\nНовый текст для перевода не найден.") - return - print(f"\nНайдено {len(text_to_key_map)} уникальных строк. Запись в {CSV_FILENAME}...") - with open(CSV_FILENAME, 'w', newline='', encoding='utf-8') as f: - writer = csv.writer(f) - writer.writerow(['keys', 'en', 'ru']) - for text, key in text_to_key_map.items(): - writer.writerow([key, text, '']) - print("\n--- Фаза 2: Замена текста на ключи ---") - for directory in DIRS_TO_PROCESS: - for root, _, files in os.walk(directory): - for filename in files: - filepath = os.path.join(root, filename) - if filename.endswith('.tscn'): - replace_in_tscn(filepath) - elif directory == 'levels' and filename != 'sequence': - replace_in_level_file(filepath) - replace_in_cards_json() - print("\nСкрипт успешно завершил работу!") - print("ВАЖНО: Теперь внесите ручные изменения в game.gd и level.gd, как было описано.") - -if __name__ == '__main__': - print("Запуск ИСПРАВЛЕННОГО v2 скрипта локализации.") - print("ВАЖНО: Сделайте коммит или резервную копию перед запуском!") - input("Нажмите Enter для продолжения...") - main() diff --git a/translations..translation b/translations..translation index 38bc1dd633c4c8c78c2a572556a24fd7513edb87..4b3bdd9a4270dfac2d4d36aa1d5700922c3ad111 100644 GIT binary patch literal 2194 zcmbuBdq@;f6vjv0%FL|nVVT)jX<6!)1%*UKQ7IvaNfZS#yG*&Z?#9lVy)n%mYH3nQ zFR;=m$dXFgS|360Aeu1LWw;cFW>?%crvuRcwLmBz4RWcPGuLHRGwn{RV$XCtGc~K~P^A#Q z&!Oa~(m)_Ns-`LHR81NHiLXMH20@qwv&(cV7P~49hSZX4U9Y+sz%yxXm(8*6SD9vY z**3TVN|GNa2;@6blG!{%3PuD?c+Dp0z#GyJxSm%&th}S*JV*0Ki6)n#Wh6Z$X{RkzVv{A=gjJUJdNYHfUzd=L3Df=#}n@r z9K)B6j`#e~)|;VRPIa#1y-DR9uejLvW-^zXZp3yB<#MWfRsAIc*Bu@I$+e#!=sc9q-%l-KU(q)3_TFE#Sl6 zeqL29;AZ)>CtSd5%l(34I8N8`GVqz-IF374RtApY^6I0jb8)Ms`H&Y+dUy}_FUraD z1FVnAI8M*Umc1pmgyU~tw5_5(tfjan(YtsoH|`ybqq)*K&aQ6_ES>?+~S|~6h8?xjy$EN$3C9pG{2IO#vBvJ!)VWB9210ed)pH8y+KC@!aYq(1Zu7$V?zO1u5(!-ZpUufgj* z2>Pcc>(}*W{fd57uak|PdW-Hc3iNtezbr#sXXNX3x)=WHb+1vXHyI^H5%dAB*Be1i XguJ>35|2@46eT1i{5gYk_%-qqcR|}s literal 2194 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 SS^=&E19Wkg@O_p4hxs20aE8VJ From f739418c7b3a0d21addda082c4886d6fdd4bdbd5 Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 11/15] Fix bug with text in TextEdit going under CloseButton --- scenes/file_browser.tscn | 9 ++++++++- translations.csv | 2 +- translations.en.translation | Bin 297 -> 183 bytes translations.ru.translation | Bin 297 -> 183 bytes 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/scenes/file_browser.tscn b/scenes/file_browser.tscn index da877ad8..e5ee0c8e 100644 --- a/scenes/file_browser.tscn +++ b/scenes/file_browser.tscn @@ -1,9 +1,15 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://scenes/file_browser.gd" type="Script" id=1] [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=2] [ext_resource path="res://styles/theme.tres" type="Theme" id=3] +[sub_resource type="StyleBoxEmpty" id=1] +content_margin_left = 10.0 +content_margin_right = 145.0 +content_margin_top = 10.0 +content_margin_bottom = 10.0 + [node name="FileBrowser" type="Control" groups=["editors"]] anchor_right = 1.0 anchor_bottom = 1.0 @@ -86,6 +92,7 @@ __meta__ = { visible = false anchor_right = 1.0 anchor_bottom = 1.0 +custom_styles/normal = SubResource( 1 ) wrap_enabled = true __meta__ = { "_edit_use_anchors_": false diff --git a/translations.csv b/translations.csv index d4f4ab46..f03f91c6 100644 --- a/translations.csv +++ b/translations.csv @@ -1,7 +1,7 @@ keys,en,ru card_description_001,Description,Описание,, card_energy_002,0,0,, -music_button_button3_003,Toggle music,Переключить музыку,, +music_button_button3_003,Toggle music,Вкл/Выкл музыку arrow_id_004,label,метка,, cards_button_005,Draw new cards,Взять новые карты,, cards_energy_006,3,3,, diff --git a/translations.en.translation b/translations.en.translation index fd5a7e19db113a20808b34bc6868582971bef570..c50e65f18f9ae5e4d87b1a3d3ad9ed175a14e962 100644 GIT binary patch literal 183 zcmV;o07(B*Q$s@n000005C8x@0RRA>0000ewJ-f(Jpio)0P;v19ZW literal 297 zcmbu5I}gGz41|r4c!R{ozo=MQSr}1ZkKD*=tELHx)Bn%4bYNlPq)(17I_F^?=1P<1 zs0%REBe>sK>u2Jio^uletpBt^`~;F{?2{AgqhoJ#wCW@X9lrMhcS378ov3mpN=r0j zLTHO+joaDGr5D0000ewJ-f(Jpio)0P;v19ZsK>u2Jio^uletpBt^`~;F{?2{AgqhoJ#wCW@X9lrMhcS378ov3mpN=r0j zLTHO+joaDGr5D Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 12/15] Add notifications to localization --- nano.150869.save | 35 +++++++++++++++++++++++++++++++++++ scenes/cards.gd | 2 +- scenes/file_browser.gd | 2 +- scenes/game.gd | 10 +++------- scenes/level_select.gd | 2 +- scenes/node.gd | 2 +- scenes/notification.gd | 22 +++++++++++++++++++--- scenes/repository.gd | 2 +- scenes/terminal.gd | 2 +- translations.csv | 16 ++++++++++++++++ translations.en.translation | Bin 183 -> 297 bytes translations.ru.translation | Bin 183 -> 297 bytes 12 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 nano.150869.save diff --git a/nano.150869.save b/nano.150869.save new file mode 100644 index 00000000..7e9e1c77 --- /dev/null +++ b/nano.150869.save @@ -0,0 +1,35 @@ + +diff --git a/scenes/file_browser.tscn b/scenes/file_browser.tscn +index 4a82863..c81ac9d 100644 +--- a/scenes/file_browser.tscn ++++ b/scenes/file_browser.tscn +@@ -1,9 +1,15 @@ +-[gd_scene load_steps=4 format=2] ++[gd_scene load_steps=5 format=2] + + [ext_resource path="res://scenes/file_browser.gd" type="Script" id=1] + [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=2] + [ext_resource path="res://styles/theme.tres" type="Theme" id=3] + ++[sub_resource type="StyleBoxEmpty" id=1] ++content_margin_left = 10.0 ++content_margin_right = 145.0 ++content_margin_top = 10.0 ++content_margin_bottom = 10.0 ++ + [node name="FileBrowser" type="Control" groups=["editors"]] + anchor_right = 1.0 + anchor_bottom = 1.0 +@@ -86,11 +92,8 @@ __meta__ = { + visible = false + anchor_right = 1.0 + anchor_bottom = 1.0 +-margin_left = 50.0 ++custom_styles/normal = SubResource( 1 ) + wrap_enabled = true +-__meta__ = { +-"_edit_use_anchors_": false +-} + + [node name="SaveButton" type="Button" parent="Panel/TextEdit"] + anchor_left = 1.0 diff --git a/scenes/cards.gd b/scenes/cards.gd index 4448d6c1..83f01f29 100644 --- a/scenes/cards.gd +++ b/scenes/cards.gd @@ -55,7 +55,7 @@ func draw(ids): arrange_cards() if ids.size() > 0: - game.notify("These are your cards! Drag them to highlighted areas to play them!", self, "cards") + game.notify(tr("hint_cards"), self, "cards") func arrange_cards(): var t = Timer.new() diff --git a/scenes/file_browser.gd b/scenes/file_browser.gd index 1af3fa20..19068668 100644 --- a/scenes/file_browser.gd +++ b/scenes/file_browser.gd @@ -82,7 +82,7 @@ func update(): grid.add_child(item) if files.size() > 0: - game.notify("Click on these files to edit them!", self, "file-browser") + game.notify(tr("hint_file_browser"), self, "file-browser") if false: match mode: diff --git a/scenes/game.gd b/scenes/game.gd index b17f2c03..5f2b8fcd 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -232,7 +232,7 @@ func _load_translations(): print_debug("ЛОКАЛИЗАЦИЯ: Загружено %d ключей для языка '%s'" % [loaded_keys, locale]) func _set_initial_language(): - var system_language = OS.get_locale_language() # Возвращает "ru", "en", "de"... + var system_language = OS.get_locale_language() if system_language in available_languages: current_language = system_language @@ -244,16 +244,12 @@ func _set_initial_language(): func get_available_languages() -> Array: return available_languages -func _update_all_ui(): +func _update_title_ui(): get_tree().reload_current_scene() func change_language(new_language: String): - if not new_language in available_languages: - printerr("ЛОКАЛИЗАЦИЯ: Язык '%s' не поддерживается. Доступны: %s" % [new_language, str(available_languages)]) - return - current_language = new_language TranslationServer.set_locale(new_language) - _update_all_ui() + _update_title_ui() diff --git a/scenes/level_select.gd b/scenes/level_select.gd index ae3e42a6..207ecf11 100644 --- a/scenes/level_select.gd +++ b/scenes/level_select.gd @@ -57,7 +57,7 @@ func reload(): level_list.add_child(hb) if badge.active: - game.notify("You get a golden badge for each level you solve without using the playing cards! Can you solve them all using the command line?", badge, "cli-badge") + game.notify(tr("hint_cli_badge"), badge, "cli-badge") level_id += 1 chapter_id += 1 diff --git a/scenes/node.gd b/scenes/node.gd index f19e66a4..c4132a01 100644 --- a/scenes/node.gd +++ b/scenes/node.gd @@ -80,7 +80,7 @@ func type_set(new_type): $Sprite.texture = preload("res://nodes/tree.svg") "commit": $Sprite.texture = preload("res://nodes/commit.svg") - game.notify("You can drag these around with your mouse!", self, "drag-nodes") + game.notify(tr("hint_drag_nodes"), self, "drag-nodes") "tag": $Sprite.texture = preload("res://nodes/blob.svg") "ref": diff --git a/scenes/notification.gd b/scenes/notification.gd index 8825be25..86cb70c5 100644 --- a/scenes/notification.gd +++ b/scenes/notification.gd @@ -1,11 +1,27 @@ extends Node2D var text setget _set_text -var button_texts = ["Got it!", "Interesting!", "Very useful!", "Cool!", "Nice!", "Thanks!", "Whatever...", "Okay!", "Yay!", "Awesome!"] +var button_texts = [ + "notif_btn_got_it", + "notif_btn_interesting", + "notif_btn_very_useful", + "notif_btn_cool", + "notif_btn_nice", + "notif_btn_thanks", + "notif_btn_whatever", + "notif_btn_okay", + "notif_btn_yay", + "notif_btn_awesome" +] func _ready(): - button_texts.shuffle() - $Panel/CenterContainer/OK.text = button_texts[0] + var translated_button_texts = [] + for key in button_texts: + translated_button_texts.push_back(tr(key)) + + translated_button_texts.shuffle() + $Panel/CenterContainer/OK.text = translated_button_texts[0] + #func _gui_input(event): # if event is InputEventMouseButton: diff --git a/scenes/repository.gd b/scenes/repository.gd index 916bb03b..53bdbd2c 100644 --- a/scenes/repository.gd +++ b/scenes/repository.gd @@ -89,7 +89,7 @@ func set_label(new_label): $Rows/RepoVis/SeparatorLine/DropArea.queue_free() $Rows/RepoVis/SeparatorLine.hide() else: - game.notify("This is the time machine of another person! To interact with it, you need special commands!", self, "remote") + game.notify(tr("hint_remote"), self, "remote") label_node.text = new_label func random_position(): diff --git a/scenes/terminal.gd b/scenes/terminal.gd index 527635a7..5c2e0034 100644 --- a/scenes/terminal.gd +++ b/scenes/terminal.gd @@ -171,7 +171,7 @@ func command_done(cmd): add_ansi_command(output, cmd) if cmd.output.length() <= 1000: add_ansi_output(output, cmd) - game.notify("This is your terminal! All commands are executed here, and you can see their output. You can also type your own commands here!", self, "terminal") + game.notify(tr("hint_terminal"), self, "terminal") else: var pager = $Pager/Text pager.clear() diff --git a/translations.csv b/translations.csv index f03f91c6..6a8e0f00 100644 --- a/translations.csv +++ b/translations.csv @@ -1869,3 +1869,19 @@ setup_auto_228,The bike shed should be ???,Велосипедный сарай setup_auto_229,The bike shed should be green,Велосипедный сарай должен быть зеленым setup_auto_230,The bike shed should be blue,Велосипедный сарай должен быть синим compare_win_hint_073,"Pick the timeline that's clearer, and make the alarm go off!","Выберите более понятную ветку и включите будильник!" +hint_drag_nodes,"You can drag these around with your mouse!","Вы можете перетаскивать их мышкой!" +hint_remote,"This is the time machine of another person! To interact with it, you need special commands!","Это машина времени другого человека! Чтобы взаимодействовать с ней, нужны особые команды!" +hint_file_browser,"Click on these files to edit them!","Нажмите на эти файлы, чтобы их отредактировать!" +hint_cli_badge,"You get a golden badge for each level you solve without using the playing cards! Can you solve them all using the command line?","Вы получаете золотой значок за каждый уровень, решенный без игральных карт! Сможете ли вы пройти их все, используя только командную строку?" +hint_cards,"These are your cards! Drag them to highlighted areas to play them!","Это ваши карты! Перетаскивайте их на подсвеченные области, чтобы сыграть!" +hint_terminal,"This is your terminal! All commands are executed here, and you can see their output. You can also type your own commands here!","Это ваш терминал! Все команды выполняются здесь, и вы видите их вывод. Вы также можете вводить здесь свои собственные команды!" +notif_btn_got_it,"Got it!","Понятно!" +notif_btn_interesting,"Interesting!","Интересно!" +notif_btn_very_useful,"Very useful!","Очень полезно!" +notif_btn_cool,"Cool!","Круто!" +notif_btn_nice,"Nice!","Отлично!" +notif_btn_thanks,"Thanks!","Спасибо!" +notif_btn_whatever,"Whatever...","Как скажешь..." +notif_btn_okay,"Okay!","Окей!" +notif_btn_yay,"Yay!","Ура!" +notif_btn_awesome,"Awesome!","Потрясающе!" diff --git a/translations.en.translation b/translations.en.translation index c50e65f18f9ae5e4d87b1a3d3ad9ed175a14e962..fd5a7e19db113a20808b34bc6868582971bef570 100644 GIT binary patch literal 297 zcmbu5I}gGz41|r4c!R{ozo=MQSr}1ZkKD*=tELHx)Bn%4bYNlPq)(17I_F^?=1P<1 zs0%REBe>sK>u2Jio^uletpBt^`~;F{?2{AgqhoJ#wCW@X9lrMhcS378ov3mpN=r0j zLTHO+joaDGr5D0000ewJ-f(Jpio)0P;v19ZW diff --git a/translations.ru.translation b/translations.ru.translation index 9f9598af3f63f06bab6876991cbe51ac519a7374..fd5a7e19db113a20808b34bc6868582971bef570 100644 GIT binary patch literal 297 zcmbu5I}gGz41|r4c!R{ozo=MQSr}1ZkKD*=tELHx)Bn%4bYNlPq)(17I_F^?=1P<1 zs0%REBe>sK>u2Jio^uletpBt^`~;F{?2{AgqhoJ#wCW@X9lrMhcS378ov3mpN=r0j zLTHO+joaDGr5D0000ewJ-f(Jpio)0P;v19Z Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 13/15] Fix bug with text in ru going beyond the container --- scenes/game.gd | 3 ++- scenes/notification.gd | 2 +- scenes/notification.tscn | 53 ++++++++++++++++++++-------------------- 3 files changed, 30 insertions(+), 28 deletions(-) diff --git a/scenes/game.gd b/scenes/game.gd index 5f2b8fcd..c63f7255 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -124,7 +124,8 @@ func notify(text, target=null, hint_slug=null): return var notification = preload("res://scenes/notification.tscn").instance() - notification.text = text + notification.get_node("Notification/Panel/Label").text = text + if not target: target = get_tree().root target.call_deferred("add_child", notification) diff --git a/scenes/notification.gd b/scenes/notification.gd index 86cb70c5..4900a482 100644 --- a/scenes/notification.gd +++ b/scenes/notification.gd @@ -1,4 +1,4 @@ -extends Node2D +extends PanelContainer var text setget _set_text var button_texts = [ diff --git a/scenes/notification.tscn b/scenes/notification.tscn index 2278e0d6..f6a68d98 100644 --- a/scenes/notification.tscn +++ b/scenes/notification.tscn @@ -5,59 +5,60 @@ [ext_resource path="res://scenes/notification.gd" type="Script" id=3] [sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 16.0 +content_margin_right = 16.0 +content_margin_top = 13.0 +content_margin_bottom = 13.0 bg_color = Color( 0.0431373, 0.368627, 0.141176, 0.843137 ) corner_radius_top_left = 8 corner_radius_top_right = 8 corner_radius_bottom_right = 8 corner_radius_bottom_left = 8 -[node name="Notification" type="Node2D"] +[node name="Node2D" type="Node2D"] z_index = 4096 -script = ExtResource( 3 ) -[node name="Panel" type="Panel" parent="."] +[node name="Notification" type="PanelContainer" parent="."] margin_left = 8.0 margin_top = 8.0 margin_right = 492.0 margin_bottom = 170.0 -theme = ExtResource( 2 ) custom_styles/panel = SubResource( 1 ) -__meta__ = { -"_edit_use_anchors_": false -} +script = ExtResource( 3 ) -[node name="Label" type="Label" parent="Panel"] -anchor_right = 1.0 -anchor_bottom = 1.0 +[node name="Panel" type="VBoxContainer" parent="Notification"] margin_left = 16.0 margin_top = 13.0 -margin_right = -15.0 -margin_bottom = -15.0 +margin_right = 468.0 +margin_bottom = 149.0 +theme = ExtResource( 2 ) +custom_constants/separation = 10 + +[node name="Label" type="Label" parent="Notification/Panel"] +margin_right = 452.0 +margin_bottom = 87.0 +size_flags_vertical = 7 custom_fonts/font = ExtResource( 1 ) text = "notification_label_031" autowrap = true -__meta__ = { -"_edit_use_anchors_": false -} -[node name="CenterContainer" type="CenterContainer" parent="Panel"] -anchor_top = 1.0 -anchor_right = 1.0 -anchor_bottom = 1.0 -margin_top = -58.0 +[node name="CenterContainer" type="CenterContainer" parent="Notification/Panel"] +margin_top = 97.0 +margin_right = 452.0 +margin_bottom = 136.0 __meta__ = { "_edit_use_anchors_": false } -[node name="OK" type="Button" parent="Panel/CenterContainer"] -margin_left = 202.0 -margin_top = 9.0 -margin_right = 282.0 -margin_bottom = 48.0 +[node name="OK" type="Button" parent="Notification/Panel/CenterContainer"] +margin_left = 106.0 +margin_right = 345.0 +margin_bottom = 39.0 focus_mode = 0 enabled_focus_mode = 0 text = "notification_ok_032" __meta__ = { "_edit_use_anchors_": false } -[connection signal="pressed" from="Panel/CenterContainer/OK" to="." method="confirm"] + +[connection signal="pressed" from="Notification/Panel/CenterContainer/OK" to="Notification" method="confirm"] From c6c93cd343d3972a55b4c02efca0e73d0b4e9d5a Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 14/15] Fix Step By Step scene bug, when it runs complete in ru --- .~lock.translations.csv# | 1 - levels/index/compare | 2 +- nano.150869.save | 35 ----------------------------------- scenes/game.gd | 34 +++------------------------------- scenes/level.gd | 15 ++------------- scenes/optionbutton.gd | 3 --- scenes/title.gd | 6 +++--- scenes/title.tscn | 9 ++++++++- styles/option_button.tres | 11 +++++++++++ translations.csv | 5 +++++ 10 files changed, 33 insertions(+), 88 deletions(-) delete mode 100644 .~lock.translations.csv# delete mode 100644 nano.150869.save create mode 100644 styles/option_button.tres diff --git a/.~lock.translations.csv# b/.~lock.translations.csv# deleted file mode 100644 index 1b6d67cd..00000000 --- a/.~lock.translations.csv# +++ /dev/null @@ -1 +0,0 @@ -,fedor,i5-10210u-a87748,14.11.2025 19:57,file:///home/fedor/.config/libreoffice/4; \ No newline at end of file diff --git a/levels/index/compare b/levels/index/compare index a08291c2..2d50fc30 100644 --- a/levels/index/compare +++ b/levels/index/compare @@ -46,4 +46,4 @@ git checkout HEAD~3 [win] # compare_win_hint_073 -git show step-by-step:smoke_detector | tail -n 1 | grep -v "absolutely silent" +git show step-by-step:smoke_detector | tail -n 1 | grep -v "@@setup_auto_028@@" diff --git a/nano.150869.save b/nano.150869.save deleted file mode 100644 index 7e9e1c77..00000000 --- a/nano.150869.save +++ /dev/null @@ -1,35 +0,0 @@ - -diff --git a/scenes/file_browser.tscn b/scenes/file_browser.tscn -index 4a82863..c81ac9d 100644 ---- a/scenes/file_browser.tscn -+++ b/scenes/file_browser.tscn -@@ -1,9 +1,15 @@ --[gd_scene load_steps=4 format=2] -+[gd_scene load_steps=5 format=2] - - [ext_resource path="res://scenes/file_browser.gd" type="Script" id=1] - [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=2] - [ext_resource path="res://styles/theme.tres" type="Theme" id=3] - -+[sub_resource type="StyleBoxEmpty" id=1] -+content_margin_left = 10.0 -+content_margin_right = 145.0 -+content_margin_top = 10.0 -+content_margin_bottom = 10.0 -+ - [node name="FileBrowser" type="Control" groups=["editors"]] - anchor_right = 1.0 - anchor_bottom = 1.0 -@@ -86,11 +92,8 @@ __meta__ = { - visible = false - anchor_right = 1.0 - anchor_bottom = 1.0 --margin_left = 50.0 -+custom_styles/normal = SubResource( 1 ) - wrap_enabled = true --__meta__ = { --"_edit_use_anchors_": false --} - - [node name="SaveButton" type="Button" parent="Panel/TextEdit"] - anchor_left = 1.0 diff --git a/scenes/game.gd b/scenes/game.gd index c63f7255..acfc1971 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -170,52 +170,27 @@ func new_shell(): func _load_translations(): var file = File.new() var path = "res://translations.csv" - - if not file.file_exists(path): - printerr("ЛОКАЛИЗАЦИЯ (ОШИБКА): Файл %s не найден." % path) - return - + file.open(path, File.READ) - # ★ Читаем заголовок, чтобы узнать, какие языки есть в CSV var header = file.get_csv_line() - # header = ["key", "en", "ru", "de", ...] - - if header.size() < 2: - printerr("ЛОКАЛИЗАЦИЯ (ОШИБКА): Некорректный формат CSV.") - file.close() - return - - # ★★ Создаем словарь: язык → объект Translation var translations_map = {} - # Пропускаем первую колонку (это "key"), остальные — языки for i in range(1, header.size()): - var locale = header[i].strip_edges() # "en", "ru", "de"... - - if locale == "": - continue + var locale = header[i].strip_edges() available_languages.append(locale) - # Создаем Translation для каждого языка var translation = Translation.new() translation.set_locale(locale) translations_map[locale] = translation - print_debug("ЛОКАЛИЗАЦИЯ: Найдены языки: %s" % str(available_languages)) - - # ★★★ Читаем все строки и заполняем переводы для ВСЕХ языков var loaded_keys = 0 + while not file.eof_reached(): var line = file.get_csv_line() - - if line == null or line.size() < 2 or line[0].strip_edges() == "": - continue - var key = line[0].strip_edges() - # Для каждого языка добавляем перевод for i in range(1, min(line.size(), header.size())): var locale = header[i].strip_edges() var translated_text = line[i] @@ -227,10 +202,8 @@ func _load_translations(): file.close() - # ★★★★ Регистрируем ВСЕ переводы в TranslationServer for locale in translations_map.keys(): TranslationServer.add_translation(translations_map[locale]) - print_debug("ЛОКАЛИЗАЦИЯ: Загружено %d ключей для языка '%s'" % [loaded_keys, locale]) func _set_initial_language(): var system_language = OS.get_locale_language() @@ -251,6 +224,5 @@ func _update_title_ui(): func change_language(new_language: String): current_language = new_language TranslationServer.set_locale(new_language) - _update_title_ui() diff --git a/scenes/level.gd b/scenes/level.gd index 8ea2f3b3..9083c965 100644 --- a/scenes/level.gd +++ b/scenes/level.gd @@ -19,31 +19,22 @@ func load(path): if dir.file_exists(path): var config = helpers.parse(path) - # --- Перевод однострочных ключей --- title = tr(config.get("title", "default_title_key")) var description_text = tr(config.get("description", "default_description_key")) congrats = tr(config.get("congrats", "default_congrats_key")) - # --- ПРАВИЛЬНАЯ ОБРАБОТКА МНОГОСТРОЧНОГО [CLI] --- - var cli_hints_keys_block = config.get("cli", "") # Получаем блок с ключами - var translated_cli_lines = [] # Массив для переведенных строк + var cli_hints_keys_block = config.get("cli", "") + var translated_cli_lines = [] if cli_hints_keys_block != "": - # Разбиваем блок на отдельные ключи по символу переноса строки for key in cli_hints_keys_block.split("\n"): var stripped_key = key.strip_edges(true, true) if stripped_key != "": - # Переводим каждый ключ индивидуально translated_cli_lines.push_back(tr(stripped_key)) else: - # Сохраняем пустые строки для форматирования translated_cli_lines.push_back("") - # Собираем переведенные строки обратно в единый текст var cli_hints_text = PoolStringArray(translated_cli_lines).join("\n") - # --------------------------------------------------------- - - # --- Дальше идет блок форматирования, он остается без изменений --- var monospace_regex = RegEx.new() monospace_regex.compile("\\n ([^\\n]*)") var monospace_inline_regex = RegEx.new() @@ -98,14 +89,12 @@ func load(path): else: repo = "yours" - # Наш "защитный" код от ошибки, которую мы исправили ранее if not repos.has(repo): repos[repo] = LevelRepo.new() var desc = tr(config.get("win_desc", "default_win_desc_key")) for line in Array(config[k].split("\n")): if line.length() > 0 and line[0] == "#": - # --- ДОПОЛНИТЕЛЬНОЕ ИЗМЕНЕНИЕ: ПЕРЕВОДИМ ПОДСКАЗКИ В [WIN] --- var hint_key = line.substr(1).strip_edges(true, true) desc = tr(hint_key) else: diff --git a/scenes/optionbutton.gd b/scenes/optionbutton.gd index 9db89730..141f99f2 100644 --- a/scenes/optionbutton.gd +++ b/scenes/optionbutton.gd @@ -2,7 +2,6 @@ extends OptionButton func _ready(): - # Заполняем список языков var languages = game.get_available_languages() for i in range(languages.size()): @@ -10,7 +9,6 @@ func _ready(): add_item(_get_language_name(locale), i) set_item_metadata(i, locale) - # Выбираем текущий язык _select_current_language() connect("item_selected", self, "_on_language_selected") @@ -28,7 +26,6 @@ func _on_language_selected(index: int): game.change_language(selected_language) func _get_language_name(locale: String) -> String: - # Человекочитаемые названия языков var names = { "en": "English", "ru": "Русский", diff --git a/scenes/title.gd b/scenes/title.gd index a4c930cd..138185c6 100644 --- a/scenes/title.gd +++ b/scenes/title.gd @@ -8,9 +8,9 @@ func _ready(): $Label2.text = tr("title_label2_007") $Label3.text = tr("title_label3_008") - $VBoxContainer/Button.text = tr("title_button_009") # Кнопка Levels - $VBoxContainer/Button3.text = tr("title_button3_010") # Кнопка Sandbox - $VBoxContainer/Button2.text = tr("title_button2_011") # Кнопка Quit + $VBoxContainer/Button.text = tr("title_button_009") + $VBoxContainer/Button3.text = tr("title_button3_010") + $VBoxContainer/Button2.text = tr("title_button2_011") func quit(): diff --git a/scenes/title.tscn b/scenes/title.tscn index cb9aa8af..f499669e 100644 --- a/scenes/title.tscn +++ b/scenes/title.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=7 format=2] [ext_resource path="res://styles/theme.tres" type="Theme" id=1] [ext_resource path="res://images/oh-my-git.png" type="Texture" id=2] [ext_resource path="res://scenes/title.gd" type="Script" id=3] [ext_resource path="res://scenes/optionbutton.gd" type="Script" id=4] [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=5] +[ext_resource path="res://styles/option_button.tres" type="StyleBox" id=6] [node name="Title" type="Control"] anchor_right = 1.0 @@ -56,6 +57,12 @@ text = "title_button3_010" margin_top = 88.0 margin_right = 351.0 margin_bottom = 127.0 +custom_constants/hseparation = 0 +custom_styles/hover = ExtResource( 6 ) +custom_styles/pressed = ExtResource( 6 ) +custom_styles/focus = ExtResource( 6 ) +custom_styles/disabled = ExtResource( 6 ) +custom_styles/normal = ExtResource( 6 ) align = 1 script = ExtResource( 4 ) diff --git a/styles/option_button.tres b/styles/option_button.tres new file mode 100644 index 00000000..0ccc1cc9 --- /dev/null +++ b/styles/option_button.tres @@ -0,0 +1,11 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 11.0 +content_margin_top = 5.0 +content_margin_bottom = 5.0 +bg_color = Color( 0.227451, 0.227451, 0.227451, 1 ) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 diff --git a/translations.csv b/translations.csv index 6a8e0f00..386ae9c3 100644 --- a/translations.csv +++ b/translations.csv @@ -1885,3 +1885,8 @@ notif_btn_whatever,"Whatever...","Как скажешь..." notif_btn_okay,"Okay!","Окей!" notif_btn_yay,"Yay!","Ура!" notif_btn_awesome,"Awesome!","Потрясающе!" +default_congrats_key,"Good job, you solved the level! + +Feel free to try a few more things or click 'Next level'.","Отличная работа, уровень пройден! + +Можешь ещё поэкспериментировать или нажми 'Следующий уровень'." From 7a55b6b14c1f3073742587d4368fa225e33ec14d Mon Sep 17 00:00:00 2001 From: phobos Date: Thu, 27 Nov 2025 12:06:49 +0300 Subject: [PATCH 15/15] Fix bug with not localized grep Add Brazilian with . instead of words --- levels/branches/fork | 2 +- levels/intro/commit | 4 +- levels/shit-happens/bad-commit | 4 +- scenes/optionbutton.gd | 6 +- scenes/terminal.tscn | 18 +- scenes/text_editor.tscn | 6 +- translations..translation | Bin 2194 -> 394 bytes translations.br.translation | Bin 0 -> 7088 bytes translations.csv | 1269 ++++++++++++++++---------------- translations.csv.import | 4 +- translations.en.translation | Bin 297 -> 14265 bytes translations.ru.translation | Bin 297 -> 32744 bytes 12 files changed, 647 insertions(+), 666 deletions(-) create mode 100644 translations.br.translation diff --git a/levels/branches/fork b/levels/branches/fork index 23fde3c1..f7c1b6c5 100644 --- a/levels/branches/fork +++ b/levels/branches/fork @@ -51,7 +51,7 @@ git branch -d main git ls-tree --name-only -r HEAD | grep child # fork_win_hint_107 -git show HEAD:cage/lion | grep -v "very hungry" +git show HEAD:cage/lion | grep -v "@@setup_win_112@@" [congrats] diff --git a/levels/intro/commit b/levels/intro/commit index 25b244ad..0851c8f1 100644 --- a/levels/intro/commit +++ b/levels/intro/commit @@ -21,10 +21,10 @@ echo "@@setup_auto_018@@" > glass git rev-parse HEAD # commit_win_hint_138 -! test "$(cat glass)" = "The glass is full of water." +! test "$(cat glass)" = "@@setup_auto_018@@" # commit_win_hint_139 -git rev-parse HEAD^ && ! test "$(git show main:glass)" = "The glass is full of water." +git rev-parse HEAD^ && ! test "$(git show main:glass)" = "@@setup_auto_018@@" [congrats] diff --git a/levels/shit-happens/bad-commit b/levels/shit-happens/bad-commit index fea29c7b..914ed492 100644 --- a/levels/shit-happens/bad-commit +++ b/levels/shit-happens/bad-commit @@ -7,10 +7,10 @@ badcommit_description_219 [setup] -echo "@@setup_auto_209@@" > numbers +echo "1 2 3 4" > numbers git add . git commit -m "Initial commit" -echo "@@setup_auto_210@@" > numbers +echo "1 2 3 4 5 6 7 8 9 11" > numbers git commit -am "More numberrrrrs" [win] diff --git a/scenes/optionbutton.gd b/scenes/optionbutton.gd index 141f99f2..3b4df4b6 100644 --- a/scenes/optionbutton.gd +++ b/scenes/optionbutton.gd @@ -26,9 +26,5 @@ func _on_language_selected(index: int): game.change_language(selected_language) func _get_language_name(locale: String) -> String: - var names = { - "en": "English", - "ru": "Русский", - } - return names.get(locale, locale.to_upper()) + return tr(locale) diff --git a/scenes/terminal.tscn b/scenes/terminal.tscn index 2605816d..38fc96e1 100644 --- a/scenes/terminal.tscn +++ b/scenes/terminal.tscn @@ -34,16 +34,10 @@ anchor_right = 1.0 anchor_bottom = 1.0 mouse_filter = 1 script = ExtResource( 4 ) -__meta__ = { -"_edit_use_anchors_": false -} [node name="Rows" type="VBoxContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -__meta__ = { -"_edit_use_anchors_": false -} [node name="TopHalf" type="Control" parent="Rows"] margin_right = 1920.0 @@ -56,12 +50,9 @@ anchor_bottom = 1.0 margin_top = -1.92206 margin_bottom = -1.92212 size_flags_vertical = 3 -custom_styles/normal = SubResource( 1 ) custom_fonts/normal_font = ExtResource( 3 ) +custom_styles/normal = SubResource( 1 ) scroll_following = true -__meta__ = { -"_edit_use_anchors_": false -} [node name="Completions" type="Tree" parent="Rows/TopHalf"] anchor_top = 1.0 @@ -83,21 +74,21 @@ margin_bottom = 1052.0 [node name="Button" type="Button" parent="Rows/VBoxContainer"] margin_right = 1920.0 margin_bottom = 20.0 -text = "terminal_button_021" +text = "git commit --allow-empty -m \"$RANDOM\"" script = SubResource( 2 ) [node name="Button2" type="Button" parent="Rows/VBoxContainer"] margin_top = 24.0 margin_right = 1920.0 margin_bottom = 44.0 -text = "terminal_button2_022" +text = "git checkout HEAD^" script = SubResource( 2 ) [node name="Button3" type="Button" parent="Rows/VBoxContainer"] margin_top = 48.0 margin_right = 1920.0 margin_bottom = 68.0 -text = "terminal_button3_023" +text = "git checkout -b \"$RANDOM\"" script = SubResource( 2 ) [node name="InputLine" type="HBoxContainer" parent="Rows"] @@ -147,6 +138,7 @@ volume_db = -10.0 [node name="OkSound" type="AudioStreamPlayer" parent="."] stream = ExtResource( 2 ) volume_db = -5.0 + [connection signal="item_selected" from="Rows/TopHalf/Completions" to="." method="_completion_selected"] [connection signal="pressed" from="Rows/VBoxContainer/Button" to="Rows/VBoxContainer/Button" method="pressed"] [connection signal="pressed" from="Rows/VBoxContainer/Button2" to="Rows/VBoxContainer/Button2" method="pressed"] diff --git a/scenes/text_editor.tscn b/scenes/text_editor.tscn index 28c11ecf..2083d24b 100644 --- a/scenes/text_editor.tscn +++ b/scenes/text_editor.tscn @@ -3,9 +3,7 @@ [ext_resource path="res://fonts/default.tres" type="DynamicFont" id=1] [ext_resource path="res://scenes/text_editor.gd" type="Script" id=2] -[node name="TextEditor" type="TextEdit" groups=[ -"editors", -]] +[node name="TextEditor" type="TextEdit" groups=["editors"]] anchor_right = 1.0 anchor_bottom = 1.0 custom_colors/background_color = Color( 0, 0, 0, 1 ) @@ -26,6 +24,7 @@ margin_left = -114.396 margin_top = -59.399 margin_right = -14.3955 margin_bottom = -14.399 +grow_horizontal = 0 focus_mode = 0 custom_fonts/font = ExtResource( 1 ) enabled_focus_mode = 0 @@ -48,5 +47,6 @@ text = "x" __meta__ = { "_edit_use_anchors_": false } + [connection signal="pressed" from="SaveButton" to="." method="save"] [connection signal="pressed" from="CloseButton" to="." method="close"] diff --git a/translations..translation b/translations..translation index 4b3bdd9a4270dfac2d4d36aa1d5700922c3ad111..00b1e4bae449e7e188aa0812ff77c052fef05e7b 100644 GIT binary patch delta 88 xcmbOv*u}iTiZOtd0RsM`0g$)?5VHX>BNT7Z%xVEL;e3#sJd_U-4+;))1^^(86}tcc literal 2194 zcmbuBdq@;f6vjv0%FL|nVVT)jX<6!)1%*UKQ7IvaNfZS#yG*&Z?#9lVy)n%mYH3nQ zFR;=m$dXFgS|360Aeu1LWw;cFW>?%crvuRcwLmBz4RWcPGuLHRGwn{RV$XCtGc~K~P^A#Q z&!Oa~(m)_Ns-`LHR81NHiLXMH20@qwv&(cV7P~49hSZX4U9Y+sz%yxXm(8*6SD9vY z**3TVN|GNa2;@6blG!{%3PuD?c+Dp0z#GyJxSm%&th}S*JV*0Ki6)n#Wh6Z$X{RkzVv{A=gjJUJdNYHfUzd=L3Df=#}n@r z9K)B6j`#e~)|;VRPIa#1y-DR9uejLvW-^zXZp3yB<#MWfRsAIc*Bu@I$+e#!=sc9q-%l-KU(q)3_TFE#Sl6 zeqL29;AZ)>CtSd5%l(34I8N8`GVqz-IF374RtApY^6I0jb8)Ms`H&Y+dUy}_FUraD z1FVnAI8M*Umc1pmgyU~tw5_5(tfjan(YtsoH|`ybqq)*K&aQ6_ES>?+~S|~6h8?xjy$EN$3C9pG{2IO#vBvJ!)VWB9210ed)pH8y+KC@!aYq(1Zu7$V?zO1u5(!-ZpUufgj* z2>Pcc>(}*W{fd57uak|PdW-Hc3iNtezbr#sXXNX3x)=WHb+1vXHyI^H5%dAB*Be1i XguJ>35|2@46eT1i{5gYk_%-qqcR|}s diff --git a/translations.br.translation b/translations.br.translation new file mode 100644 index 0000000000000000000000000000000000000000..ee039f4888bdb3d02025f84c37379f878006654d GIT binary patch literal 7088 zcmeHMYgAQb8a`YkKqW~+LKnB86o!isiczMJ80z2106lU@nGj1QW-N)uuLmr zOoWh|*a(Wt@j@srG?9x=Do`^bsazBUOf*!MT-13s?br3Lv-ZDfe&lkm^{n^%p8dSn z{q3V$Ll=a;B@-_rSQ9|7mOx05T&oPz$kkevTo)6s2KB#Prf|0bGzx8ef+kuKsfv%5 zt0Hyrk=kg5S|PLG_tf&03Yi(0l?ts^zCxjuJ%`P(he9?IOC_p{)XAe%3fX9EqY|Ry z6grU*GHG?181;(Z+_ce}m{mHEGMNEj4h%=~^YrwRjS?tal06&ahA@y3qK(qX1j+&U z9uTg_xP*vS;@S>&65s*&0Dgd=5w4k7&t-do3&B1dSSs?%VO8QR>kjY2rRhw1uJ-V)3gOd>K#y)QXz(us?}w(l%k=qQ`Y$ ze@Bn&6Zb=+H8lLKep6Tracu)@C$1^JGxi>Uj~*}F_tWEMVLu;O2E?*^I;<0cBw!P; z6-Wnm069P*Pz)RfjsYiuYTyT;0iar1u(4KU=Hruo;V!B$(QG@T{roPUqAlBTP`B&IwJa`vBR{A=fS(@<( z#(O#xl)0iH(h0Q*c++=;^J)B`=<_qcAC=I5=6tTUlf|VtO&kBFGeX}Khx*FaJhD); zzS5i$YvdC7M%L{-=g9h^xW;p?<}YA#Ab#$Pn$jgS2HO%h3U_hU#&gL=7L+p=RubG z*7U8c|2ew{R99F(FFU_;;1kyO7he7ch4-4~MfF*>-CFZKo zNcT45pVU=+qOhCwUw_i0=m4vW{FRx zA?v>{spycSM7}+dy=kG$pYokuf1^<@QFlaDr}+f-yq?S{bl>U`Oh5Dw%kAe`AEfJZ zG4Uy5d|~F2gdNO}@*j4IO(|#f6aV2wr0x{pR9rOsCfLr~9zFNEa2jX!-@#UulI` zLp#eyeGLuVEp1@&sJ@)mZO>g|adYBQo7`BR-4C|4?nN^F^K}z^9^z5lBf5_r> zLiZWdQ9bR@t(K^>CB?mO9h(Q~Tfu)I!OQ0O|7DzqjeNDxPk1o;=iPR0 zWr*;1YJGn8eM8-N@Xy0X0G7i@zPQELh0TTdB~^>x@Rf)!H<>M)DG@(AHTKop68Z^W z<&7$kh;JWTd*Tf?KgwJ3(RO#?`-AGI{o7`$EE#O6f&Ms0eO zn$4B?iAnBv16W+*zpK32b%>n<;#&)Q!Y;EokPOc;EBC&)@WDxS7e3CJdWQLrc2lmM z%jQ6S!RHK&PO>?qCH`lflI>3g=T?npd#dB$mafK^SbU1tcC_#9Vx~U?oio#wuXpba zX8qE9C--I9O=R;-*6hy|zH6u-(s`cvbzU;-qbtSc%1#!a>T`R3cJCC4=a4b^@0DYj z{}X+Je?*1^e>$;pd^(FybyykSnBmRpOGDgwEFbB1dzS|;WO19$#%ZQAKg!>c9ue_~ z&5h<6JWy);fa#lGH=R5PCz{KlKCAW%EHA~Y4ze&XWqGNdZ_j);wu1Ge`DVy3m*pj0 zNt%IqIeSh{p391(+4&+}zKw6yBF3-#XHtJ4i%+`r{g1A#XL-ilH5(MZC#et8jkP{w zw423q!}p*ytApm^4qnCj9!znov0(AWb(-CCV}2CBx4y<=44a=icTD6+mXGGQ<^!V& z;ol6XKH}GcZ8Muo9g=7*fZ!l(>bBPyKG*R|4-nl zCczSKpYZ3x685~|DzgXfAXiwZ|NI4i@ed1}^+#R?s#mCDw94PNg}S`@jrGa($#uu- t%Ic2(zOkQX8vFAWhnly?!Ru0nbQCO literal 0 HcmV?d00001 diff --git a/translations.csv b/translations.csv index 386ae9c3..984f6265 100644 --- a/translations.csv +++ b/translations.csv @@ -1,54 +1,48 @@ -keys,en,ru -card_description_001,Description,Описание,, -card_energy_002,0,0,, -music_button_button3_003,Toggle music,Вкл/Выкл музыку -arrow_id_004,label,метка,, -cards_button_005,Draw new cards,Взять новые карты,, -cards_energy_006,3,3,, -title_label2_007,by bleeptrack & blinry,от bleeptrack & blinry,, -title_label3_008,Original score by winniehell,Оригинальная музыка от winniehell,, -title_button_009,Levels,Уровни,, -title_button3_010,Sandbox,Песочница,, -title_button2_011,Quit,Выход,, -survey_label_012,Oh My Git!,Oh My Git!,, -survey_button_013,Support us! (Open two browser tabs),Поддержите нас! (Откроются две вкладки браузера),, -main_levelname_014,Level name here!,Название уровня здесь!,, -main_leveldescription_015,Level description here!,Описание уровня здесь!,, -main_backbutton_016,Back,Назад,, -main_reloadbutton2_017,Reload,Перезагрузить,, -main_cardsbutton_018,Cards!,Карты!,, -main_tip_019,Tip!,Подсказка!,, -main_nextlevelbutton_020,Next level,Следующий уровень,, -terminal_button_021,"git commit --allow-empty -m "" -RANDOM""","gitcommit−−allow−empty−m"" -RANDOM""","gitcommit−−allow−empty−m"" -RANDOM""", -terminal_button2_022,git checkout HEAD^,git checkout HEAD^,, -terminal_button3_023,"git checkout -b "" -RANDOM""","gitcheckout−b"" -RANDOM""","gitcheckout−b"" -RANDOM""", -repository_label_024,Repo name,Имя репозитория,, -repository_indexlabel_025,Index:,Индекс:,, -repository_button_026,Update,Обновить,, -repository_simplifycheckbox_027,Hide trees and blobs,Скрыть деревья и блобы,, -node_id_028,object_id,id_объекта,, -level_select_button3_029,To the survey /o/,К опросу /o/,, -no_git_button2_030,"Sure, I'll install it!","Конечно, я установлю!",, -notification_label_031,This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint!,Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка!,, -notification_ok_032,Got it!,Понятно!,, -file_browser_title_033,title,заголовок,, -file_browser_button_034,root,корень,, -file_browser_button2_035,dir,папка,, -file_browser_savebutton_036,Save,Сохранить,, -text_editor_texteditor_038,Text here,Текст здесь,, -file_browser_item_label_039,filename,имя_файла,, -merge_title_040,Merging timelines,Слияние временных линий,, -merge_description_041,"Here's a trick so that you can sleep a bit longer: just do all your morning activities in parallel universes, and then at the end, merge them together!","Вот трюк, который позволит вам поспать немного дольше: просто выполняйте все свои утренние дела в параллельных вселенных, а в конце слейте их воедино!",, -merge_congrats_042,I wonder if you're more relaxed when you sleep in parallel timelines...,Интересно, вы более расслаблены, когда спите в параллельных временных линиях... -merge_win_hint_043,"Build a situation where you consumed a baguette, a coffee, and a donut.","Создайте ситуацию, в которой вы съели багет, выпили кофе и съели пончик.",, -merge_win_hint_044,Be on a merge commit.,Находитесь на коммите слияния.,, -conflict_title_045,Contradictions,Противоречия,, +keys,en,ru,br +br,Brazil,Brazil,Brazil +ru,Русский,Русский,Русский +en,English,English,English +card_description_001,Description,Описание,TRANSLATED +card_energy_002,0,0,TRANSLATED +music_button_button3_003,Toggle music,Вкл/выкл музыку,TRANSLATED +arrow_id_004,label,метка,TRANSLATED +cards_button_005,Draw new cards,Взять новые карты,TRANSLATED +cards_energy_006,3,3,TRANSLATED +title_label2_007,by bleeptrack & blinry,от bleeptrack & blinry,TRANSLATED +title_label3_008,Original score by winniehell,Оригинальная музыка от winniehell,TRANSLATED +title_button_009,Levels,Уровни,TRANSLATED +title_button3_010,Sandbox,Песочница,TRANSLATED +title_button2_011,Quit,Выход,TRANSLATED +survey_label_012,Oh My Git!,Oh My Git!,TRANSLATED +survey_button_013,Support us! (Open two browser tabs),Поддержите нас! (Откроются две вкладки браузера),TRANSLATED +main_levelname_014,Level name here!,Название уровня здесь!,TRANSLATED +main_leveldescription_015,Level description here!,Описание уровня здесь!,TRANSLATED +main_backbutton_016,Back,Назад,TRANSLATED +main_reloadbutton2_017,Reload,Перезагрузить,TRANSLATED +main_cardsbutton_018,Cards!,Карты!,TRANSLATED +main_tip_019,Tip!,Подсказка!,TRANSLATED +main_nextlevelbutton_020,Next level,Следующий уровень,TRANSLATED +repository_label_024,Repo name,Имя репозитория,TRANSLATED +repository_indexlabel_025,Index:,Индекс:,TRANSLATED +repository_button_026,Update,Обновить,TRANSLATED +repository_simplifycheckbox_027,Hide trees and blobs,Скрыть деревья и блобы,TRANSLATED +node_id_028,object_id,id_объекта,TRANSLATED +level_select_button3_029,To the survey /o/,К опросу /o/,TRANSLATED +no_git_button2_030,"Sure, I'll install it!","Конечно, я установлю!",TRANSLATED +notification_label_031,This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint! This is a hint!,Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка! Это подсказка!,TRANSLATED +notification_ok_032,Got it!,Понятно!,TRANSLATED +file_browser_title_033,title,заголовок,TRANSLATED +file_browser_button_034,root,корень,TRANSLATED +file_browser_button2_035,dir,папка,TRANSLATED +file_browser_savebutton_036,Save,Сохранить,TRANSLATED +text_editor_texteditor_038,Text here,Текст здесь,TRANSLATED +file_browser_item_label_039,filename,имя_файла,TRANSLATED +merge_title_040,Merging timelines,Слияние временных линий,TRANSLATED +merge_description_041,"Here's a trick so that you can sleep a bit longer: just do all your morning activities in parallel universes, and then at the end, merge them together!","Вот трюк, который позволит вам поспать немного дольше: просто выполняйте все свои утренние дела в параллельных вселенных, а в конце слейте их воедино!",TRANSLATED +merge_congrats_042,I wonder if you're more relaxed when you sleep in parallel timelines...,"Интересно, вы более расслаблены, когда спите в параллельных временных линиях...",TRANSLATED +merge_win_hint_043,"Build a situation where you consumed a baguette, a coffee, and a donut.","Создайте ситуацию, в которой вы съели багет, выпили кофе и съели пончик.",TRANSLATED +merge_win_hint_044,Be on a merge commit.,Находитесь на коммите слияния.,TRANSLATED +conflict_title_045,Contradictions,Противоречия,TRANSLATED conflict_description_046,"Sometimes, timelines will contradict each other. For example, in this case, one of our clients wants these timelines merged, but they ate different things for breakfast in both timelines. @@ -62,10 +56,10 @@ Let your finalized timeline be the ""main"" one.","Иногда временны Попробуйте слить их! Вы заметите, что возникнет конфликт! Машина времени оставит решение за вами: вы можете отредактировать проблемный элемент, она покажет вам конфликтующие разделы. Вы можете сохранить любую из двух версий или создать их комбинацию! Удалите маркеры >>>, <<< и === и сделайте новый коммит для завершения слияния! Пусть ваша окончательная временная линия будет ""main"". -",, -conflict_congrats_047,"Yum, that sounds like a good breakfast!","Мм, звучит как хороший завтрак!",, -conflict_win_hint_048,Make a breakfast compromise in the 'main' branch.,Найдите компромисс по завтраку в ветке 'main'.,, -mergeabort_title_049,Abort a merge,Прервать слияние,, +",TRANSLATED +conflict_congrats_047,"Yum, that sounds like a good breakfast!","Мм, звучит как хороший завтрак!",TRANSLATED +conflict_win_hint_048,Make a breakfast compromise in the 'main' branch.,Найдите компромисс по завтраку в ветке 'main'.,TRANSLATED +mergeabort_title_049,Abort a merge,Прервать слияние,TRANSLATED mergeabort_description_050,"Sometimes you want to merge two commits, but a merge conflict occurs that you currently don't want to resolve. In these situations you can abort the merge to merge later. Use @@ -78,11 +72,11 @@ Try to merge both commits and abort the merge afterwards.","Иногда вы х git merge --abort когда вы находитесь в процессе слияния. -Попробуйте слить оба коммита, а затем прервать слияние.",, -mergeabort_congrats_051,"Aaah, let's merge later...","Ааа, давайте сольём позже...",, -mergeabort_win_hint_052,You tried to merge?,Вы пытались выполнить слияние?,, -mergeabort_win_hint_053,You aborted to merge?,Вы прервали слияние?,, -reset_title_054,Resetting files in the index,Сброс файлов в индексе,, +Попробуйте слить оба коммита, а затем прервать слияние.",TRANSLATED +mergeabort_congrats_051,"Aaah, let's merge later...","Ааа, давайте сольём позже...",TRANSLATED +mergeabort_win_hint_052,You tried to merge?,Вы пытались выполнить слияние?,TRANSLATED +mergeabort_win_hint_053,You aborted to merge?,Вы прервали слияние?,TRANSLATED +reset_title_054,Resetting files in the index,Сброс файлов в индексе,TRANSLATED reset_description_055,"See the dark shadow behind the icons? That's the version of the file in the last commit! For example, these candles have been blown out, and that change has been added. @@ -95,10 +89,10 @@ If you already have updated the index to a changed file, but want to reset it, y Но вы решаете, что это была ошибка! Вы хотите задуть только красную свечу в следующем коммите! -Если вы уже обновили индекс изменённым файлом, но хотите сбросить его, вы можете использовать git reset!",, -reset_win_hint_056,Reset the changes in the green and blue candles!,Сбросьте изменения в зелёной и синей свечах!,, -reset_win_hint_057,And make a commit!,И сделайте коммит!,, -change_title_058,Update files in the index,Обновление файлов в индексе,, +Если вы уже обновили индекс изменённым файлом, но хотите сбросить его, вы можете использовать git reset!",TRANSLATED +reset_win_hint_056,Reset the changes in the green and blue candles!,Сбросьте изменения в зелёной и синей свечах!,TRANSLATED +reset_win_hint_057,And make a commit!,И сделайте коммит!,TRANSLATED +change_title_058,Update files in the index,Обновление файлов в индексе,TRANSLATED change_description_059,"When we change files, the index won't change on its own. We have to use git add to update the index to the changed version of the file. Let's try that! @@ -107,36 +101,36 @@ The icons in the file browser show you when the actual file (white) and the vers Давайте попробуем! -Иконки в файловом браузере показывают, когда фактический файл (белый) и версия в индексе (синий) отличаются, и когда они одинаковы!",, -rm_title_060,Delete a file in the next commit,Удалить файл в следующем коммите,, +Иконки в файловом браузере показывают, когда фактический файл (белый) и версия в индексе (синий) отличаются, и когда они одинаковы!",TRANSLATED +rm_title_060,Delete a file in the next commit,Удалить файл в следующем коммите,TRANSLATED rm_description_061,"If you want to remove a file in the next commit, you can use git rm! This will both delete the file locally, and in the index. If a file is modified, you'll need to reset these changes first/reset the files.","Если вы хотите удалить файл в следующем коммите, вы можете использовать git rm! Это удалит файл как локально, так и в индексе. -Если файл изменён, вам нужно сначала сбросить эти изменения/сбросить файлы.",, -rm_win_hint_062,Make a commit where all files are deleted ¯_(^^)/¯,"Сделайте коммит, в котором удалены все файлы ¯_(^^)/¯", -steps_title_063,Adding changes step by step,Добавление изменений шаг за шагом,, -steps_description_064,"The index is really useful, because it allows us to be precise about which changes we want to include in each commit!","Индекс действительно полезен, потому что он позволяет нам точно определять, какие изменения мы хотим включить в каждый коммит!",, -steps_win_hint_065,"Make changes to all three objects, to form a logical sequence of events!","Внесите изменения во все три объекта, чтобы сформировать логическую последовательность событий!",, -steps_win_hint_066,Only add one of these changes!,Добавьте только одно из этих изменений!,, -steps_win_hint_067,And make a commit.,И сделайте коммит.,, -steps_win_hint_068,Make a second commit that only records a single change.,"Сделайте второй коммит, который фиксирует только одно изменение.", -steps_win_hint_069,And a third one.,И третий.,, -compare_title_070,Step by step,Шаг за шагом,, +Если файл изменён, вам нужно сначала сбросить эти изменения/сбросить файлы.",TRANSLATED +rm_win_hint_062,Make a commit where all files are deleted ¯_(^^)/¯,"Сделайте коммит, в котором удалены все файлы ¯_(^^)/¯",TRANSLATED +steps_title_063,Adding changes step by step,Добавление изменений шаг за шагом,TRANSLATED +steps_description_064,"The index is really useful, because it allows us to be precise about which changes we want to include in each commit!","Индекс действительно полезен, потому что он позволяет нам точно определять, какие изменения мы хотим включить в каждый коммит!",TRANSLATED +steps_win_hint_065,"Make changes to all three objects, to form a logical sequence of events!","Внесите изменения во все три объекта, чтобы сформировать логическую последовательность событий!",TRANSLATED +steps_win_hint_066,Only add one of these changes!,Добавьте только одно из этих изменений!,TRANSLATED +steps_win_hint_067,And make a commit.,И сделайте коммит.,TRANSLATED +steps_win_hint_068,Make a second commit that only records a single change.,"Сделайте второй коммит, который фиксирует только одно изменение.",TRANSLATED +steps_win_hint_069,And a third one.,И третий.,TRANSLATED +compare_title_070,Step by step,Шаг за шагом,TRANSLATED compare_description_071,"Welcome to today's lesson! We're going to learn how to make commits with more precision! Have a look at these two timelines. They have exactly the same outcome. But one of them makes it much easier to figure out what happened.","Добро пожаловать на сегодняшний урок! Мы научимся делать коммиты с большей точностью! -Взгляните на эти две временные линии. У них абсолютно одинаковый результат. Но одна из них значительно облегчает понимание того, что произошло.",, -compare_win_hint_072,Right! Having each change in its own commit makes it easier to understand what's going on! Let's learn how to do that!,Верно! Наличие каждого изменения в собственном коммите облегчает понимание происходящего! Давайте научимся это делать!,, -checkout_title_073,Checking out files from the index,Извлечение файлов из индекса,, +Взгляните на эти две временные линии. У них абсолютно одинаковый результат. Но одна из них значительно облегчает понимание того, что произошло.",TRANSLATED +compare_win_hint_072,Right! Having each change in its own commit makes it easier to understand what's going on! Let's learn how to do that!,Верно! Наличие каждого изменения в собственном коммите облегчает понимание происходящего! Давайте научимся это делать!,TRANSLATED +checkout_title_073,Checking out files from the index,Извлечение файлов из индекса,TRANSLATED checkout_description_074,"So you've made changes to your files, but you decide that you don't want to keep them! You can use git checkout for that! What happens if you have already update the index, like in file c? You have to reset the index first!","Итак, вы внесли изменения в свои файлы, но решили, что не хотите их сохранять! Для этого можно использовать git checkout! -Что произойдет, если вы уже обновили индекс, как в файле c? Сначала нужно сбросить индекс!",, -checkout_win_hint_075,Remove all changes in your local files!,Удалите все изменения в ваших локальных файлах!,, -add_title_076,Updating files in the index,Обновление файлов в индексе,, +Что произойдет, если вы уже обновили индекс, как в файле c? Сначала нужно сбросить индекс!",TRANSLATED +checkout_win_hint_075,Remove all changes in your local files!,Удалите все изменения в ваших локальных файлах!,TRANSLATED +add_title_076,Updating files in the index,Обновление файлов в индексе,TRANSLATED add_description_077,"So you start working, and make changes to your files! Git lets you choose which of these changes you want to put in the next commit. This is like updating the index version of that file to the new version. This allows you to have smaller commits, that describe better what you changed! @@ -145,11 +139,11 @@ The command for this is the same - git add!","Итак, вы начинаете Это позволяет вам делать более мелкие коммиты, которые лучше описывают, что вы изменили! -Команда для этого та же - git add!",, -add_congrats_078,"Well done! Try travelling between the commits using git checkout, so you can look at their contents again!","Отлично! Попробуйте перемещаться между коммитами с помощью git checkout, чтобы снова посмотреть их содержимое!",, -add_win_hint_079,Make changes to all files!,Внесите изменения во все файлы!,, -add_win_hint_080,"Add only the changes of a and c, and make a commit! Finally, make a commit which captures the changes in b!","Добавьте только изменения файлов a и c и сделайте коммит! Наконец, сделайте коммит, который зафиксирует изменения в файле b!",, -new_title_081,Add new files to the index,Добавление новых файлов в индекс,, +Команда для этого та же - git add!",TRANSLATED +add_congrats_078,"Well done! Try travelling between the commits using git checkout, so you can look at their contents again!","Отлично! Попробуйте перемещаться между коммитами с помощью git checkout, чтобы снова посмотреть их содержимое!",TRANSLATED +add_win_hint_079,Make changes to all files!,Внесите изменения во все файлы!,TRANSLATED +add_win_hint_080,"Add only the changes of a and c, and make a commit! Finally, make a commit which captures the changes in b!","Добавьте только изменения файлов a и c и сделайте коммит! Наконец, сделайте коммит, который зафиксирует изменения в файле b!",TRANSLATED +new_title_081,Add new files to the index,Добавление новых файлов в индекс,TRANSLATED new_description_082,"So far, when we made a commit, we've always recorded the current status of all objects, right? But Git allows you to pick which changes you want to put in a commit! @@ -162,31 +156,31 @@ Initially, the index is empty. To make a commit that contains a new file, we nee Чтобы узнать, как это работает, нам нужно узнать об ""индексе""! В индексе мы можем подготовить то, что будет в следующем коммите. В этой игре индекс представлен синей аурой вокруг иконок в файловом браузере! -Изначально индекс пуст. Чтобы сделать коммит, содержащий новый файл, нам нужно его добавить!",, -new_win_hint_083,Add the candle.,Добавьте свечу.,, -new_win_hint_084,Make a commit.,Сделайте коммит.,, -checkoutcommit_title_085,Moving111 through time,Перемещение во времени,, +Изначально индекс пуст. Чтобы сделать коммит, содержащий новый файл, нам нужно его добавить!",TRANSLATED +new_win_hint_083,Add the candle.,Добавьте свечу.,TRANSLATED +new_win_hint_084,Make a commit.,Сделайте коммит.,TRANSLATED +checkoutcommit_title_085,Moving through time,Перемещение во времени,TRANSLATED checkoutcommit_description_086,"The yellow boxes are frozen points in time, we call them ""commits""! You can travel between them using the ""checkout"" card! (Try it!) Can you find out what happened here? Then, while on the last commit, edit the files to fix the problem, and make a new commit!","Желтые ящики - это застывшие моменты времени, мы называем их ""коммитами""! Вы можете путешествовать между ними, используя карту ""checkout""! (Попробуйте!) -Сможете ли вы выяснить, что здесь произошло? Затем, находясь на последнем коммите, отредактируйте файлы, чтобы исправить проблему, и сделайте новый коммит!",, -checkoutcommit_congrats_087,"Wonderful! Now that you're getting familiar with the time machine, let's look at some more complicated situations...","Замечательно! Теперь, когда вы осваиваетесь с машиной времени, давайте рассмотрим несколько более сложных ситуаций...",, -checkoutcommit_win_hint_088,Restore sisterly peace.,Восстановите сестринский мир.,, -branchcreate_title_089,Creating branches,Создание веток,, +Сможете ли вы выяснить, что здесь произошло? Затем, находясь на последнем коммите, отредактируйте файлы, чтобы исправить проблему, и сделайте новый коммит!",TRANSLATED +checkoutcommit_congrats_087,"Wonderful! Now that you're getting familiar with the time machine, let's look at some more complicated situations...","Замечательно! Теперь, когда вы осваиваетесь с машиной времени, давайте рассмотрим несколько более сложных ситуаций...",TRANSLATED +checkoutcommit_win_hint_088,Restore sisterly peace.,Восстановите сестринский мир.,TRANSLATED +branchcreate_title_089,Creating branches,Создание веток,TRANSLATED branchcreate_description_090,"You were invited to two parties! At one of them, your favorite band is playing - and the other one is your best friend's birthday party. Where should you go? No worries - as a time travel agent in training, you can go to both parties! To make it easier to tell which timeline is which, you can create time portals! (We call these ""branches"".)","Вас пригласили на две вечеринки! На одной из них играет ваша любимая группа, а другая — день рождения вашего лучшего друга. Куда пойти? Не беспокойтесь — как стажер-агент по путешествиям во времени, вы можете пойти на обе вечеринки! -Чтобы было легче различать временные линии, вы можете создавать временные порталы! (Мы называем их ""ветками"".)",, +Чтобы было легче различать временные линии, вы можете создавать временные порталы! (Мы называем их ""ветками"".)",TRANSLATED branchcreate_congrats_091,"Now you can travel between those branches easily (using git checkout) - try it! Your friend is happy that you made it to the birthday party and you also got your concert ticket signed. Yay!","Теперь вы можете легко перемещаться между этими ветками (используя git checkout) - попробуйте! -Ваш друг рад, что вы пришли на день рождения, и вы также получили автограф на билете на концерт. Ура!",, -branchcreate_win_hint_092,Create a branch called 'birthday' that points to the birthday timeline.,Создайте ветку с именем 'birthday', которая указывает на временную линию дня рождения., -branchcreate_win_hint_093,Create a branch called 'concert' that points to the concert timeline.,Создайте ветку с именем 'concert', которая указывает на временную линию концерта., -grow_title_094,Branches grow with you!,Ветки растут вместе с вами!,, +Ваш друг рад, что вы пришли на день рождения, и вы также получили автограф на билете на концерт. Ура!",TRANSLATED +branchcreate_win_hint_092,Create a branch called 'birthday' that points to the birthday timeline.,"Создайте ветку с именем 'birthday', которая указывает на временную линию дня рождения.",TRANSLATED +branchcreate_win_hint_093,Create a branch called 'concert' that points to the concert timeline.,"Создайте ветку с именем 'concert', которая указывает на временную линию концерта.",TRANSLATED +grow_title_094,Branches grow with you!,Ветки растут вместе с вами!,TRANSLATED grow_description_095,"Note that there are two options to ""travel to the end of a timeline"": First, you can directly travel to the commit, like we've done it before. @@ -195,10 +189,10 @@ And second, you can travel to the branch label. In this case, when you make a ne Во-первых, вы можете напрямую переместиться к коммиту, как мы делали это раньше. -И во-вторых, вы можете переместиться к метке ветки. В этом случае, когда вы делаете новый коммит, ветка будет расти вместе с вами и по-прежнему указывать на конец временной линии!",, -grow_win_hint_096,"Travel directly to the last yellow commit of the birthday timeline, make a change to 'you', and make a commit","Переместитесь напрямую к последнему желтому коммиту временной линии дня рождения, внесите изменение в 'you' и сделайте коммит",, -grow_win_hint_097,"Travel to the blue 'concert' branch, make a change to 'you', and a commit.","Переместитесь к синей ветке 'concert', внесите изменение в 'you' и сделайте коммит.",, -reorder_title_098,Moving branches around,Перемещение веток,, +И во-вторых, вы можете переместиться к метке ветки. В этом случае, когда вы делаете новый коммит, ветка будет расти вместе с вами и по-прежнему указывать на конец временной линии!",TRANSLATED +grow_win_hint_096,"Travel directly to the last yellow commit of the birthday timeline, make a change to 'you', and make a commit","Переместитесь напрямую к последнему желтому коммиту временной линии дня рождения, внесите изменение в 'you' и сделайте коммит",TRANSLATED +grow_win_hint_097,"Travel to the blue 'concert' branch, make a change to 'you', and a commit.","Переместитесь к синей ветке 'concert', внесите изменение в 'you' и сделайте коммит.",TRANSLATED +reorder_title_098,Moving branches around,Перемещение веток,TRANSLATED reorder_description_099,"One of your colleagues messed up here, and put the branches in the wrong timelines! You could delete and re-create these branches - but you can also directly move them to different commits, by using @@ -223,16 +217,16 @@ The donut branch is in the right place, but the timeline is still incomplete - m на коммите, где вы хотите, чтобы была ветка. -Ветка с пончиком находится в правильном месте, но временная линия все еще неполная - убедитесь, что вы действительно съели пончик в этой ветке!",, -reorder_win_hint_100,Did you eat a baguette on the baguette branch?,"Вы съели багет на ветке ""багет""?",, -reorder_win_hint_101,Did you drink a coffee on the coffee branch?,"Вы выпили кофе на ветке ""кофе""?",, -reorder_win_hint_102,Did you eat a donut on the donut branch?,"Вы съели пончик на ветке ""пончик""?",, -fork_title_103,Make parallel commits,Делайте параллельные коммиты,, +Ветка с пончиком находится в правильном месте, но временная линия все еще неполная - убедитесь, что вы действительно съели пончик в этой ветке!",TRANSLATED +reorder_win_hint_100,Did you eat a baguette on the baguette branch?,"Вы съели багет на ветке ""багет""?",TRANSLATED +reorder_win_hint_101,Did you drink a coffee on the coffee branch?,"Вы выпили кофе на ветке ""кофе""?",TRANSLATED +reorder_win_hint_102,Did you eat a donut on the donut branch?,"Вы съели пончик на ветке ""пончик""?",TRANSLATED +fork_title_103,Make parallel commits,Делайте параллельные коммиты,TRANSLATED fork_description_104,"Did you know that creating parallel timelines is perfectly legal and safe? It's true! Can you find out when things went wrong in this zoo? Then, go back to the last good commit and create a parallel universe where everyone is happy!","Знаете ли вы, что создание параллельных временных линий совершенно законно и безопасно? Это правда! -Сможете ли вы выяснить, когда в этом зоопарке все пошло не так? Затем вернитесь к последнему удачному коммиту и создайте параллельную вселенную, где все счастливы!",, +Сможете ли вы выяснить, когда в этом зоопарке все пошло не так? Затем вернитесь к последнему удачному коммиту и создайте параллельную вселенную, где все счастливы!",TRANSLATED fork_congrats_105,"Whew, good job! This seems like a much better outcome. Feel free to add more parallel timelines, or make them longer. @@ -241,39 +235,39 @@ If you're ready, our next mission is already waiting...","Уф, хорошая Не стесняйтесь добавлять больше параллельных временных линий или делать их длиннее. -Если вы готовы, наша следующая миссия уже ждет...",, -fork_win_hint_106,Make sure that the child is happy.,"Убедитесь, что ребенок счастлив.", -fork_win_hint_107,Make sure that the lion gets something to eat.,"Убедитесь, что лев получил что-нибудь поесть.", -branchremove_title_108,Deleting branches,Удаление веток,, +Если вы готовы, наша следующая миссия уже ждет...",TRANSLATED +fork_win_hint_106,Make sure that the child is happy.,"Убедитесь, что ребенок счастлив.",TRANSLATED +fork_win_hint_107,Make sure that the lion gets something to eat.,"Убедитесь, что лев получил что-нибудь поесть.",TRANSLATED +branchremove_title_108,Deleting branches,Удаление веток,TRANSLATED branchremove_description_109,"Life is full of dangers, right? Even when walking to school, it seems like there's a lot of risks! This Monday is especially bad. You made it to school, but there's some timelines you definitely don't want to keep around.","Жизнь полна опасностей, верно? Даже по дороге в школу, кажется, много рисков! -Этот понедельник особенно плох. Вы добрались до школы, но есть некоторые временные линии, которые вы определенно не хотите сохранять.",, -branchremove_congrats_110,"On second thought, maybe you even prefer the ice cream timeline to the main one? :)","Хотя, если подумать, может быть, вы даже предпочитаете временную линию с мороженым основной? :)",, -branchremove_win_hint_111,Find the bad branches and delete them. Keep only the best one.,Найдите плохие ветки и удалите их. Оставьте только лучшую.,, -cli_title_112,The command line,Командная строка,, -cli_description_113,These playing cards are designed to be easy to use and to remember! We'd suggest sticking to them if you don't have a lot of experience with Git!,"Эти игральные карты разработаны так, чтобы их было легко использовать и запоминать! Мы бы посоветовали придерживаться их, если у вас не так много опыта работы с Git!" +Этот понедельник особенно плох. Вы добрались до школы, но есть некоторые временные линии, которые вы определенно не хотите сохранять.",TRANSLATED +branchremove_congrats_110,"On second thought, maybe you even prefer the ice cream timeline to the main one? :)","Хотя, если подумать, может быть, вы даже предпочитаете временную линию с мороженым основной? :)",TRANSLATED +branchremove_win_hint_111,Find the bad branches and delete them. Keep only the best one.,Найдите плохие ветки и удалите их. Оставьте только лучшую.,TRANSLATED +cli_title_112,The command line,Командная строка,TRANSLATED +cli_description_113,These playing cards are designed to be easy to use and to remember! We'd suggest sticking to them if you don't have a lot of experience with Git!,"Эти игральные карты разработаны так, чтобы их было легко использовать и запоминать! Мы бы посоветовали придерживаться их, если у вас не так много опыта работы с Git!",TRANSLATED cli_congrats_114,"Cool! Instead of using the playing cards, you can also do everything via the command line! The command line is pretty powerful! Often, you can use it to solve tasks faster compared to using a graphical interface.","Круто! Вместо использования игральных карт вы также можете делать все через командную строку! -Командная строка довольно мощная! Часто вы можете использовать ее для решения задач быстрее по сравнению с использованием графического интерфейса.",, -cli_win_hint_115,Initialize the time machine!,Инициализируйте машину времени!,, -whoareyou_title_116,Welcome to time travel school!,Добро пожаловать в школу путешествий во времени!,, +Командная строка довольно мощная! Часто вы можете использовать ее для решения задач быстрее по сравнению с использованием графического интерфейса.",TRANSLATED +cli_win_hint_115,Initialize the time machine!,Инициализируйте машину времени!,TRANSLATED +whoareyou_title_116,Welcome to time travel school!,Добро пожаловать в школу путешествий во времени!,TRANSLATED whoareyou_description_117,"You're still pretty confused by everything that's going on. The next day, you decide to enroll in time travel school! Your time travel teacher welcomes you: ""Hello there! Wanna tell us your name?""","Вы все еще в замешательстве от всего происходящего. На следующий день вы решаете записаться в школу путешествий во времени! -Ваш учитель по путешествиям во времени приветствует вас: ""Привет! Хочешь сказать нам свое имя?""",, +Ваш учитель по путешествиям во времени приветствует вас: ""Привет! Хочешь сказать нам свое имя?""",TRANSLATED whoareyou_congrats_118,"We're so glad to have you! Git can help you fix problems in the past! It allows you to collaborate with other students of time travel! It's really powerful, and it's really popular! I'll see you for your first lesson tomorrow!","Мы так рады видеть вас! -Git может помочь вам исправить проблемы в прошлом! Он позволяет вам сотрудничать с другими учениками путешествий во времени! Он действительно мощный и очень популярный! Увидимся на вашем первом уроке завтра!",, -whoareyou_win_hint_119,Introduce yourself.,Представьтесь.,, -whoareyou_win_hint_120,"Fill out the enrollment form, and commit it!",Заполните форму зачисления и закоммитьте ее!,, -init_title_121,Enter the time machine,Войдите в машину времени,, +Git может помочь вам исправить проблемы в прошлом! Он позволяет вам сотрудничать с другими учениками путешествий во времени! Он действительно мощный и очень популярный! Увидимся на вашем первом уроке завтра!",TRANSLATED +whoareyou_win_hint_119,Introduce yourself.,Представьтесь.,TRANSLATED +whoareyou_win_hint_120,"Fill out the enrollment form, and commit it!",Заполните форму зачисления и закоммитьте ее!,TRANSLATED +init_title_121,Enter the time machine,Войдите в машину времени,TRANSLATED init_description_122,"You've been accepted to time travel school! Yay! It's your first day! Your teacher explains: ""To do anything with a time machine, you first need to initialize it!"" @@ -282,9 +276,9 @@ Drag that blue card up to play it!","Вас приняли в школу пут ""Чтобы что-то делать с машиной времени, сначала нужно ее инициализировать!"" -Перетащите эту синюю карту вверх, чтобы сыграть ею!",, -init_congrats_123,"Nice! See that little owl squirrel that appeared? It will be your companion, and always show you where you are in time!","Отлично! Видите эту маленькую сову-белку, которая появилась? Она будет вашим спутником и всегда будет показывать, где вы находитесь во времени!",, -risky_title_124,Living dangerously,Жить опасно,, +Перетащите эту синюю карту вверх, чтобы сыграть ею!",TRANSLATED +init_congrats_123,"Nice! See that little owl squirrel that appeared? It will be your companion, and always show you where you are in time!","Отлично! Видите эту маленькую сову-белку, которая появилась? Она будет вашим спутником и всегда будет показывать, где вы находитесь во времени!",TRANSLATED +risky_title_124,Living dangerously,Жить опасно,TRANSLATED risky_description_125,"So you have decided to apply for time travel school, to learn how to use this time machine called ""Git""! How exciting! @@ -293,7 +287,7 @@ You're almost done with the paperwork! You just need to fill in one more reason Как захватывающе! -Вы почти закончили с документами! Вам просто нужно указать еще одну причину, почему вы хотите изучать Git.",, +Вы почти закончили с документами! Вам просто нужно указать еще одну причину, почему вы хотите изучать Git.",TRANSLATED risky_congrats_126,"Suddenly, your cat jumps on the table, snatches away the form, and runs away! Oh no. All your hard work, gone! You clearly need a better solution. @@ -302,30 +296,30 @@ You clearly need a better solution. Вам явно нужно лучшее решение. -(Нажмите ""Следующий уровень"", как только будете готовы!)",, -risky_win_hint_127,Add another line to form.txt!,Добавьте еще одну строку в form.txt!,, -remote_title_128,Working together,Работаем вместе,, +(Нажмите ""Следующий уровень"", как только будете готовы!)",TRANSLATED +risky_win_hint_127,Add another line to form.txt!,Добавьте еще одну строку в form.txt!,TRANSLATED +remote_title_128,Working together,Работаем вместе,TRANSLATED remote_description_129,"Let's add your name to our list of students! I already have a second commit of it in my time machine - let's work together!","Давайте добавим ваше имя в наш список студентов! -У меня уже есть второй коммит этого в моей машине времени - давайте работать вместе!",, -remote_congrats_130,Welcome to time travel school! :) I'll see you for your first class tomorrow!,Добро пожаловать в школу путешествий во времени! :) Увидимся на вашем первом занятии завтра!,, -remote_win_hint_131,Get the second commit from your teacher using git pull.,Получите второй коммит от вашего учителя, используя git pull., -remote_win_hint_132,Add your name to the list of students,Добавьте свое имя в список студентов,, -remote_win_hint_133,Commit your result.,Закоммитьте свой результат.,, -commit_title_134,Your first commit,Ваш первый коммит,, +У меня уже есть второй коммит этого в моей машине времени - давайте работать вместе!",TRANSLATED +remote_congrats_130,Welcome to time travel school! :) I'll see you for your first class tomorrow!,Добро пожаловать в школу путешествий во времени! :) Увидимся на вашем первом занятии завтра!,TRANSLATED +remote_win_hint_131,Get the second commit from your teacher using git pull.,"Получите второй коммит от вашего учителя, используя git pull.,",TRANSLATED +remote_win_hint_132,Add your name to the list of students,Добавьте свое имя в список студентов,TRANSLATED +remote_win_hint_133,Commit your result.,Закоммитьте свой результат.,TRANSLATED +commit_title_134,Your first commit,Ваш первый коммит,TRANSLATED commit_description_135,"You can use your time machine to make snapshots of objects around you! Here, let's practice this! (Your teacher pours some water into a glass.)","Вы можете использовать свою машину времени, чтобы делать снимки объектов вокруг вас! Давайте попрактикуемся! -(Ваш учитель наливает немного воды в стакан.)",, -commit_congrats_136,"Nice! You can try making some additional commits. When you feel comfortable, click on ""Next Level"".","Отлично! Вы можете попробовать сделать еще несколько коммитов. Когда почувствуете себя уверенно, нажмите ""Следующий уровень"".",, -commit_win_hint_137,"Make a snapshot of the glass (a ""commit"")","Сделайте снимок стакана (""коммит"")",, -commit_win_hint_138,Change the contents of the glass!,Измените содержимое стакана!,, -commit_win_hint_139,And make a second commit!,И сделайте второй коммит!,, -copies_title_140,Making backups,Создание резервных копий,, -copies_description_141,"This time, you're making a lot of backup copies - you can look at them by clicking on them!","На этот раз вы делаете много резервных копий - вы можете посмотреть их, кликнув по ним!",, +(Ваш учитель наливает немного воды в стакан.)",TRANSLATED +commit_congrats_136,"Nice! You can try making some additional commits. When you feel comfortable, click on ""Next Level"".","Отлично! Вы можете попробовать сделать еще несколько коммитов. Когда почувствуете себя уверенно, нажмите ""Следующий уровень"".",TRANSLATED +commit_win_hint_137,"Make a snapshot of the glass (a ""commit"")","Сделайте снимок стакана (""коммит"")",TRANSLATED +commit_win_hint_138,Change the contents of the glass!,Измените содержимое стакана!,TRANSLATED +commit_win_hint_139,And make a second commit!,И сделайте второй коммит!,TRANSLATED +copies_title_140,Making backups,Создание резервных копий,TRANSLATED +copies_description_141,"This time, you're making a lot of backup copies - you can look at them by clicking on them!","На этот раз вы делаете много резервных копий - вы можете посмотреть их, кликнув по ним!",TRANSLATED copies_congrats_142,"Okay, this kind of works. But you're a bit worried that you'll end up with hundreds of copies of this form, and it will be hard to keep track of all of them. @@ -338,9 +332,9 @@ You can't wait to try these time machines!","Хорошо, это вроде б И особенно при работе с другими людьми, отправка копий туда и обратно не кажется идеальным решением. -Вам не терпится опробовать эти машины времени!",, -copies_win_hint_143,Add another line to form2_really_final.txt!,Добавьте еще одну строку в form2_really_final.txt!,, -stash_title_144,Stashing,Сохранение в тайнике (Stashing),, +Вам не терпится опробовать эти машины времени!",TRANSLATED +copies_win_hint_143,Add another line to form2_really_final.txt!,Добавьте еще одну строку в form2_really_final.txt!,TRANSLATED +stash_title_144,Stashing,Сохранение в тайнике (Stashing),TRANSLATED stash_description_145,"You will encounter situations in which you are working on your project but you need to put your current changes aside temporarily. To do so, you can use the stash function. Use `git stash push` to add your current changes to the stash stack. --- @@ -355,10 +349,10 @@ tipp1 --- tipp2 --- -tipp3", -stash_congrats_146,Nice stash you got there! :),Хороший у вас тайник! :),, -stash_win_hint_147,Did you stash the current changes?,Вы сохранили текущие изменения в тайнике?,, -stashpop_title_148,Pop from Stash,Извлечь из тайника (Pop from Stash),, +tipp3",TRANSLATED +stash_congrats_146,Nice stash you got there! :),Хороший у вас тайник! :),TRANSLATED +stash_win_hint_147,Did you stash the current changes?,Вы сохранили текущие изменения в тайнике?,TRANSLATED +stashpop_title_148,Pop from Stash,Извлечь из тайника (Pop from Stash),TRANSLATED stashpop_description_149,"When you stashed your changes and you want to apply them back to your current working directory, you can use `git stash pop`. This will remove the changes from the stash stack. If you also want to keep the changes on the stash stack, use `git stash apply`. @@ -375,10 +369,10 @@ tipp1 --- tipp2 --- -tipp3",, -stashpop_congrats_150,"Yay, you got your changes back! :)","Ура, вы вернули свои изменения! :)",, -stashpop_win_hint_151,Did you pop the changes from the stash stack?,Вы извлекли изменения из стека тайника?,, -stashclear_title_152,Clear the Stash,Очистить тайник (Clear the Stash),, +tipp3",TRANSLATED +stashpop_congrats_150,"Yay, you got your changes back! :)","Ура, вы вернули свои изменения! :)",TRANSLATED +stashpop_win_hint_151,Did you pop the changes from the stash stack?,Вы извлекли изменения из стека тайника?,TRANSLATED +stashclear_title_152,Clear the Stash,Очистить тайник (Clear the Stash),TRANSLATED stashclear_description_153,"If you want to inspect your stash stack, use the command git stash list @@ -417,10 +411,10 @@ tipp1 --- tipp2 --- -tipp3",, -stashclear_congrats_154,All clear! :),Все чисто! :),, -stashclear_win_hint_155,Did you clear your stash stack?,Вы очистили свой стек тайника?,, -stashmerge_title_156,Merging popped stash,Слияние извлеченных из тайника изменений,, +tipp3",TRANSLATED +stashclear_congrats_154,All clear! :),Все чисто! :),TRANSLATED +stashclear_win_hint_155,Did you clear your stash stack?,Вы очистили свой стек тайника?,TRANSLATED +stashmerge_title_156,Merging popped stash,Слияние извлеченных из тайника изменений,TRANSLATED stashmerge_description_157,"When you want to re-apply your changes but you already continued working on your file, you might get a merge conflict! Let's practice this situation. Pop the changes from the stash with @@ -445,10 +439,10 @@ tipp1 --- tipp2 --- -tipp3",, -stashmerge_win_hint_158,Did you resolve the conflict and commit?,Вы разрешили конфликт и закоммитили?,, -stashmerge_win_hint_159,Did you clear stash stack?,Вы очистили стек тайника?,, -stashbranch_title_160,Branch from stash,Ветка из тайника,, +tipp3",TRANSLATED +stashmerge_win_hint_158,Did you resolve the conflict and commit?,Вы разрешили конфликт и закоммитили?,TRANSLATED +stashmerge_win_hint_159,Did you clear stash stack?,Вы очистили стек тайника?,TRANSLATED +stashbranch_title_160,Branch from stash,Ветка из тайника,TRANSLATED stashbranch_description_161,"If you want to keep your changes but they don't belong to the main branch, you can easily create a new branch from your stashed changes. Just use git stash branch @@ -476,32 +470,32 @@ tipp1 --- tipp2 --- -tipp3",, -stashbranch_congrats_162,Stashed changes are in a new branch! :),Изменения из тайника теперь в новой ветке! :),, -stashbranch_win_hint_163,Did you create a new branch from the stashed changes?,Вы создали новую ветку из изменений в тайнике?,, -whoareyou_title_164,Nice to meet you!,Приятно познакомиться!,, +tipp3",TRANSLATED +stashbranch_congrats_162,Stashed changes are in a new branch! :),Изменения из тайника теперь в новой ветке! :),TRANSLATED +stashbranch_win_hint_163,Did you create a new branch from the stashed changes?,Вы создали новую ветку из изменений в тайнике?,TRANSLATED +whoareyou_title_164,Nice to meet you!,Приятно познакомиться!,TRANSLATED whoareyou_description_165,"Introduce yourself using git config --global user.name Firstname git config --global user.email ""your@mail.com""","Представьтесь, используя git config --global user.name Имя - git config --global user.email ""your@mail.com""`" -whoareyou_win_hint_166,Have a name configured.,Имя настроено.,, -whoareyou_win_hint_167,Have an email address configured.,Адрес электронной почты настроен.,, -clone_title_168,Cloning a repo,Клонирование репозитория,, -clone_description_169,"Get your friend's repo using `clone`, change something, push it back.","Получите репозиторий вашего друга с помощью `clone`, измените что-нибудь, отправьте обратно.",, -init_title_170,Welcome!,Добро пожаловать!,, -init_win_hint_171,"Again, initialize your time machine!",Снова инициализируйте вашу машину времени!,, -split_title_172,Split a commit!,Разделить коммит!,, -split_description_173,"Here, both changes happened in one commit! Split them to be in two commits instead.",Здесь оба изменения произошли в одном коммите! Разделите их на два коммита.,, -steps_title_174,One step after another,Шаг за шагом,, + git config --global user.email ""your@mail.com""`",TRANSLATED +whoareyou_win_hint_166,Have a name configured.,Имя настроено.,TRANSLATED +whoareyou_win_hint_167,Have an email address configured.,Адрес электронной почты настроен.,TRANSLATED +clone_title_168,Cloning a repo,Клонирование репозитория,TRANSLATED +clone_description_169,"Get your friend's repo using `clone`, change something, push it back.","Получите репозиторий вашего друга с помощью `clone`, измените что-нибудь, отправьте обратно.",TRANSLATED +init_title_170,Welcome!,Добро пожаловать!,TRANSLATED +init_win_hint_171,"Again, initialize your time machine!",Снова инициализируйте вашу машину времени!,TRANSLATED +split_title_172,Split a commit!,Разделить коммит!,TRANSLATED +split_description_173,"Here, both changes happened in one commit! Split them to be in two commits instead.",Здесь оба изменения произошли в одном коммите! Разделите их на два коммита.,TRANSLATED +steps_title_174,One step after another,Шаг за шагом,TRANSLATED steps_description_175,"Sometimes, you might want to record the order in which things changed, instead of making a single commit. What happened here? Make two commits from the changes (using the ""add"" card), in an order that makes sense!","Иногда вы можете захотеть записать порядок, в котором происходили изменения, вместо того, чтобы делать один коммит. -Что здесь произошло? Сделайте два коммита из изменений (используя карту ""add""), в осмысленном порядке!",, -commita_title_176,"Make a commit, but faster!","Сделай коммит, но быстрее!",, +Что здесь произошло? Сделайте два коммита из изменений (используя карту ""add""), в осмысленном порядке!",TRANSLATED +commita_title_176,"Make a commit, but faster!","Сделай коммит, но быстрее!",TRANSLATED commita_description_177,"There is a time-saving trick, where instead of a plain git commit, you can use git commit -a @@ -510,31 +504,31 @@ This will automatically add all changes you made to local files! Very convenient git commit -a -Это автоматически добавит все изменения, которые вы внесли в локальные файлы! Очень удобно.",, -commita_win_hint_178,"Make a commit where all files contain ""x"".","Сделайте коммит, в котором все файлы содержат ""x"".",, -filesmove_title_179,No sleep required,Сон не требуется,, +Это автоматически добавит все изменения, которые вы внесли в локальные файлы! Очень удобно.",TRANSLATED +commita_win_hint_178,"Make a commit where all files contain ""x"".","Сделайте коммит, в котором все файлы содержат ""x"".",TRANSLATED +filesmove_title_179,No sleep required,Сон не требуется,TRANSLATED filesmove_description_180,"Actually, you decide that you don't need any sleep. Because of that, you won't require a bed, and can build some other piece of furniture from the wood!","На самом деле, вы решаете, что вам не нужен сон. -Из-за этого вам не понадобится кровать, и вы можете сделать какой-нибудь другой предмет мебели из дерева!",, +Из-за этого вам не понадобится кровать, и вы можете сделать какой-нибудь другой предмет мебели из дерева!",TRANSLATED filesmove_congrats_181,"Neat! It even still looks a bit comfortable! You head out, eager for your first lesson at time travel school!","Классно! Она даже все еще выглядит немного удобной! -Вы отправляетесь, с нетерпением ожидая своего первого урока в школе путешествий во времени!",, -filesmove_win_hint_182,"Rename the bed into something else, and give it a new description!",Переименуйте кровать во что-то другое и дайте ей новое описание!,, -remotesdelete_title_183,Deleting and renaming a remote,Удаление и переименование удаленного репозитория,, -remotesdelete_description_184,"Here, you already have two remotes configured! You can list them using `git remote`.",Здесь у вас уже настроено два удаленных репозитория! Вы можете их перечислить с помощью `git remote`,, -remotesdelete_win_hint_185,Rename the remote with the typo (using `git remote rename [old name] [new name]`),Переименуйте удаленный репозиторий с опечаткой (используя `git remote rename [старое имя] [новое имя]`),, -remotesdelete_win_hint_186,The remote with the typo is gone.,Удаленный репозиторий с опечаткой исчез.,, +Вы отправляетесь, с нетерпением ожидая своего первого урока в школе путешествий во времени!",TRANSLATED +filesmove_win_hint_182,"Rename the bed into something else, and give it a new description!",Переименуйте кровать во что-то другое и дайте ей новое описание!,TRANSLATED +remotesdelete_title_183,Deleting and renaming a remote,Удаление и переименование удаленного репозитория,TRANSLATED +remotesdelete_description_184,"Here, you already have two remotes configured! You can list them using `git remote`.",Здесь у вас уже настроено два удаленных репозитория! Вы можете их перечислить с помощью `git remote`,TRANSLATED +remotesdelete_win_hint_185,Rename the remote with the typo (using `git remote rename [old name] [new name]`),Переименуйте удаленный репозиторий с опечаткой (используя `git remote rename [старое имя] [новое имя]`),TRANSLATED +remotesdelete_win_hint_186,The remote with the typo is gone.,Удаленный репозиторий с опечаткой исчез.,TRANSLATED remotesdelete_win_hint_187,Delete the remote you don't want to keep (using `git remote remove [remote]`),Удалите удаленный репозиторий, который вы не хотите сохранять (используя `git remote remove [remote]`), -commit_title_188,Make a commit \o/,Сделайте коммит \o/,, -commit_description_189,"For practice, make a commit where all files contain an ""x""!","Для практики сделайте коммит, в котором все файлы содержат ""x""!",, -commit_win_hint_190,"File a contains ""x"" in the last main commit.","Файл a содержит ""x"" в последнем коммите ветки main.",, -commit_win_hint_191,"File b contains ""x"" in the last main commit.","Файл b содержит ""x"" в последнем коммите ветки main.",, -commit_win_hint_192,"File c contains ""x"" in the last main commit.","Файл c содержит ""x"" в последнем коммите ветки main.",, -pullpush_title_193,Helping each other,Помогая друг другу,, +commit_title_188,Make a commit \o/,Сделайте коммит \o/,TRANSLATED +commit_description_189,"For practice, make a commit where all files contain an ""x""!","Для практики сделайте коммит, в котором все файлы содержат ""x""!",TRANSLATED +commit_win_hint_190,"File a contains ""x"" in the last main commit.","Файл a содержит ""x"" в последнем коммите ветки main.",TRANSLATED +commit_win_hint_191,"File b contains ""x"" in the last main commit.","Файл b содержит ""x"" в последнем коммите ветки main.",TRANSLATED +commit_win_hint_192,"File c contains ""x"" in the last main commit.","Файл c содержит ""x"" в последнем коммите ветки main.",TRANSLATED +pullpush_title_193,Helping each other,Помогая друг другу,TRANSLATED pullpush_description_194,"The events and timelines you see are always only what your own time machine knows about! Of course, time agents don't have to work alone! Here, your sidekick has already prepared a merge for you! You can use the ""pull"" card to transfer it to your own time machine. @@ -547,9 +541,9 @@ You can only ever manipulate things in your own time machine (the one on the bot Затем добавьте еще одно событие сверху (что Сэм ест на ужин?) и push результат, чтобы передать его обратно вашему помощнику! -Вы можете манипулировать вещами только в своей собственной машине времени (той, что внизу).",, -pullpush_congrats_195,"In reality, in many cases, a lot of time agents work together to build a really good future together! :)","В реальности, во многих случаях, множество временных агентов работают вместе, чтобы построить действительно хорошее будущее! :)",, -fetch_title_196,Fetching from remotes,Получение данных с удаленных репозиториев,, +Вы можете манипулировать вещами только в своей собственной машине времени (той, что внизу).",TRANSLATED +pullpush_congrats_195,"In reality, in many cases, a lot of time agents work together to build a really good future together! :)","В реальности, во многих случаях, множество временных агентов работают вместе, чтобы построить действительно хорошее будущее! :)",TRANSLATED +fetch_title_196,Fetching from remotes,Получение данных с удаленных репозиториев,TRANSLATED fetch_description_197,"Here, you already have two remotes configured! You can list them using `git remote`. Fetch from both, and look at the suggestions. @@ -558,10 +552,10 @@ Then, make a new commit on top of your original one that introduces a compromise Получите данные с обоих и посмотрите на предложения. -Затем сделайте новый коммит поверх вашего оригинального, который вводит компромисс.",, -fetch_win_hint_198,Your proposal is acceptable for friend1.,Ваше предложение приемлемо для friend1.,, -fetch_win_hint_199,Your proposal is acceptable for friend2.,Ваше предложение приемлемо для friend2.,, -remotesadd_title_200,Adding a remote,Добавление удаленного репозитория,, +Затем сделайте новый коммит поверх вашего оригинального, который вводит компромисс.",TRANSLATED +fetch_win_hint_198,Your proposal is acceptable for friend1.,Ваше предложение приемлемо для friend1.,TRANSLATED +fetch_win_hint_199,Your proposal is acceptable for friend2.,Ваше предложение приемлемо для friend2.,TRANSLATED +remotesadd_title_200,Adding a remote,Добавление удаленного репозитория,TRANSLATED remotesadd_description_201,"Let's work together with others! Your friend has their own repo at the URL `../friend` - you can add it using git remote add [name] [URL] @@ -582,24 +576,24 @@ There's a letter for you!","Давайте работать вместе с др git pull friend -Для вас есть письмо!",, -remotesadd_win_hint_202,Add a remote that points to ../friend.,Добавьте удаленный репозиторий, который указывает на `../friend`., -remotesadd_win_hint_203,Pull from the remote.,Получите данные с удаленного репозитория.,, -checkout_title_204,Getting the last version,Получение последней версии,, +Для вас есть письмо!",TRANSLATED +remotesadd_win_hint_202,Add a remote that points to ../friend.,"Добавьте удаленный репозиторий, который указывает на `../friend`.",TRANSLATED +remotesadd_win_hint_203,Pull from the remote.,Получите данные с удаленного репозитория.,TRANSLATED +checkout_title_204,Getting the last version,Получение последней версии,TRANSLATED checkout_description_205,"You've been working on your essay for a while. But - ughh! Now your cat walks over your keyboard and ""helps you"", so now it's all messed up! :/ But Git is here to help! To discard all changes your cat made, and go back to the version in the last commit, use checkout!","Вы уже некоторое время работаете над своим эссе. Но - ух! Теперь ваша кошка прошлась по клавиатуре и ""помогла вам"", так что теперь все испорчено! :/ -Но Git здесь, чтобы помочь! Чтобы отменить все изменения, которые сделала ваша кошка, и вернуться к версии в последнем коммите, используйте checkout!",, -checkout_win_hint_206,Restore the version from the last commit.,Восстановите версию из последнего коммита.,, -restore_title_207,Looking into the past,Заглядывая в прошлое,, +Но Git здесь, чтобы помочь! Чтобы отменить все изменения, которые сделала ваша кошка, и вернуться к версии в последнем коммите, используйте checkout!",TRANSLATED +checkout_win_hint_206,Restore the version from the last commit.,Восстановите версию из последнего коммита.,TRANSLATED +restore_title_207,Looking into the past,Заглядывая в прошлое,TRANSLATED restore_description_208,"You've been working on your essay for a while. But you're not happy with the changes you've made recently. You want to go back to the version called ""Best version""! No problem, you can use the checkout card to restore your essay from an older commit!","Вы уже некоторое время работаете над своим эссе. Но вы недовольны недавними изменениями. Вы хотите вернуться к версии под названием ""Лучшая версия""! -Нет проблем, вы можете использовать карту checkout, чтобы восстановить свое эссе из более старого коммита!",, -restore_win_hint_209,"For nostalgic reasons, restore the very first backup you made!","Из ностальгических соображений восстановите самую первую резервную копию, которую вы сделали!",, -indexmv_title_210,Rename a file in the next commit,Переименовать файл в следующем коммите,, +Нет проблем, вы можете использовать карту checkout, чтобы восстановить свое эссе из более старого коммита!",TRANSLATED +restore_win_hint_209,"For nostalgic reasons, restore the very first backup you made!","Из ностальгических соображений восстановите самую первую резервную копию, которую вы сделали!",TRANSLATED +indexmv_title_210,Rename a file in the next commit,Переименовать файл в следующем коммите,TRANSLATED indexmv_description_211,"Other times, you might want to rename a file in the next commit. Use git mv [file] [new name] @@ -608,9 +602,9 @@ for that. The effect is very similar as if you had created a copy with a new nam git mv [файл] [новое имя] -для этого. Эффект очень похож на то, как если бы вы создали копию с новым именем и удалили старую версию.",, -indexmv_win_hint_212,"Make a commit where you rename the file b to ""x"".","Сделайте коммит, в котором вы переименовываете файл b в ""x"".",, -reflog_title_213,Go back to where you were before,"Вернуться туда, где вы были раньше",, +для этого. Эффект очень похож на то, как если бы вы создали копию с новым именем и удалили старую версию.",TRANSLATED +indexmv_win_hint_212,"Make a commit where you rename the file b to ""x"".","Сделайте коммит, в котором вы переименовываете файл b в ""x"".",TRANSLATED +reflog_title_213,Go back to where you were before,"Вернуться туда, где вы были раньше",TRANSLATED reflog_description_214,"Say you were looking at something in the past, and then switched back to the main branch. But then, you got reaaally distracted, and after your lunch break, you can't remember which past commit you were on before. How can you find out? @@ -623,11 +617,11 @@ There's a convenient command that shows you all the places your `HEAD` has point Есть удобная команда, которая показывает все места, на которые указывал ваш `HEAD` в прошлом: - git reflog",, -reflog_win_hint_215,"Find out where you've been before, and go back there!","Узнайте, где вы были раньше, и вернитесь туда!",, -pushedsomethingbroken_title_216,I pushed something broken,Я отправил что-то сломанное,, -pushedsomethingbroken_description_217,"We were talking about how to undo a commit, and fix it. This only helps when you haven't already pushed it to a remote. When that has happened, and you want to undo the effects of the commit completely, your best option is `git revert`","Мы говорили о том, как отменить коммит и исправить его. Это помогает только тогда, когда вы еще не отправили его на удаленный репозиторий. Когда это произошло, и вы хотите полностью отменить эффекты коммита, ваш лучший вариант — `git revert`",, -badcommit_title_218,Undo a bad commit,Отменить плохой коммит,, + git reflog",TRANSLATED +reflog_win_hint_215,"Find out where you've been before, and go back there!","Узнайте, где вы были раньше, и вернитесь туда!",TRANSLATED +pushedsomethingbroken_title_216,I pushed something broken,Я отправил что-то сломанное,TRANSLATED +pushedsomethingbroken_description_217,"We were talking about how to undo a commit, and fix it. This only helps when you haven't already pushed it to a remote. When that has happened, and you want to undo the effects of the commit completely, your best option is `git revert`","Мы говорили о том, как отменить коммит и исправить его. Это помогает только тогда, когда вы еще не отправили его на удаленный репозиторий. Когда это произошло, и вы хотите полностью отменить эффекты коммита, ваш лучший вариант — `git revert`",TRANSLATED +badcommit_title_218,Undo a bad commit,Отменить плохой коммит,TRANSLATED badcommit_description_219,"Oh no, we made a bad commit! How can we undo making the commit, and go back to a point where we can try again? The answer is using `git reset [commit]`, which does two things: @@ -644,25 +638,25 @@ It does not change your working directory in any way, which means that after tha И сбрасывает индекс к этому коммиту. -Это никак не изменяет ваш рабочий каталог, что означает, что после этого вы можете снова попытаться сделать нужный коммит.",, -badcommit_win_hint_220,"In the last main commit, the numbers file contains the numbers from 1 to 10.",В последнем коммите ветки main файл numbers содержит числа от 1 до 10.,, -badcommit_win_hint_221,"The commit message of that commit is ""More numbers"".","Сообщение этого коммита — ""Больше чисел"".",, -badcommit_win_hint_222,The commit with the typo is not part of the main branch anymore.,Коммит с опечаткой больше не является частью основной ветки.,, -restoreafilefromthepast_title_223,Restore a file from the past,Восстановить файл из прошлого,, +Это никак не изменяет ваш рабочий каталог, что означает, что после этого вы можете снова попытаться сделать нужный коммит.",TRANSLATED +badcommit_win_hint_220,"In the last main commit, the numbers file contains the numbers from 1 to 10.",В последнем коммите ветки main файл numbers содержит числа от 1 до 10.,TRANSLATED +badcommit_win_hint_221,"The commit message of that commit is ""More numbers"".","Сообщение этого коммита — ""Больше чисел"".",TRANSLATED +badcommit_win_hint_222,The commit with the typo is not part of the main branch anymore.,Коммит с опечаткой больше не является частью основной ветки.,TRANSLATED +restoreafilefromthepast_title_223,Restore a file from the past,Восстановить файл из прошлого,TRANSLATED restoreafilefromthepast_description_224,"Here's a similar problem: you really liked the essay from the very first commit, and want to have it back! Well, checkout can also restore things from older commits, Here's how: git checkout [commit] [file]","Вот похожая проблема: вам очень понравилось эссе из самого первого коммита, и вы хотите его вернуть! Что ж, checkout также может восстанавливать вещи из более старых коммитов. Вот как: - git checkout [коммит] [файл]",, -restoreafilefromthepast_win_hint_225,"Get the first version of your essay, and make a new commit with it.",Получите первую версию вашего эссе и сделайте с ней новый коммит.,, -restoreafile_title_226,Restore a deleted file,Восстановить удаленный файл,, + git checkout [коммит] [файл]",TRANSLATED +restoreafilefromthepast_win_hint_225,"Get the first version of your essay, and make a new commit with it.",Получите первую версию вашего эссе и сделайте с ней новый коммит.,TRANSLATED +restoreafile_title_226,Restore a deleted file,Восстановить удаленный файл,TRANSLATED restoreafile_description_227,"Oops - you deleted the ""essay"" file, which you worked on all night! Luckily, Git is here to help! You can use `git checkout` to restore the file!","Ой - вы удалили файл ""эссе"", над которым работали всю ночь! -К счастью, Git здесь, чтобы помочь! Вы можете использовать `git checkout`, чтобы восстановить файл!",, -restoreafile_win_hint_228,"Restore the essay to contain ""important content""","Восстановите эссе, чтобы оно содержало ""важное содержимое""",, -remotetag_title_229,Remote Tags,Удаленные теги,, +К счастью, Git здесь, чтобы помочь! Вы можете использовать `git checkout`, чтобы восстановить файл!",TRANSLATED +restoreafile_win_hint_228,"Restore the essay to contain ""important content""","Восстановите эссе, чтобы оно содержало ""важное содержимое""",TRANSLATED +remotetag_title_229,Remote Tags,Удаленные теги,TRANSLATED remotetag_description_230,"When you work with remote repositories, tags are not pushed or pulled automatically. You can push a tag with @@ -689,10 +683,10 @@ Add a tag named ""v2"" to the last commit and push it to the remote. Also pull t Вы также можете синхронизировать git fetch <удаленный_репозиторий> --prune --prune-tags -Добавьте тег с именем ""v2"" к последнему коммиту и отправьте его на удаленный репозиторий. Также загрузите тег v1 в свой локальный репозиторий.",, -remotetag_win_hint_231,v1 tag in your repo,тег v1 в вашем репозитории,, -remotetag_win_hint_232,v2 tag in your repo,тег v2 в вашем репозитории,, -addtaglater_title_233,Tagging later,Добавление тега позже,, +Добавьте тег с именем ""v2"" к последнему коммиту и отправьте его на удаленный репозиторий. Также загрузите тег v1 в свой локальный репозиторий.",TRANSLATED +remotetag_win_hint_231,v1 tag in your repo,тег v1 в вашем репозитории,TRANSLATED +remotetag_win_hint_232,v2 tag in your repo,тег v2 в вашем репозитории,TRANSLATED +addtaglater_title_233,Tagging later,Добавление тега позже,TRANSLATED addtaglater_description_234,"But what happens if you forgot to tag your current commit? No Prob! You can also tag older commits via @@ -717,10 +711,10 @@ tipp1 --- tipp2 --- -tipp3" -addtaglater_congrats_235,Well done :),Отлично :), -addtaglater_win_hint_236,Did you create a new tag?,Вы создали новый тег?, -removetag_title_237,Removing tags,Удаление тегов, +tipp3",TRANSLATED +addtaglater_congrats_235,Well done :),Отлично :),TRANSLATED +addtaglater_win_hint_236,Did you create a new tag?,Вы создали новый тег?,TRANSLATED +removetag_title_237,Removing tags,Удаление тегов,TRANSLATED removetag_description_238,"You added way too many tags? No prob! Delete them with git tag -d @@ -743,9 +737,9 @@ tipp1 --- tipp2 --- -tipp3",, -removetag_win_hint_239,Did you remove all tags?,Вы удалили все теги?,, -addtag_title_240,Creating tags,Создание тегов,, +tipp3",TRANSLATED +removetag_win_hint_239,Did you remove all tags?,Вы удалили все теги?,TRANSLATED +addtag_title_240,Creating tags,Создание тегов,TRANSLATED addtag_description_241,"Some of your commits may be special commits. Maybe you reached a milestone or a new version number. You can mark these commits with a special flag called 'tag'. @@ -762,20 +756,20 @@ to tag your commit.","Некоторые из ваших коммитов мог git tag <имя-тега> -чтобы пометить ваш коммит.",, -addtag_congrats_242,Nice! You tagged your first commit :),Отлично! Вы пометили свой первый коммит :),, -filesdelete_title_243,Unexpected Roommates,Неожиданные соседи по комнате,, +чтобы пометить ваш коммит.",TRANSLATED +addtag_congrats_242,Nice! You tagged your first commit :),Отлично! Вы пометили свой первый коммит :),TRANSLATED +filesdelete_title_243,Unexpected Roommates,Неожиданные соседи по комнате,TRANSLATED filesdelete_description_244,"The first day at Time Travel School comes to an end and you receive the key to your room. Full of excitement you open the door just to find... spider webs! Spider webs everywhere! Remove all the spider webs you can find with the remove card!","Первый день в Школе Путешествий во Времени подходит к концу, и вы получаете ключ от своей комнаты. Полные восторга, вы открываете дверь и обнаруживаете... паутину! Паутина повсюду! -Уберите всю паутину, которую сможете найти, с помощью карты удаления!",, -filesdelete_congrats_245,Your room looks now very tidy and cozy! Time to unpack your stuff!,Ваша комната теперь выглядит очень опрятной и уютной! Время распаковывать вещи!,, -filesdelete_win_hint_246,Remove all spider webs.,Уберите всю паутину.,, -filesdelete_win_hint_247,But make sure you keep your bed!,"Но убедитесь, что вы оставили свою кровать!", -filesadd_title_248,Interior design,Дизайн интерьера,, +Уберите всю паутину, которую сможете найти, с помощью карты удаления!",TRANSLATED +filesdelete_congrats_245,Your room looks now very tidy and cozy! Time to unpack your stuff!,Ваша комната теперь выглядит очень опрятной и уютной! Время распаковывать вещи!,TRANSLATED +filesdelete_win_hint_246,Remove all spider webs.,Уберите всю паутину.,TRANSLATED +filesdelete_win_hint_247,But make sure you keep your bed!,"Но убедитесь, что вы оставили свою кровать!",TRANSLATED +filesadd_title_248,Interior design,Дизайн интерьера,TRANSLATED filesadd_description_249,"Now that your room looks tidy, you can start to unpack your stuff. You brought two new pieces of furniture with you and with a bright smile, you see that their colors match the color of your bed! @@ -790,11 +784,11 @@ Don't forget to add a color and description to your new furnitures, too!","Те Затем назовите свою мебель - вы можете выбрать любое название. Убедитесь, что цвета совпадают! Цвет кровати вы можете найти в ее описании. -Не забудьте также добавить цвет и описание для вашей новой мебели!",, -filesadd_congrats_250,Don't you immediately feel more at home?,Разве вы не чувствуете себя сразу как дома?,, -filesadd_win_hint_251,Add two more pieces of furniture,Добавьте еще два предмета мебели,, -filesadd_win_hint_252,Make sure the colors match your bed's color.,"Убедитесь, что цвета соответствуют цвету вашей кровати.", -rebase_title_253,Rebasing,Перебазирование (Rebasing),, +Не забудьте также добавить цвет и описание для вашей новой мебели!",TRANSLATED +filesadd_congrats_250,Don't you immediately feel more at home?,Разве вы не чувствуете себя сразу как дома?,TRANSLATED +filesadd_win_hint_251,Add two more pieces of furniture,Добавьте еще два предмета мебели,TRANSLATED +filesadd_win_hint_252,Make sure the colors match your bed's color.,"Убедитесь, что цвета соответствуют цвету вашей кровати.",TRANSLATED +rebase_title_253,Rebasing,Перебазирование (Rebasing),TRANSLATED rebase_description_254,"Okay - turns out that saving time in the morning by utilizing parallel universes is against the regulations of the International Time Travel Association. You'll have to do your tasks in sequence after all. See the ""rebase"" card? When you drag it to a commit, it will copy the events in your current timeline after the specified one! This way, make a clean, linear timeline where you visit all three shops. @@ -803,14 +797,14 @@ Again, we want to make that our base reality - the ""main"" branch should point Видите карту ""rebase""? Когда вы перетаскиваете ее на коммит, она скопирует события из вашей текущей временной линии после указанного! Таким образом, создайте чистую, линейную временную линию, где вы посещаете все три магазина. -Опять же, мы хотим сделать это нашей базовой реальностью - ветка ""main"" должна указывать на эту временную линию!",, +Опять же, мы хотим сделать это нашей базовой реальностью - ветка ""main"" должна указывать на эту временную линию!",TRANSLATED rebase_congrats_255,"Notice how the other timelines and commits are still there - if anything goes wrong, you can also travel back to them. It's really hard to actually destroy stuff with your time machine.","Обратите внимание, как другие временные линии и коммиты все еще на месте - если что-то пойдет не так, вы также можете вернуться к ним. -На самом деле очень трудно уничтожить что-либо с помощью вашей машины времени.",, -rebase_win_hint_256,Order all tree branches into one and move the main branch ref,Упорядочите все ветви дерева в одну и переместите ссылку основной ветви,, -reorder_title_257,Reordering events,Изменение порядка событий,, +На самом деле очень трудно уничтожить что-либо с помощью вашей машины времени.",TRANSLATED +rebase_win_hint_256,Order all tree branches into one and move the main branch ref,Упорядочите все ветви дерева в одну и переместите ссылку основной ветви,TRANSLATED +reorder_title_257,Reordering events,Изменение порядка событий,TRANSLATED reorder_description_258,"Oops, looks like there's something messed up here. Can you put the events back into their correct order? There are two ways to do this: You can drag the ""interactive rebase"" card to the commit before the one you want to change, then reorder the lines in the file that opens, and save it. @@ -819,10 +813,10 @@ Or you can reset the main tag to the very first commit, and then cherry-pick sin Есть два способа сделать это: Вы можете перетащить карту ""interactive rebase"" на коммит перед тем, который вы хотите изменить, затем изменить порядок строк в открывшемся файле и сохранить его. -Или вы можете сбросить основной тег на самый первый коммит, а затем выбрать отдельные коммиты (`cherry-pick`) в нужном порядке. У вас есть карты для обоих подходов!",, -reorder_congrats_259,Feel free to reset the level and try the other strategy! Which one do you like better?,Не стесняйтесь сбросить уровень и попробовать другую стратегию! Какая вам нравится больше?,, -reorder_win_hint_260,Reorder the commits to dress yourself in the correct way,"Измените порядок коммитов, чтобы одеться правильно", -bisect_title_261,Yellow brick road,Дорога из желтого кирпича,, +Или вы можете сбросить основной тег на самый первый коммит, а затем выбрать отдельные коммиты (`cherry-pick`) в нужном порядке. У вас есть карты для обоих подходов!",TRANSLATED +reorder_congrats_259,Feel free to reset the level and try the other strategy! Which one do you like better?,Не стесняйтесь сбросить уровень и попробовать другую стратегию! Какая вам нравится больше?,TRANSLATED +reorder_win_hint_260,Reorder the commits to dress yourself in the correct way,"Измените порядок коммитов, чтобы одеться правильно",TRANSLATED +bisect_title_261,Yellow brick road,Дорога из желтого кирпича,TRANSLATED bisect_description_262,"(Please zoom out a bit using your mouse wheel! :D) Oh no! You have lost your key at some point during the day! @@ -839,19 +833,19 @@ After you've found the last good commit, reset the main branch to it. What happe Сначала сыграйте карту ""bisect start"". Затем перейдите к коммиту, где у вас нет ключа, и сыграйте карту ""bisect bad"". Аналогично, перейдите к раннему коммиту, где у вас есть ключ в кармане, и сыграйте карту ""bisect good"". -После того, как вы найдете последний хороший коммит, сбросьте основную ветку на него. Что случилось с ключом после того, как вы его потеряли?",, -bisect_congrats_263,"Well done! :) The only problem is that you now have to walk all the way back home, again...","Отлично! :) Единственная проблема в том, что теперь вам снова придется идти пешком до самого дома...",, -bisect_win_hint_264,Find the last good commit,Найдите последний хороший коммит,, -gitignore_title_265,Ignoring files,Игнорирование файлов,, +После того, как вы найдете последний хороший коммит, сбросьте основную ветку на него. Что случилось с ключом после того, как вы его потеряли?",TRANSLATED +bisect_congrats_263,"Well done! :) The only problem is that you now have to walk all the way back home, again...","Отлично! :) Единственная проблема в том, что теперь вам снова придется идти пешком до самого дома...",TRANSLATED +bisect_win_hint_264,Find the last good commit,Найдите последний хороший коммит,TRANSLATED +gitignore_title_265,Ignoring files,Игнорирование файлов,TRANSLATED gitignore_description_266,"That chicken is running around a lot, and changing often. We don't want to have it in our commits. Add it to the file .gitignore, and try using `git add .`!","Эта курица много бегает и часто меняется. Мы не хотим, чтобы она была в наших коммитах. -Добавьте ее в файл .gitignore и попробуйте использовать `git add .`!",, -pr_description_267,"Your friend has a problem! Clone the repo located in ../friend, create a branch called ""solution"", and fix the problem in this branch. When you're ready, make a ""Pull Request"" by using git tag pr.","У вашего друга проблема! Клонируйте репозиторий, находящийся в ../friend, создайте ветку с именем ""solution"" и исправьте проблему в этой ветке. Когда будете готовы, сделайте ""Pull Request"", используя git tag pr.",, -empty_title_268,Empty sandbox,Пустая песочница,, -empty_description_269,This is an empty sandbox you can play around in.,Это пустая песочница, в которой вы можете поиграть., -threecommits_title_270,Sandbox with three commits,Песочница с тремя коммитами,, +Добавьте ее в файл .gitignore и попробуйте использовать `git add .`!",TRANSLATED +pr_description_267,"Your friend has a problem! Clone the repo located in ../friend, create a branch called ""solution"", and fix the problem in this branch. When you're ready, make a ""Pull Request"" by using git tag pr.","У вашего друга проблема! Клонируйте репозиторий, находящийся в ../friend, создайте ветку с именем ""solution"" и исправьте проблему в этой ветке. Когда будете готовы, сделайте ""Pull Request"", используя git tag pr.",TRANSLATED +empty_title_268,Empty sandbox,Пустая песочница,TRANSLATED +empty_description_269,This is an empty sandbox you can play around in.,"Это пустая песочница, в которой вы можете поиграть.",TRANSLATED +threecommits_title_270,Sandbox with three commits,Песочница с тремя коммитами,TRANSLATED threecommits_description_271,"Here's a sandbox you can play around in. You can use both the playing cards, as well as the terminal. This is a real Git terminal! Fun things to try: @@ -868,13 +862,13 @@ Make a timeline that's completely independent of the rest!","Вот песочн Создать и удалить несколько тегов! -Создать временную линию, полностью независимую от остальных!",, -remote_title_272,Sandbox with a remote,Песочница с удаленным репозиторием,, +Создать временную линию, полностью независимую от остальных!",TRANSLATED +remote_title_272,Sandbox with a remote,Песочница с удаленным репозиторием,TRANSLATED remote_description_273,"Here's a sandbox with a remote! Try pulling, fetching, or pushing! How can you push tags and branches on a remote? How can you delete them again?","Вот песочница с удаленным репозиторием! Попробуйте pull, fetch или push! -Как можно отправлять теги и ветки на удаленный репозиторий? Как их можно снова удалить?",, +Как можно отправлять теги и ветки на удаленный репозиторий? Как их можно снова удалить?",TRANSLATED treenested_description_274,"Trees can also point to other trees! This way, they can describe nested directory structures. When you add a file inside of a directory to the index, and then call `git write-tree`, it will create a nested tree for the directory, and attach the blob to it. @@ -883,7 +877,7 @@ To solve this level, build a little stick figure, as shown on the left - a tree Когда вы добавляете файл внутри каталога в индекс, а затем вызываете `git write-tree`, это создаст вложенное дерево для каталога и прикрепит к нему блоб. -Чтобы решить этот уровень, постройте маленькую фигурку из палочек, как показано слева - дерево, которое указывает на два блоба, а также на дерево, которое указывает на два блоба.",, +Чтобы решить этот уровень, постройте маленькую фигурку из палочек, как показано слева - дерево, которое указывает на два блоба, а также на дерево, которое указывает на два блоба.",TRANSLATED indexupdate_description_275,"Instead of removing an entry from the index and adding one with the same name, you can also directly update that entry! Put the content you want in a file with a matching name, and then run @@ -900,8 +894,8 @@ Update an entry in the index!","Вместо удаления записи из Это создаст новый блоб и обновит хэш записи до этого блоба. -Обновите запись в индексе!",, -indexupdate_win_hint_276,This is not really a good test for the winning condition...,Это не очень хороший тест для условия победы...,, +Обновите запись в индексе!",TRANSLATED +indexupdate_win_hint_276,This is not really a good test for the winning condition...,Это не очень хороший тест для условия победы...,TRANSLATED indexremove_description_277,"To remove an entry from the index, use a command like this: git update-index --force-remove @@ -910,7 +904,7 @@ Remove all entries from the index!","Чтобы удалить запись из git update-index --force-remove <файл> -Удалите все записи из индекса!",, +Удалите все записи из индекса!",TRANSLATED commitcreate_description_278,"So a tree describes a directory structure at a specific point in time. It would be nice if we could remember when that state existed, and who authored it, right? @@ -927,7 +921,7 @@ Make a commit from the tree in this repository!","Итак, дерево опи git commit-tree <дерево> -m ""Описание вашего коммита"" -Сделайте коммит из дерева в этом репозитории!",, +Сделайте коммит из дерева в этом репозитории!",TRANSLATED treeread_description_279,"As soon as you have some tree objects, you can always read them and set the index exactly to their content! Unsurprisingly, the command is called git read-tree @@ -940,7 +934,7 @@ Try reading some of the trees in this repository into the index!","Как тол Для <дерева> вы можете указать хэш любого объекта-дерева - вы можете щелкнуть правой кнопкой мыши по одному из них, чтобы вставить его хэш в терминал! -Попробуйте прочитать некоторые из деревьев в этом репозитории в индекс!",, +Попробуйте прочитать некоторые из деревьев в этом репозитории в индекс!",TRANSLATED commitrhombus_description_280,"A commit can have multiple parents! You can specify the -p option multiple times, like this: git commit-tree -m ""Description"" -p -p @@ -949,8 +943,8 @@ Build a rhombus shape from commits, where two commits point to the same parent, git commit-tree <дерево> -m ""Описание"" -p <родитель1> -p <родитель2> -Постройте ромбовидную форму из коммитов, где два коммита указывают на одного и того же родителя, а затем четвертый коммит указывает на них обоих.",, -commitrhombus_win_hint_281,My first parent's parents has to be the same as my second parent's parent.,Родители моего первого родителя должны быть такими же, как родитель моего второго родителя., +Постройте ромбовидную форму из коммитов, где два коммита указывают на одного и того же родителя, а затем четвертый коммит указывает на них обоих.",TRANSLATED +commitrhombus_win_hint_281,My first parent's parents has to be the same as my second parent's parent.,"Родители моего первого родителя должны быть такими же, как родитель моего второго родителя.",TRANSLATED refmove_description_282,"You can point refs to a new location using the same command you use to create them: git update-ref refs/ @@ -959,7 +953,7 @@ As an exercise, make all refs in this repository point to the tree object!","В git update-ref refs/<имя_ссылки> <объект> -В качестве упражнения, сделайте так, чтобы все ссылки в этом репозитории указывали на объект-дерево!",, +В качестве упражнения, сделайте так, чтобы все ссылки в этом репозитории указывали на объект-дерево!",TRANSLATED blobremove_description_283,"There's a simple command to remove all objects that are not referenced by anything: git prune @@ -968,12 +962,12 @@ Remove all blobs in this repository.","Есть простая команда д git prune -Удалите все блобы в этом репозитории.",, +Удалите все блобы в этом репозитории.",TRANSLATED blobremove_congrats_284,"Generally, git prune will be useful if you want to clean up some objects you made. Alternatively, you can also click the ""Reload"" button to restart a level.","В общем, git prune будет полезен, если вы хотите очистить некоторые созданные вами объекты. -В качестве альтернативы вы также можете нажать кнопку ""Перезагрузить"", чтобы перезапустить уровень.",, +В качестве альтернативы вы также можете нажать кнопку ""Перезагрузить"", чтобы перезапустить уровень.",TRANSLATED symrefcreate_description_285,"Instead of pointing directly to objects, refs can also point to other refs! When that happens, they are called ""symbolic refs"". You can create or update a symbolic ref using @@ -986,7 +980,7 @@ Create a symbolic ref called ""refs/rainbow""!","Вместо того чтоб git symbolic-ref <имя> <ссылка> -Создайте символическую ссылку с именем ""refs/rainbow""!",, +Создайте символическую ссылку с именем ""refs/rainbow""!",TRANSLATED commitparents_description_286,"When using the commit-tree command, you can optionally specify a parent: git commit-tree -m ""Description"" -p @@ -999,7 +993,7 @@ Hint: You'll need a tree object. What could be the easiest way to obtain one?"," Создайте цепочку из трех коммитов! -Подсказка: Вам понадобится объект-дерево. Какой самый простой способ его получить?",, +Подсказка: Вам понадобится объект-дерево. Какой самый простой способ его получить?",TRANSLATED blobcreate_description_287,"At its core, Git is very simple. It stores ""objects"", which are basically files identified by an ""identifier"" (short: ID). There are four types of objects: blobs, trees, commits, and tags. The simplest type is a ""blob"", which is just a piece of text. @@ -1020,7 +1014,7 @@ Create three new blobs!","В своей основе Git очень прост. Флаг -w означает ""запись"" и указывает Git фактически записать новый блоб на диск. -Создайте три новых блоба!",, +Создайте три новых блоба!",TRANSLATED blobcreate_congrats_288,"Tip: You can also use a command like this to create a blob in a single line: echo ""awesome content"" | git hash-object -w --stdin @@ -1029,7 +1023,7 @@ Did you already notice that you can drag and drop all objects? :)","Совет: echo ""отличное содержимое"" | git hash-object -w --stdin -Вы уже заметили, что можете перетаскивать все объекты? :)",, +Вы уже заметили, что можете перетаскивать все объекты? :)",TRANSLATED treecreate_description_289,"After carefully building the index we want, it would be nice to save a permanent snapshot of it, right? This is what the second type of objects is for: trees! You can convert the index into a tree using @@ -1042,12 +1036,12 @@ Try it! :)","После того, как мы тщательно построи git write-tree -Попробуйте! :)",, +Попробуйте! :)",TRANSLATED treecreate_congrats_290,"Nice! Can you make a different tree? Modify the index, then call git write-tree again!","Отлично! -Можете ли вы создать другое дерево? Измените индекс, затем снова вызовите git write-tree!",, +Можете ли вы создать другое дерево? Измените индекс, затем снова вызовите git write-tree!",TRANSLATED welcome_description_291,"This is prototype #1 for the Git learning game by @bleeptrack and @blinry. Thanks for checking it out! <3 You can interact with the repository labelled ""yours"" by typing Bash commands in the terminal below! The visualization will show you its internal status. @@ -1060,7 +1054,7 @@ Let's get started by initializing an empty Git repository in the current directo Давайте начнем с инициализации пустого репозитория Git в текущем каталоге, набрав: - git init" + git init",TRANSLATED welcome_congrats_292,"Well done! An empty Git repository is... well, quite empty. The only thing that always exists is a reference called ""HEAD"" - we'll learn what that is later! @@ -1073,7 +1067,7 @@ But first, let's look at some basics! Но сначала давайте рассмотрим некоторые основы! -(Нажмите ""Следующий уровень"", как только будете готовы!)",, +(Нажмите ""Следующий уровень"", как только будете готовы!)",TRANSLATED basics_description_293,"For this prototype, we assume you have some experience with the command line. Here are some commands that will be useful: ls @@ -1094,13 +1088,13 @@ cat файл mkdir папка -Найдите загадку в вашем текущем каталоге и поместите ответ в файл ""answer""!",, +Найдите загадку в вашем текущем каталоге и поместите ответ в файл ""answer""!",TRANSLATED basics_congrats_294,"Omnomnom! For technical reasons, you can't use cd in this prototype yet. But there won't be a lot of interaction with the file system anyways. :)","Омномном! -По техническим причинам вы пока не можете использовать cd в этом прототипе. Но в любом случае взаимодействия с файловой системой будет немного. :)",, -puzzlepreciousblob_description_295,Create two trees pointing to the same blob!,"Создайте два дерева, указывающих на один и тот же блоб!", +По техническим причинам вы пока не можете использовать cd в этом прототипе. Но в любом случае взаимодействия с файловой системой будет немного. :)",TRANSLATED +puzzlepreciousblob_description_295,Create two trees pointing to the same blob!,"Создайте два дерева, указывающих на один и тот же блоб!",TRANSLATED indexadd_description_296,"Blobs usually represent the content of a file. But on their own, they don't have any metadata, not even a name! Git has a very powerful concept to store metadata related to blobs: the index! It's a list that relates blobs to filenames and access permissions. @@ -1119,7 +1113,7 @@ Add three entries to the index! For a bonus challenge: can you add a file that i echo ""мое содержимое"" > файл git update-index --add файл -Добавьте три записи в индекс! Для дополнительного задания: можете ли вы добавить файл, который находится внутри каталога, например, ""каталог/файл""?",, +Добавьте три записи в индекс! Для дополнительного задания: можете ли вы добавить файл, который находится внутри каталога, например, ""каталог/файл""?",TRANSLATED indexadd_congrats_297,"There's another way to add an entry to the index directly: git update-index --add --cacheinfo ,, @@ -1136,14 +1130,14 @@ You can insert the hash of an object into the terminal by right-clicking on it! Вторые три числа описывают права доступа. Поддерживаются только ""644"" (неисполняемый) и ""755"" (исполняемый). -Вы можете вставить хэш объекта в терминал, щелкнув по нему правой кнопкой мыши! :)",, +Вы можете вставить хэш объекта в терминал, щелкнув по нему правой кнопкой мыши! :)",TRANSLATED puzzletreesallthewaydown_description_298,"Construct a chain of three trees, which don't point to anything else. This is hard! The git mktree command might be useful.","Создайте цепочку из трех деревьев, которые не указывают ни на что другое. -Это сложно! Команда git mktree может быть полезна.",, -puzzletreesallthewaydown_win_hint_299,"So the tree has exactly one child, and it is a tree!","Итак, у дерева ровно один дочерний элемент, и это дерево!",, -puzzletreesallthewaydown_win_hint_300,Same for its child! \o/,То же самое для его дочернего элемента! \o/,, +Это сложно! Команда git mktree может быть полезна.",TRANSLATED +puzzletreesallthewaydown_win_hint_299,"So the tree has exactly one child, and it is a tree!","Итак, у дерева ровно один дочерний элемент, и это дерево!",TRANSLATED +puzzletreesallthewaydown_win_hint_300,Same for its child! \o/,То же самое для его дочернего элемента! \o/,TRANSLATED symrefnoderef_description_301,"When you have a symbolic ref (a ref pointing at another ref), and you decide you want it to be a regular ref again (pointing to an object), you're in for some trouble! :) What happens when you try pointing the symbolic ref directly to the blob using git update-ref? @@ -1156,7 +1150,7 @@ Weird, huh?","Когда у вас есть символическая ссыл Ой! Оказывается, когда вы ссылаетесь на символическую ссылку, она ведет себя так, как если бы вы указали ссылку, на которую она указывает. Чтобы ""де-символизировать"" ее, используйте опцию --no-deref сразу после update-ref! -Странно, да?",, +Странно, да?",TRANSLATED symrefnoderef_congrats_302,"Whew, we've covered a lot of things: Blobs! The index! Trees! Commits! Refs! You now know about almost everything about how Git repositories look like on the inside! We think that's pretty cool! :) @@ -1185,7 +1179,7 @@ Thanks for playing! You're welcome to check out the ""puzzle"" levels in the dro работа с локальными файлами (что, э-э, пожалуй, довольно важно :P) -Спасибо за игру! Вы можете ознакомиться с уровнями-""загадками"" в выпадающем списке, некоторые из них более продвинутые!",, +Спасибо за игру! Вы можете ознакомиться с уровнями-""загадками"" в выпадающем списке, некоторые из них более продвинутые!",TRANSLATED puzzleapocalypse_description_303,"Delete all objects in this repository using git commands only! Useful commands: @@ -1196,7 +1190,7 @@ Useful commands: Полезные команды: git prune - git reflog expire" + git reflog expire",TRANSLATED refremove_description_304,"And finally, to delete a ref, use git update-ref -d refs/ @@ -1205,7 +1199,7 @@ Delete all refs! :P (Well, except for HEAD. HEAD is special.)","И, наконе git update-ref -d refs/<имя_ссылки> -Удалите все ссылки! :P (Ну, кроме HEAD. HEAD - особенная.)",, +Удалите все ссылки! :P (Ну, кроме HEAD. HEAD - особенная.)",TRANSLATED refcreate_description_305,"Let's take a look at ""refs"" (short for ""references"")! Refs are not objects, but rather very simple pointers to objects! They can help you keep track of what's where. You can create or update a ref with @@ -1222,101 +1216,101 @@ Create refs that point to all objects in this repository!","Давайте по Убедитесь, что имя ссылки всегда начинается с ""refs/""! Это соглашение, которое помогает Git находить все созданные вами ссылки. Если вы забудете ""refs/"", вы не увидите ссылку. -Создайте ссылки, которые указывают на все объекты в этом репозитории!",, -problems_title_306,Problems,Проблемы,, -problems_description_307,"Both you and your friend have been working on the file, and want to sync up!","И вы, и ваш друг работали над файлом и хотите синхронизироваться!",, -problems_win_hint_308,Commit your local changes.,Закоммитьте ваши локальные изменения.,, -friend_title_309,Friend,Друг,, +Создайте ссылки, которые указывают на все объекты в этом репозитории!",TRANSLATED +problems_title_306,Problems,Проблемы,TRANSLATED +problems_description_307,"Both you and your friend have been working on the file, and want to sync up!","И вы, и ваш друг работали над файлом и хотите синхронизироваться!",TRANSLATED +problems_win_hint_308,Commit your local changes.,Закоммитьте ваши локальные изменения.,TRANSLATED +friend_title_309,Friend,Друг,TRANSLATED friend_description_310,"Your friend added another line to your essay! Get it, add a third one and send it to them! Take turns until you have five lines!","Ваш друг добавил еще одну строку в ваше эссе! Получите ее, добавьте третью и отправьте ему! -Делайте это по очереди, пока у вас не будет пяти строк!",, -friend_win_hint_311,Got the second line from your friend,Получил вторую строку от друга,, -friend_win_hint_312,Got the fourth line from your friend,Получил четвертую строку от друга,, +Делайте это по очереди, пока у вас не будет пяти строк!",TRANSLATED +friend_win_hint_311,Got the second line from your friend,Получил вторую строку от друга,TRANSLATED +friend_win_hint_312,Got the fourth line from your friend,Получил четвертую строку от друга,TRANSLATED card_init_desc_313,Drag this card into the empty space above to initialize the time machine!,Перетащите эту карту в пустое пространство выше, чтобы инициализировать машину времени!, -card_clone_desc_314,Create your own copy of someone else's repo.,Создайте свою собственную копию чужого репозитория.,, +card_clone_desc_314,Create your own copy of someone else's repo.,Создайте свою собственную копию чужого репозитория.,TRANSLATED card_configname_desc_315,"Set your name. (Will not change anything outside of this game.)","Установите свое имя. -(Ничего не изменит вне этой игры.)",, -card_configemail_desc_316,Set your email address.,Установите свой адрес электронной почты.,, -card_checkout_desc_317,Drag this card to a commit or to a branch to travel to it!,"Перетащите эту карту на коммит или на ветку, чтобы переместиться к ней!", -card_checkoutfile_desc_318,Reset changes in a local file.,Сбросить изменения в локальном файле.,, -card_checkoutfrom_desc_319,"Get the file contents from the specified commits, and reset both the working directory, as well as the index, to it.","Получить содержимое файла из указанных коммитов и сбросить к нему как рабочий каталог, так и индекс.",, +(Ничего не изменит вне этой игры.)",TRANSLATED +card_configemail_desc_316,Set your email address.,Установите свой адрес электронной почты.,TRANSLATED +card_checkout_desc_317,Drag this card to a commit or to a branch to travel to it!,"Перетащите эту карту на коммит или на ветку, чтобы переместиться к ней!",TRANSLATED +card_checkoutfile_desc_318,Reset changes in a local file.,Сбросить изменения в локальном файле.,TRANSLATED +card_checkoutfrom_desc_319,"Get the file contents from the specified commits, and reset both the working directory, as well as the index, to it.","Получить содержимое файла из указанных коммитов и сбросить к нему как рабочий каталог, так и индекс.",TRANSLATED card_commita_desc_320,"Make a new commit, after automatically adding all changes to the index. You'll be asked to enter a short description of what you changed.","Сделайте новый коммит, автоматически добавив все изменения в индекс. -Вас попросят ввести краткое описание того, что вы изменили.",, -card_commitauto_desc_321,Make a new commit containing your current environment! Type in a description of what changed!,Сделайте новый коммит, содержащий ваше текущее окружение! Введите описание того, что изменилось! -card_merge_desc_322,"Merge the specified timeline into yours. If necessary, will create a merge commit.",Слейте указанную временную линию в свою. При необходимости будет создан коммит слияния.,, -card_mergeabort_desc_323,"Abort the current merge attempt, and reconstruct the previous state.",Прервать текущую попытку слияния и восстановить предыдущее состояние.,, -card_rebase_desc_324,Put the events in your current timeline on top of the specified one.,Поместите события из вашей текущей временной линии поверх указанной.,, -card_pull_desc_325,"Get someone else's version of the current timeline, and try to merge it into yours.",Получите чужую версию текущей временной линии и попробуйте слить ее со своей.,, -card_fetch_desc_326,Get a someone else's version of the current timeline.,Получить чужую версию текущей временной линии.,, -card_push_desc_327,Give the current timeline to someone else.,Передайте текущую временную линию кому-нибудь еще.,, -card_rebaseinteractive_desc_328,"Make changes to the events in your current timeline, back to the commit you drag this to.","Внесите изменения в события вашей текущей временной линии, вплоть до коммита, на который вы перетащите это.",, -card_rebasecontinue_desc_329,Continue the current rebasing process.,Продолжить текущий процесс перебазирования.,, -card_resethard_desc_330,Move the branch you're on to the specified commit.,"Переместите ветку, на которой вы находитесь, к указанному коммиту." -card_reset_desc_331,"Jump to the commit, and update the index. Keep the current environment.",Перейти к коммиту и обновить индекс. Сохранить текущее окружение.,, -card_resetfile_desc_332,Reset the index version of a file to the version in the commit you're on.,"Сбросить версию файла в индексе до версии в коммите, на котором вы находитесь.", -card_cherrypick_desc_333,Repeat the specified action on top of your current timeline.,Повторите указанное действие поверх вашей текущей временной линии.,, -card_revert_desc_334,Make a new commit that reverts the changes of the specified commit.,"Создайте новый коммит, который отменяет изменения указанного коммита.", -card_bisectstart_desc_335,Start looking for the commit where things got bad.,"Начать поиск коммита, в котором все пошло не так.", -card_bisectgood_desc_336,"State that the current commit is good! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит хороший! Когда вас автоматически перенесут, продолжайте играть картами good и bad!",, -card_bisectbad_desc_337,"State that the current commit is bad! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит плохой! Когда вас автоматически перенесут, продолжайте играть картами good и bad!",, -card_add_desc_338,Update the index version of the file to its current real content.,Обновите версию файла в индексе до его текущего реального содержимого.,, -card_rm_desc_339,"Delete a file both in the working directory, as well as the index.","Удалить файл как в рабочем каталоге, так и в индексе.",, -card_commit_desc_340,Make a commit from the current index.,Сделать коммит из текущего индекса.,, -card_show_desc_341,Show what changed in the commit.,"Показать, что изменилось в коммите.", -card_branch_desc_342,Create a new branch at your current location.,Создать новую ветку в вашем текущем местоположении.,, -card_branchdelete_desc_343,Delete a branch.,Удалить ветку.,, -card_reflog_desc_344,Display a log of where the ref pointed to in the past.,"Отобразить журнал того, куда указывала ссылка в прошлом.", -card_filenew_desc_345,Create a new file.,Создать новый файл.,, -card_filedelete_desc_346,Delete a file.,Удалить файл.,, -card_filerename_desc_347,Rename a file.,Переименовать файл.,, -card_filecopy_desc_348,Make a copy of a file.,Сделать копию файла.,, -cli_remote_001,"To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice.","Чтобы вернуться к старым командам, вы можете нажимать стрелки вверх и вниз. Таким образом, вам не придется дважды вводить длинные команды.",, -cli_commit_002,"Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below!","Опять же, вместо использования карты, вы также можете вводить команды, напечатанные на ней, в черный терминал ниже!",, -cli_commit_003,This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :),Это совершенно необязательно! Но это будет суперполезный навык в реальном мире - и он даст вам сверкающий золотой значок! :),, -cli_cli_004,But there's another way to interact with Git:,Но есть и другой способ взаимодействия с Git:,, -cli_cli_005,"Try typing git init into the black terminal below, and pressing the enter key!",Попробуйте набрать git init в черном терминале ниже и нажать клавишу Enter!,, -cli_new_006,"You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time!","Вы можете использовать автодополнение по Tab в терминале! Начните вводить имя файла, затем нажмите клавишу Tab, чтобы дополнить его имя. Это часто сэкономит вам время!",, -cli_grow_007,"To travel to a branch, type `git checkout name_of_the_branch`","Чтобы переместиться на ветку, введите `git checkout имя_ветки`",, -cli_grow_008,"And to travel to the last commit, type `git checkout --detach name_of_the_branch`","А чтобы переместиться к последнему коммиту, введите `git checkout --detach имя_ветки`.",, -cli_branchcreate_009,"Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called ""birthday"", you can type `git checkout birthday` to travel to it!","Ветки также значительно упрощают перемещение между разными местами с помощью командной строки! Как только у вас появится ветка с именем ""birthday"", вы сможете набрать `git checkout birthday`, чтобы переместиться на нее!",, -cli_fork_010,"The blue animal represents a concept known as the ""HEAD pointer"" in Git: It shows you which commit is the current one.","Синее животное представляет собой концепцию, известную в Git как ""указатель HEAD"": он показывает вам, какой коммит является текущим.",, -cli_fork_011,Here's a cool trick to go to the previous commit:,"Вот крутой трюк, чтобы перейти к предыдущему коммиту:",, -cli_fork_012,`git checkout HEAD^`,`git checkout HEAD^`,, -cli_fork_013,"You can also go back two commits by typing, for example:","Вы также можете вернуться на два коммита назад, набрав, например:",, -cli_fork_014,`git checkout HEAD~2`,`git checkout HEAD~2`,, -cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want!","Чтобы переключиться на определенный коммит, введите `git checkout`, затем пробел, а затем щелкните правой кнопкой мыши по нужному коммиту!",, -cli_checkoutcommit_016,This will insert the commit's unique identifier!,Это вставит уникальный идентификатор коммита!,, -cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:","В командной строке вы можете легко удалить все файлы, заканчивающиеся на -web, с помощью этой команды:",, -cli_filesdelete_018, `rm *web`, `rm *web`,, -chapter_intro,Introduction,Введение,, -chapter_files,Files,Файлы,, -chapter_branches,Branches,Ветви,, -chapter_merge,Merging,Слияние,, -chapter_index,The Index,Индекс,, -chapter_remotes,Remotes,Удалённые репозитории,, -chapter_changing-the-past,Changing the Past,Изменение прошлого,, -chapter_shit-happens,When Things Go Wrong,Когда всё идёт не так,, -chapter_workflows,Workflows,Рабочие процессы,, -chapter_bisect,Bisect,Поиск ошибки (Bisect),, -chapter_stash,Stash,Тайник (Stash),, -chapter_tags,Tags,Метки,, -chapter_sandbox,Sandbox,Песочница,, -new_win_hint_085,Make a change to the candle.,Измените свечу.,, -change_win_060," Good! The index is sometimes also called the ""staging area"" - it contains exactly what ends up in the next commit when you use `git commit`!","Отлично! Индекс также иногда называют ""областью подготовки"" (staging area) — он содержит именно то, что попадёт в следующий коммит, когда вы используете `git commit`!" -friend_win_hint_313,The friend got a third line from you,Друг получил от тебя третью строку,, -friend_win_hint_314,The friend got a fifth line from you,Друг получил от тебя пятую строку,, -problems_win_hint_309,"Look at your friend's suggestion, make a compromise, and push it back.","Посмотри на предложение твоего друга, найди компромисс и отправь его обратно.",, -pushed_win_hint_1,The team's main branch no longer contains the bad thing.,Командная ветка main больше не содержит плохой вещи. -pushed_win_hint_2,And the history has not been modified.,И история не была изменена. -default_win_desc_key,Complete the goal of this level,Выполните цель этого уровня -remote_tag_win_hint_1,v2 tag in the remote,тег v2 в удалённом репозитории -remote_win_hint_134,And use `git push` to send it to your teacher!,Используй `git push` и отправь это своему учителю! +Вас попросят ввести краткое описание того, что вы изменили.",TRANSLATED +card_commitauto_desc_321,Make a new commit containing your current environment! Type in a description of what changed!,"Сделайте новый коммит, содержащий ваше текущее окружение! Введите описание того, что изменилось!",TRANSLATED +card_merge_desc_322,"Merge the specified timeline into yours. If necessary, will create a merge commit.",Слейте указанную временную линию в свою. При необходимости будет создан коммит слияния.,TRANSLATED +card_mergeabort_desc_323,"Abort the current merge attempt, and reconstruct the previous state.",Прервать текущую попытку слияния и восстановить предыдущее состояние.,TRANSLATED +card_rebase_desc_324,Put the events in your current timeline on top of the specified one.,Поместите события из вашей текущей временной линии поверх указанной.,TRANSLATED +card_pull_desc_325,"Get someone else's version of the current timeline, and try to merge it into yours.",Получите чужую версию текущей временной линии и попробуйте слить ее со своей.,TRANSLATED +card_fetch_desc_326,Get a someone else's version of the current timeline.,Получить чужую версию текущей временной линии.,TRANSLATED +card_push_desc_327,Give the current timeline to someone else.,Передайте текущую временную линию кому-нибудь еще.,TRANSLATED +card_rebaseinteractive_desc_328,"Make changes to the events in your current timeline, back to the commit you drag this to.","Внесите изменения в события вашей текущей временной линии, вплоть до коммита, на который вы перетащите это.",TRANSLATED +card_rebasecontinue_desc_329,Continue the current rebasing process.,Продолжить текущий процесс перебазирования.,TRANSLATED +card_resethard_desc_330,Move the branch you're on to the specified commit.,"Переместите ветку, на которой вы находитесь, к указанному коммиту.",TRANSLATED +card_reset_desc_331,"Jump to the commit, and update the index. Keep the current environment.",Перейти к коммиту и обновить индекс. Сохранить текущее окружение.,TRANSLATED +card_resetfile_desc_332,Reset the index version of a file to the version in the commit you're on.,"Сбросить версию файла в индексе до версии в коммите, на котором вы находитесь.",TRANSLATED +card_cherrypick_desc_333,Repeat the specified action on top of your current timeline.,Повторите указанное действие поверх вашей текущей временной линии.,TRANSLATED +card_revert_desc_334,Make a new commit that reverts the changes of the specified commit.,"Создайте новый коммит, который отменяет изменения указанного коммита.",TRANSLATED +card_bisectstart_desc_335,Start looking for the commit where things got bad.,"Начать поиск коммита, в котором все пошло не так.",TRANSLATED +card_bisectgood_desc_336,"State that the current commit is good! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит хороший! Когда вас автоматически перенесут, продолжайте играть картами good и bad!",TRANSLATED +card_bisectbad_desc_337,"State that the current commit is bad! When you're automatically transferred, keep playing the good and bad cards!","Укажите, что текущий коммит плохой! Когда вас автоматически перенесут, продолжайте играть картами good и bad!",TRANSLATED +card_add_desc_338,Update the index version of the file to its current real content.,Обновите версию файла в индексе до его текущего реального содержимого.,TRANSLATED +card_rm_desc_339,"Delete a file both in the working directory, as well as the index.","Удалить файл как в рабочем каталоге, так и в индексе.",TRANSLATED +card_commit_desc_340,Make a commit from the current index.,Сделать коммит из текущего индекса.,TRANSLATED +card_show_desc_341,Show what changed in the commit.,"Показать, что изменилось в коммите.",TRANSLATED +card_branch_desc_342,Create a new branch at your current location.,Создать новую ветку в вашем текущем местоположении.,TRANSLATED +card_branchdelete_desc_343,Delete a branch.,Удалить ветку.,TRANSLATED +card_reflog_desc_344,Display a log of where the ref pointed to in the past.,"Отобразить журнал того, куда указывала ссылка в прошлом.",TRANSLATED +card_filenew_desc_345,Create a new file.,Создать новый файл.,TRANSLATED +card_filedelete_desc_346,Delete a file.,Удалить файл.,TRANSLATED +card_filerename_desc_347,Rename a file.,Переименовать файл.,TRANSLATED +card_filecopy_desc_348,Make a copy of a file.,Сделать копию файла.,TRANSLATED +cli_remote_001,"To go back to old commands, you can press arrow up and down. That way, you don't have to type in long commands twice.","Чтобы вернуться к старым командам, вы можете нажимать стрелки вверх и вниз. Таким образом, вам не придется дважды вводить длинные команды.",TRANSLATED +cli_commit_002,"Again, instead of using the card, you can also type the commands which are printed on it into the black terminal below!","Опять же, вместо использования карты, вы также можете вводить команды, напечатанные на ней, в черный терминал ниже!",TRANSLATED +cli_commit_003,This is totally optional! But this will be a super useful skill in the real world - and it will give you a sparkling golden badge! :),Это совершенно необязательно! Но это будет суперполезный навык в реальном мире - и он даст вам сверкающий золотой значок! :),TRANSLATED +cli_cli_004,But there's another way to interact with Git:,Но есть и другой способ взаимодействия с Git:,TRANSLATED +cli_cli_005,"Try typing git init into the black terminal below, and pressing the enter key!",Попробуйте набрать git init в черном терминале ниже и нажать клавишу Enter!,TRANSLATED +cli_new_006,"You can use tab completion in the terminal! Start typing a filename, then press the tab key to complete its name. This will often save you some time!","Вы можете использовать автодополнение по Tab в терминале! Начните вводить имя файла, затем нажмите клавишу Tab, чтобы дополнить его имя. Это часто сэкономит вам время!",TRANSLATED +cli_grow_007,"To travel to a branch, type `git checkout name_of_the_branch`","Чтобы переместиться на ветку, введите `git checkout имя_ветки`",TRANSLATED +cli_grow_008,"And to travel to the last commit, type `git checkout --detach name_of_the_branch`","А чтобы переместиться к последнему коммиту, введите `git checkout --detach имя_ветки`.",TRANSLATED +cli_branchcreate_009,"Branches also make it really easy to travel between different places using the command line! As soon as you have a branch called ""birthday"", you can type `git checkout birthday` to travel to it!","Ветки также значительно упрощают перемещение между разными местами с помощью командной строки! Как только у вас появится ветка с именем ""birthday"", вы сможете набрать `git checkout birthday`, чтобы переместиться на нее!",TRANSLATED +cli_fork_010,"The blue animal represents a concept known as the ""HEAD pointer"" in Git: It shows you which commit is the current one.","Синее животное представляет собой концепцию, известную в Git как ""указатель HEAD"": он показывает вам, какой коммит является текущим.",TRANSLATED +cli_fork_011,Here's a cool trick to go to the previous commit:,"Вот крутой трюк, чтобы перейти к предыдущему коммиту:",TRANSLATED +cli_fork_012,`git checkout HEAD^`,`git checkout HEAD^`,TRANSLATED +cli_fork_013,"You can also go back two commits by typing, for example:","Вы также можете вернуться на два коммита назад, набрав, например:",TRANSLATED +cli_fork_014,`git checkout HEAD~2`,`git checkout HEAD~2`,TRANSLATED +cli_checkoutcommit_015,"To checkout a specific commit, type `git checkout`, then a space, and then right click on the commit you want!","Чтобы переключиться на определенный коммит, введите `git checkout`, затем пробел, а затем щелкните правой кнопкой мыши по нужному коммиту!",TRANSLATED +cli_checkoutcommit_016,This will insert the commit's unique identifier!,Это вставит уникальный идентификатор коммита!,TRANSLATED +cli_filesdelete_017,"On the command line, you can easily delete all files ending in -web using this command:","В командной строке вы можете легко удалить все файлы, заканчивающиеся на -web, с помощью этой команды:",TRANSLATED +cli_filesdelete_018, `rm *web`, `rm *web`,TRANSLATED +chapter_intro,Introduction,Введение,TRANSLATED +chapter_files,Files,Файлы,TRANSLATED +chapter_branches,Branches,Ветви,TRANSLATED +chapter_merge,Merging,Слияние,TRANSLATED +chapter_index,The Index,Индекс,TRANSLATED +chapter_remotes,Remotes,Удалённые репозитории,TRANSLATED +chapter_changing-the-past,Changing the Past,Изменение прошлого,TRANSLATED +chapter_shit-happens,When Things Go Wrong,Когда всё идёт не так,TRANSLATED +chapter_workflows,Workflows,Рабочие процессы,TRANSLATED +chapter_bisect,Bisect,Поиск ошибки (Bisect),TRANSLATED +chapter_stash,Stash,Тайник (Stash),TRANSLATED +chapter_tags,Tags,Метки,TRANSLATED +chapter_sandbox,Sandbox,Песочница,TRANSLATED +new_win_hint_085,Make a change to the candle.,Измените свечу.,TRANSLATED +change_win_060," Good! The index is sometimes also called the ""staging area"" - it contains exactly what ends up in the next commit when you use `git commit`!","Отлично! Индекс также иногда называют ""областью подготовки"" (staging area) — он содержит именно то, что попадёт в следующий коммит, когда вы используете `git commit`!",TRANSLATED +friend_win_hint_313,The friend got a third line from you,Друг получил от тебя третью строку,TRANSLATED +friend_win_hint_314,The friend got a fifth line from you,Друг получил от тебя пятую строку,TRANSLATED +problems_win_hint_309,"Look at your friend's suggestion, make a compromise, and push it back.","Посмотри на предложение твоего друга, найди компромисс и отправь его обратно.",TRANSLATED +pushed_win_hint_1,The team's main branch no longer contains the bad thing.,Командная ветка main больше не содержит плохой вещи.,TRANSLATED +pushed_win_hint_2,And the history has not been modified.,И история не была изменена.,TRANSLATED +default_win_desc_key,Complete the goal of this level,Выполните цель этого уровня,TRANSLATED +remote_tag_win_hint_1,v2 tag in the remote,тег v2 в удалённом репозитории,TRANSLATED +remote_win_hint_134,And use `git push` to send it to your teacher!,Используй `git push` и отправь это своему учителю!,TRANSLATED setup_auto_001,"You do not have a baguette. You do not have coffee. @@ -1325,7 +1319,7 @@ You do not have a donut.","У вас нет багета. У вас нет кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_002,"You have a baguette. You do not have coffee. @@ -1334,7 +1328,7 @@ You do not have a donut.","У вас есть багет. У вас нет кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_003,"You ate a baguette. You do not have coffee. @@ -1343,7 +1337,7 @@ You do not have a donut.","Вы съели багет. У вас нет кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_004,"You do not have a baguette. You have coffee. @@ -1352,7 +1346,7 @@ You do not have a donut.","У вас нет багета. У вас есть кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_005,"You do not have a baguette. You drank coffee. @@ -1361,7 +1355,7 @@ You do not have a donut.","У вас нет багета. Вы выпили кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_006,"You do not have a baguette. You do not have coffee. @@ -1370,7 +1364,7 @@ You have a donut.","У вас нет багета. У вас нет кофе. -У вас есть пончик." +У вас есть пончик.",TRANSLATED setup_auto_007,"You do not have a baguette. You do not have coffee. @@ -1379,168 +1373,168 @@ You ate a donut.","У вас нет багета. У вас нет кофе. -Вы съели пончик." -setup_auto_008,A new day is starting,Начинается новый день -setup_auto_009,Walking down the Main Lane.,Прогулка по Основной линии. -setup_auto_010,Walking down the Side Lane.,Прогулка по Боковой линии. -setup_auto_011,Just woke up. Is hungry.,Только проснулся. Голоден. -setup_auto_012,Had blueberry pancakes with maple syrup for breakfast.,На завтрак были блины с черникой и кленовым сиропом. +Вы съели пончик.",TRANSLATED +setup_auto_008,A new day is starting,Начинается новый день,TRANSLATED +setup_auto_009,Walking down the Main Lane.,Прогулка по Основной линии.,TRANSLATED +setup_auto_010,Walking down the Side Lane.,Прогулка по Боковой линии.,TRANSLATED +setup_auto_011,Just woke up. Is hungry.,Только проснулся. Голоден.,TRANSLATED +setup_auto_012,Had blueberry pancakes with maple syrup for breakfast.,На завтрак были блины с черникой и кленовым сиропом.,TRANSLATED setup_auto_013," Is at work."," -На работе." -setup_auto_014,Had muesli with oats and strawberries for breakfast.,На завтрак были мюсли с овсянкой и клубникой. +На работе.",TRANSLATED +setup_auto_014,Had muesli with oats and strawberries for breakfast.,На завтрак были мюсли с овсянкой и клубникой.,TRANSLATED setup_auto_015," Is at work."," -На работе." -setup_auto_016,~ List of current students ~,~ Список текущих студентов ~ +На работе.",TRANSLATED +setup_auto_016,~ List of current students ~,~ Список текущих студентов ~,TRANSLATED setup_auto_017," - Sam - Alex"," - Сэм -- Алекс" -setup_auto_018,The glass is full of water.,Стакан полон воды. +- Алекс",TRANSLATED +setup_auto_018,The glass is full of water.,Стакан полон воды.,TRANSLATED setup_auto_019,"~ Why I want to learn Git ~ - So that I can undo mistakes - To track my projects over time","~ Почему я хочу изучить Git ~ - Чтобы я мог отменять ошибки -- Чтобы отслеживать свои проекты со временем" -setup_auto_020,"""~ Why do you want to learn how to use time machines? ~""","""~ Почему вы хотите научиться пользоваться машинами времени? ~""" +- Чтобы отслеживать свои проекты со временем",TRANSLATED +setup_auto_020,"""~ Why do you want to learn how to use time machines? ~""","""~ Почему вы хотите научиться пользоваться машинами времени? ~""",TRANSLATED setup_auto_021,"~ Why I want to learn Git ~ (I still need to write this.)","~ Почему я хочу изучить Git ~ -(Мне еще нужно это написать.)" +(Мне еще нужно это написать.)",TRANSLATED setup_auto_022,"~ Why I want to learn Git ~ - So that I can undo mistakes","~ Почему я хочу изучить Git ~ -- Чтобы я мог отменять ошибки" +- Чтобы я мог отменять ошибки",TRANSLATED setup_auto_023,"~ Why I want to learn Git ~ - So that I can undo mistakes - To track my projects over time","~ Почему я хочу изучить Git ~ - Чтобы я мог отменять ошибки -- Чтобы отслеживать свои проекты со временем" -setup_auto_024,The candle is burning with a blue flame.,Свеча горит синим пламенем. -setup_auto_025,"A small, but heavy glass ball.","Маленький, но тяжелый стеклянный шар." -setup_auto_026,"A thin book, that's standing upright.","Тонкая книга, которая стоит вертикально." -setup_auto_027,"A candle, burning with a blue flame.","Свеча, горящая синим пламенем." -setup_auto_028,A smoke detector. It's absolutely silent.,Детектор дыма. Он абсолютно бесшумен. -setup_auto_029,The ball is now touching the book.,Шар теперь касается книги. -setup_auto_030,The book has fallen over.,Книга упала. -setup_auto_031,The candle has been blown out.,Свечу задули. -setup_auto_032,The ball is now touching the book.,Шар теперь касается книги. -setup_auto_033,The book has fallen over.,Книга упала. -setup_auto_034,The candle has been blown out.,Свечу задули. -setup_auto_035,"A hammer, balancing on its handle.","Молоток, балансирующий на рукоятке." -setup_auto_036,"A bottle, containing a clear liquid.","Бутылка с прозрачной жидкостью." -setup_auto_037,A white sugar cube.,Белый кубик сахара. -setup_auto_038,The candle is burning with a blue flame.,Свеча горит синим пламенем. -setup_auto_039,It's burning!,Она горит! -setup_auto_040,It's burning!,Она горит! -setup_auto_041,It's burning!,Она горит! -setup_auto_042,It's been blown out.,Ее задули. -setup_auto_043,It's been blown out.,Ее задули. -setup_auto_044,It's been blown out.,Ее задули. -setup_auto_045,Initial version,Начальная версия -setup_auto_046,Improved version,Улучшенная версия -setup_auto_047,Best version,Лучшая версия -setup_auto_048,Less-good version,Менее удачная версия -setup_auto_049,The bikeshed should be ???,Велосипедный сарай должен быть ??? -setup_auto_050,The bikeshed should be green,Велосипедный сарай должен быть зеленым -setup_auto_051,The bikeshed should be blue,Велосипедный сарай должен быть синим -setup_auto_052,I'm really committed to our friendship! <3,Я очень предан нашей дружбе! <3 +- Чтобы отслеживать свои проекты со временем",TRANSLATED +setup_auto_024,The candle is burning with a blue flame.,Свеча горит синим пламенем.,TRANSLATED +setup_auto_025,"A small, but heavy glass ball.","Маленький, но тяжелый стеклянный шар.",TRANSLATED +setup_auto_026,"A thin book, that's standing upright.","Тонкая книга, которая стоит вертикально.",TRANSLATED +setup_auto_027,"A candle, burning with a blue flame.","Свеча, горящая синим пламенем.",TRANSLATED +setup_auto_028,A smoke detector. It's absolutely silent.,Детектор дыма. Он абсолютно бесшумен.,TRANSLATED +setup_auto_029,The ball is now touching the book.,Шар теперь касается книги.,TRANSLATED +setup_auto_030,The book has fallen over.,Книга упала.,TRANSLATED +setup_auto_031,The candle has been blown out.,Свечу задули.,TRANSLATED +setup_auto_032,The ball is now touching the book.,Шар теперь касается книги.,TRANSLATED +setup_auto_033,The book has fallen over.,Книга упала.,TRANSLATED +setup_auto_034,The candle has been blown out.,Свечу задули.,TRANSLATED +setup_auto_035,"A hammer, balancing on its handle.","Молоток, балансирующий на рукоятке.",TRANSLATED +setup_auto_036,"A bottle, containing a clear liquid.",Бутылка с прозрачной жидкостью.,TRANSLATED +setup_auto_037,A white sugar cube.,Белый кубик сахара.,TRANSLATED +setup_auto_038,The candle is burning with a blue flame.,Свеча горит синим пламенем.,TRANSLATED +setup_auto_039,It's burning!,Она горит!,TRANSLATED +setup_auto_040,It's burning!,Она горит!,TRANSLATED +setup_auto_041,It's burning!,Она горит!,TRANSLATED +setup_auto_042,It's been blown out.,Ее задули.,TRANSLATED +setup_auto_043,It's been blown out.,Ее задули.,TRANSLATED +setup_auto_044,It's been blown out.,Ее задули.,TRANSLATED +setup_auto_045,Initial version,Начальная версия,TRANSLATED +setup_auto_046,Improved version,Улучшенная версия,TRANSLATED +setup_auto_047,Best version,Лучшая версия,TRANSLATED +setup_auto_048,Less-good version,Менее удачная версия,TRANSLATED +setup_auto_049,The bikeshed should be ???,Велосипедный сарай должен быть ???,TRANSLATED +setup_auto_050,The bikeshed should be green,Велосипедный сарай должен быть зеленым,TRANSLATED +setup_auto_051,The bikeshed should be blue,Велосипедный сарай должен быть синим,TRANSLATED +setup_auto_052,I'm really committed to our friendship! <3,Я очень предан нашей дружбе! <3,TRANSLATED setup_auto_053,"blarg blaaaargh","блаарг -блааааргх" -setup_auto_054,A yellow cupboard with lots of drawers.,Желтый шкаф с множеством ящиков. -setup_auto_055,A really big yellow shelf.,Очень большая желтая полка. -setup_auto_056,"A comfortable, yellow bed with yellow cushions.","Удобная, желтая кровать с желтыми подушками." -setup_auto_057,something,что-то -setup_auto_058,something else,что-то еще -setup_auto_059,this should happen first,это должно произойти сначала -setup_auto_060,and this should happen after that,а это должно произойти после -setup_auto_061,something,что-то -setup_auto_062,something else,что-то еще -setup_auto_063,this should happen first,это должно произойти сначала -setup_auto_064,and this should happen after that,а это должно произойти после -setup_auto_065,this is some other change,это какое-то другое изменение -setup_auto_066,this is some other change,это какое-то другое изменение -setup_auto_067,SPECIAL,ОСОБЕННЫЙ -setup_auto_068,Just woke up. Is hungry.,Только проснулся. Голоден. -setup_auto_069,Had blueberry pancakes with maple syrup for breakfast.,На завтрак были блины с черникой и кленовым сиропом. -setup_auto_070,Had muesli with oats and strawberries for breakfast.,На завтрак были мюсли с овсянкой и клубникой. -setup_auto_071,Had pancakes with strawberries for breakfast.,На завтрак были блины с клубникой. -setup_auto_072,I am precious,Я драгоценный -setup_auto_073,hello,привет -setup_auto_074,world,мир -setup_auto_075,hello,привет -setup_auto_076,world,мир -setup_auto_077,ppl p,ppl p -setup_auto_078,ae ie,ae ie -setup_auto_079,file 1,файл 1 -setup_auto_080,file 2,файл 2 -setup_auto_081,file 3,файл 3 -setup_auto_082,file 1,файл 1 -setup_auto_083,file 2,файл 2 -setup_auto_084,file 3,файл 3 -setup_auto_085,file 1,файл 1 -setup_auto_086,file 2,файл 2 -setup_auto_087,file 3,файл 3 -setup_auto_090,file 1,файл 1 -setup_auto_091,file 2,файл 2 -setup_auto_092,file 3,файл 3 -setup_auto_093,file 1,файл 1 -setup_auto_094,file 2,файл 2 -setup_auto_095,file 3,файл 3 -setup_auto_096,new content,новое содержимое -setup_auto_097,hello,привет -setup_auto_098,world,мир -setup_auto_099,hello,привет -setup_auto_100,world,мир -setup_auto_102,file 1,файл 1 -setup_auto_103,file 2,файл 2 -setup_auto_104,file A,файл A -setup_auto_105,file B,файл B -setup_auto_106,file C,файл C -setup_auto_107,file 1,файл 1 -setup_auto_108,file 2,файл 2 -setup_auto_109,file A,файл A -setup_auto_110,file B,файл B -setup_auto_111,file C,файл C -setup_auto_112,My master password is a1b2c3d4e5,Мой мастер-пароль a1b2c3d4e5 -setup_auto_113,This blob really should not exist,Этого blob действительно не должно существовать -setup_auto_114,This is a virus,Это вирус -setup_auto_115,blabber,болтовня -setup_auto_116,blabber,болтовня -setup_auto_117,file 1,файл 1 -setup_auto_118,file 2,файл 2 -setup_auto_119,file 3,файл 3 -setup_auto_120,file 1,файл 1 -setup_auto_121,file 2,файл 2 -setup_auto_122,file 3,файл 3 -setup_auto_123,hello,привет -setup_auto_124,world,мир -setup_auto_125,hello,привет -setup_auto_126,world,мир -setup_auto_127,I'm the left arm,Я левая рука -setup_auto_128,I'm the right arm,Я правая рука -setup_auto_129,I'm the left leg,Я левая нога -setup_auto_130,I'm the right leg,Я правая нога -setup_auto_131,event 1,событие 1 -setup_auto_132,event 2,событие 2 -setup_auto_133,event 3,событие 3 -setup_auto_134,event 1,событие 1 -setup_auto_135,event 2,событие 2 -setup_auto_136,event 3,событие 3 -setup_auto_137,toothbrush sharing,совместное использование зубной щетки -setup_auto_138,Is my phone upside down? App,Приложение "Мой телефон перевернут?" -setup_auto_139,event 1,событие 1 -setup_auto_140,event 2,событие 2 -setup_auto_141,event 3,событие 3 +блааааргх",TRANSLATED +setup_auto_054,A yellow cupboard with lots of drawers.,Желтый шкаф с множеством ящиков.,TRANSLATED +setup_auto_055,A really big yellow shelf.,Очень большая желтая полка.,TRANSLATED +setup_auto_056,"A comfortable, yellow bed with yellow cushions.","Удобная, желтая кровать с желтыми подушками.",TRANSLATED +setup_auto_057,something,что-то,TRANSLATED +setup_auto_058,something else,что-то еще,TRANSLATED +setup_auto_059,this should happen first,это должно произойти сначала,TRANSLATED +setup_auto_060,and this should happen after that,а это должно произойти после,TRANSLATED +setup_auto_061,something,что-то,TRANSLATED +setup_auto_062,something else,что-то еще,TRANSLATED +setup_auto_063,this should happen first,это должно произойти сначала,TRANSLATED +setup_auto_064,and this should happen after that,а это должно произойти после,TRANSLATED +setup_auto_065,this is some other change,это какое-то другое изменение,TRANSLATED +setup_auto_066,this is some other change,это какое-то другое изменение,TRANSLATED +setup_auto_067,SPECIAL,ОСОБЕННЫЙ,TRANSLATED +setup_auto_068,Just woke up. Is hungry.,Только проснулся. Голоден.,TRANSLATED +setup_auto_069,Had blueberry pancakes with maple syrup for breakfast.,На завтрак были блины с черникой и кленовым сиропом.,TRANSLATED +setup_auto_070,Had muesli with oats and strawberries for breakfast.,На завтрак были мюсли с овсянкой и клубникой.,TRANSLATED +setup_auto_071,Had pancakes with strawberries for breakfast.,На завтрак были блины с клубникой.,TRANSLATED +setup_auto_072,I am precious,Я драгоценный,TRANSLATED +setup_auto_073,hello,привет,TRANSLATED +setup_auto_074,world,мир,TRANSLATED +setup_auto_075,hello,привет,TRANSLATED +setup_auto_076,world,мир,TRANSLATED +setup_auto_077,ppl p,ppl p,TRANSLATED +setup_auto_078,ae ie,ae ie,TRANSLATED +setup_auto_079,file 1,файл 1,TRANSLATED +setup_auto_080,file 2,файл 2,TRANSLATED +setup_auto_081,file 3,файл 3,TRANSLATED +setup_auto_082,file 1,файл 1,TRANSLATED +setup_auto_083,file 2,файл 2,TRANSLATED +setup_auto_084,file 3,файл 3,TRANSLATED +setup_auto_085,file 1,файл 1,TRANSLATED +setup_auto_086,file 2,файл 2,TRANSLATED +setup_auto_087,file 3,файл 3,TRANSLATED +setup_auto_090,file 1,файл 1,TRANSLATED +setup_auto_091,file 2,файл 2,TRANSLATED +setup_auto_092,file 3,файл 3,TRANSLATED +setup_auto_093,file 1,файл 1,TRANSLATED +setup_auto_094,file 2,файл 2,TRANSLATED +setup_auto_095,file 3,файл 3,TRANSLATED +setup_auto_096,new content,новое содержимое,TRANSLATED +setup_auto_097,hello,привет,TRANSLATED +setup_auto_098,world,мир,TRANSLATED +setup_auto_099,hello,привет,TRANSLATED +setup_auto_100,world,мир,TRANSLATED +setup_auto_102,file 1,файл 1,TRANSLATED +setup_auto_103,file 2,файл 2,TRANSLATED +setup_auto_104,file A,файл A,TRANSLATED +setup_auto_105,file B,файл B,TRANSLATED +setup_auto_106,file C,файл C,TRANSLATED +setup_auto_107,file 1,файл 1,TRANSLATED +setup_auto_108,file 2,файл 2,TRANSLATED +setup_auto_109,file A,файл A,TRANSLATED +setup_auto_110,file B,файл B,TRANSLATED +setup_auto_111,file C,файл C,TRANSLATED +setup_auto_112,My master password is a1b2c3d4e5,Мой мастер-пароль a1b2c3d4e5,TRANSLATED +setup_auto_113,This blob really should not exist,Этого blob действительно не должно существовать,TRANSLATED +setup_auto_114,This is a virus,Это вирус,TRANSLATED +setup_auto_115,blabber,болтовня,TRANSLATED +setup_auto_116,blabber,болтовня,TRANSLATED +setup_auto_117,file 1,файл 1,TRANSLATED +setup_auto_118,file 2,файл 2,TRANSLATED +setup_auto_119,file 3,файл 3,TRANSLATED +setup_auto_120,file 1,файл 1,TRANSLATED +setup_auto_121,file 2,файл 2,TRANSLATED +setup_auto_122,file 3,файл 3,TRANSLATED +setup_auto_123,hello,привет,TRANSLATED +setup_auto_124,world,мир,TRANSLATED +setup_auto_125,hello,привет,TRANSLATED +setup_auto_126,world,мир,TRANSLATED +setup_auto_127,I'm the left arm,Я левая рука,TRANSLATED +setup_auto_128,I'm the right arm,Я правая рука,TRANSLATED +setup_auto_129,I'm the left leg,Я левая нога,TRANSLATED +setup_auto_130,I'm the right leg,Я правая нога,TRANSLATED +setup_auto_131,event 1,событие 1,TRANSLATED +setup_auto_132,event 2,событие 2,TRANSLATED +setup_auto_133,event 3,событие 3,TRANSLATED +setup_auto_134,event 1,событие 1,TRANSLATED +setup_auto_135,event 2,событие 2,TRANSLATED +setup_auto_136,event 3,событие 3,TRANSLATED +setup_auto_137,toothbrush sharing,совместное использование зубной щетки,TRANSLATED +setup_auto_138,Is my phone upside down? App,"Приложение ""Мой телефон перевернут?""",TRANSLATED +setup_auto_139,event 1,событие 1,TRANSLATED +setup_auto_140,event 2,событие 2,TRANSLATED +setup_auto_141,event 3,событие 3,TRANSLATED setup_auto_142,"You just woke up. You are NOT wearing underwear. @@ -1557,7 +1551,7 @@ You are NOT wearing shoes.","Вы только что проснулись. На вас НЕТ рубашки. -На вас НЕТ обуви." +На вас НЕТ обуви.",TRANSLATED setup_auto_143,"You just woke up. You are NOT wearing underwear. @@ -1574,7 +1568,7 @@ You are wearing shoes.","Вы только что проснулись. На вас НЕТ рубашки. -На вас ЕСТЬ обувь." +На вас ЕСТЬ обувь.",TRANSLATED setup_auto_144,"You just woke up. You are NOT wearing underwear. @@ -1591,7 +1585,7 @@ You are wearing shoes.","Вы только что проснулись. На вас НЕТ рубашки. -На вас ЕСТЬ обувь." +На вас ЕСТЬ обувь.",TRANSLATED setup_auto_145,"You just woke up. You are wearing underwear. @@ -1608,7 +1602,7 @@ You are wearing shoes.","Вы только что проснулись. На вас НЕТ рубашки. -На вас ЕСТЬ обувь." +На вас ЕСТЬ обувь.",TRANSLATED setup_auto_146,"You just woke up. You are wearing underwear. @@ -1625,7 +1619,7 @@ You are wearing shoes.","Вы только что проснулись. На вас ЕСТЬ рубашка. -На вас ЕСТЬ обувь." +На вас ЕСТЬ обувь.",TRANSLATED setup_auto_147,"You do not have a baguette. You do not have coffee. @@ -1634,7 +1628,7 @@ You do not have a donut.","У вас нет багета. У вас нет кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_148,"You have a baguette. You do not have coffee. @@ -1643,7 +1637,7 @@ You do not have a donut.","У вас есть багет. У вас нет кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_149,"You ate a baguette. You do not have coffee. @@ -1652,7 +1646,7 @@ You do not have a donut.","Вы съели багет. У вас нет кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_150,"You do not have a baguette. You have coffee. @@ -1661,7 +1655,7 @@ You do not have a donut.","У вас нет багета. У вас есть кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_151,"You do not have a baguette. You drank coffee. @@ -1670,7 +1664,7 @@ You do not have a donut.","У вас нет багета. Вы выпили кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_152,"You do not have a baguette. You do not have coffee. @@ -1679,7 +1673,7 @@ You have a donut.","У вас нет багета. У вас нет кофе. -У вас есть пончик." +У вас есть пончик.",TRANSLATED setup_auto_153,"You do not have a baguette. You do not have coffee. @@ -1688,30 +1682,30 @@ You ate a donut.","У вас нет багета. У вас нет кофе. -Вы съели пончик." -setup_auto_154,You wake up.,Вы просыпаетесь. -setup_auto_155,You drink coffee.,Вы пьете кофе. -setup_auto_156,You hear a knock on the door.,Вы слышите стук в дверь. -setup_auto_157,Line 1,Строка 1 -setup_auto_158,Line 2,Строка 2 -setup_auto_159,Apple Pie:,Яблочный пирог: -setup_auto_160,- 4 Apples,- 4 яблока -setup_auto_161,- 500g Flour,- 500г муки -setup_auto_162,- 200g Sugar,- 200г сахара -setup_auto_163,- Pinch of Salt,- Щепотка соли -setup_auto_164,Apple Pie:,Яблочный пирог: -setup_auto_165,- 4 Apples,- 4 яблока -setup_auto_166,- 500g Flour,- 500г муки -setup_auto_167,Apple Pie:,Яблочный пирог: -setup_auto_168,- 4 Apples,- 4 яблока -setup_auto_169,- 500g Flour,- 500г муки -setup_auto_170,- Pinch of Salt,- Щепотка соли -setup_auto_171,Apple Pie:,Яблочный пирог: -setup_auto_172,- 4 Apples,- 4 яблока -setup_auto_173,- 500g Flour,- 500г муки -setup_auto_174,Apple Pie:,Яблочный пирог: -setup_auto_175,- 4 Apples,- 4 яблока -setup_auto_176,- 500g Flour,- 500г муки +Вы съели пончик.",TRANSLATED +setup_auto_154,You wake up.,Вы просыпаетесь.,TRANSLATED +setup_auto_155,You drink coffee.,Вы пьете кофе.,TRANSLATED +setup_auto_156,You hear a knock on the door.,Вы слышите стук в дверь.,TRANSLATED +setup_auto_157,Line 1,Строка 1,TRANSLATED +setup_auto_158,Line 2,Строка 2,TRANSLATED +setup_auto_159,Apple Pie:,Яблочный пирог:,TRANSLATED +setup_auto_160,- 4 Apples,- 4 яблока,TRANSLATED +setup_auto_161,- 500g Flour,- 500г муки,TRANSLATED +setup_auto_162,- 200g Sugar,- 200г сахара,TRANSLATED +setup_auto_163,- Pinch of Salt,- Щепотка соли,TRANSLATED +setup_auto_164,Apple Pie:,Яблочный пирог:,TRANSLATED +setup_auto_165,- 4 Apples,- 4 яблока,TRANSLATED +setup_auto_166,- 500g Flour,- 500г муки,TRANSLATED +setup_auto_167,Apple Pie:,Яблочный пирог:,TRANSLATED +setup_auto_168,- 4 Apples,- 4 яблока,TRANSLATED +setup_auto_169,- 500g Flour,- 500г муки,TRANSLATED +setup_auto_170,- Pinch of Salt,- Щепотка соли,TRANSLATED +setup_auto_171,Apple Pie:,Яблочный пирог:,TRANSLATED +setup_auto_172,- 4 Apples,- 4 яблока,TRANSLATED +setup_auto_173,- 500g Flour,- 500г муки,TRANSLATED +setup_auto_174,Apple Pie:,Яблочный пирог:,TRANSLATED +setup_auto_175,- 4 Apples,- 4 яблока,TRANSLATED +setup_auto_176,- 500g Flour,- 500г муки,TRANSLATED setup_auto_177,"You do not have a baguette. You do not have coffee. @@ -1720,7 +1714,7 @@ You do not have a donut.","У вас нет багета. У вас нет кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_178,"You have a baguette. You do not have coffee. @@ -1729,7 +1723,7 @@ You do not have a donut.","У вас есть багет. У вас нет кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_179,"You ate a baguette. You do not have coffee. @@ -1738,7 +1732,7 @@ You do not have a donut.","Вы съели багет. У вас нет кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_180,"You do not have a baguette. You have coffee. @@ -1747,7 +1741,7 @@ You do not have a donut.","У вас нет багета. У вас есть кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_181,"You do not have a baguette. You drank coffee. @@ -1756,7 +1750,7 @@ You do not have a donut.","У вас нет багета. Вы выпили кофе. -У вас нет пончика." +У вас нет пончика.",TRANSLATED setup_auto_182,"You do not have a baguette. You do not have coffee. @@ -1765,41 +1759,40 @@ You have a donut.","У вас нет багета. У вас нет кофе. -У вас есть пончик." -setup_auto_183,"You wrap the birthday present, and grab your concert ticket.","Вы заворачиваете подарок на день рождения и берете билет на концерт." -setup_auto_184,You go to the birthday party!,Вы идете на вечеринку в честь дня рождения! -setup_auto_185,You go to the concert!,Вы идете на концерт! -setup_auto_186,You leave your house and start walking to school.,Вы выходите из дома и идете в школу. -setup_auto_187,You walk on the right side of the street.,Вы идете по правой стороне улицы. -setup_auto_188,"You jump over an manhole in the walkway, and arrive at school on time.","Вы перепрыгиваете через люк на тротуаре и приходите в школу вовремя." -setup_auto_189,"Suddenly, you fall down, splash into stinking water, and are eaten by an alligator.","Внезапно вы падаете, шлепаетесь в вонючую воду, и вас съедает аллигатор." -setup_auto_190,You walk on the left side of the street.,Вы идете по левой стороне улицы. -setup_auto_191,"Because you're kind of late, you start running. Someone throws a piano out of their windows, and it smashes you.","Поскольку вы немного опаздываете, вы начинаете бежать. Кто-то выбрасывает пианино из окна, и оно вас раздавливает." -setup_auto_192,"You're not in a hurry, and walk slowly. You even get some ice cream on your way. You arrive at school too late, your teacher is angry, and you are expelled.","Вы не торопитесь и идете медленно. По дороге вы даже покупаете мороженое. Вы приходите в школу слишком поздно, ваш учитель злится, и вас исключают." -setup_auto_193,"You wrap the birthday present, and grab your concert ticket.","Вы заворачиваете подарок на день рождения и берете билет на концерт." -setup_auto_194,You go to the birthday party!,Вы идете на вечеринку в честь дня рождения! -setup_auto_195,You go to the concert!,Вы идете на концерт! -setup_auto_196,Looks very hungry.,Выглядит очень голодным. +У вас есть пончик.",TRANSLATED +setup_auto_183,"You wrap the birthday present, and grab your concert ticket.",Вы заворачиваете подарок на день рождения и берете билет на концерт.,TRANSLATED +setup_auto_184,You go to the birthday party!,Вы идете на вечеринку в честь дня рождения!,TRANSLATED +setup_auto_185,You go to the concert!,Вы идете на концерт!,TRANSLATED +setup_auto_186,You leave your house and start walking to school.,Вы выходите из дома и идете в школу.,TRANSLATED +setup_auto_187,You walk on the right side of the street.,Вы идете по правой стороне улицы.,TRANSLATED +setup_auto_188,"You jump over an manhole in the walkway, and arrive at school on time.",Вы перепрыгиваете через люк на тротуаре и приходите в школу вовремя.,TRANSLATED +setup_auto_189,"Suddenly, you fall down, splash into stinking water, and are eaten by an alligator.","Внезапно вы падаете, шлепаетесь в вонючую воду, и вас съедает аллигатор.",TRANSLATED +setup_auto_190,You walk on the left side of the street.,Вы идете по левой стороне улицы.,TRANSLATED +setup_auto_191,"Because you're kind of late, you start running. Someone throws a piano out of their windows, and it smashes you.","Поскольку вы немного опаздываете, вы начинаете бежать. Кто-то выбрасывает пианино из окна, и оно вас раздавливает.",TRANSLATED +setup_auto_192,"You're not in a hurry, and walk slowly. You even get some ice cream on your way. You arrive at school too late, your teacher is angry, and you are expelled.","Вы не торопитесь и идете медленно. По дороге вы даже покупаете мороженое. Вы приходите в школу слишком поздно, ваш учитель злится, и вас исключают.",TRANSLATED +setup_auto_193,"You wrap the birthday present, and grab your concert ticket.",Вы заворачиваете подарок на день рождения и берете билет на концерт.,TRANSLATED +setup_auto_194,You go to the birthday party!,Вы идете на вечеринку в честь дня рождения!,TRANSLATED +setup_auto_195,You go to the concert!,Вы идете на концерт!,TRANSLATED +setup_auto_196,Looks very hungry.,Выглядит очень голодным.,TRANSLATED setup_auto_197,"A small child. It really loves cats!","Маленький ребенок. -Он очень любит кошек!" -setup_auto_198,It's holding a lollipop.,Он держит леденец. -setup_auto_199,Looks happy. :),Выглядит счастливым. :) -setup_auto_200,It's sleeping.,Он спит. +Он очень любит кошек!",TRANSLATED +setup_win_112,very hungry,очень голодным,TRANSLATED +setup_auto_198,It's holding a lollipop.,Он держит леденец.,TRANSLATED +setup_auto_199,Looks happy. :),Выглядит счастливым. :),TRANSLATED +setup_auto_200,It's sleeping.,Он спит.,TRANSLATED setup_auto_201,"This piggy bank belongs to the big sister. It contains 10 coins.","Эта копилка принадлежит старшей сестре. -В ней 10 монет." -setup_auto_202,"A young girl with brown, curly hair.","Молодая девушка с каштановыми, вьющимися волосами." -setup_auto_203,Has 10 coins.,Имеет 10 монет. +В ней 10 монет.",TRANSLATED +setup_auto_202,"A young girl with brown, curly hair.","Молодая девушка с каштановыми, вьющимися волосами.",TRANSLATED +setup_auto_203,Has 10 coins.,Имеет 10 монет.,TRANSLATED setup_auto_204,"This piggy bank belongs to the big sister. It is empty.","Эта копилка принадлежит старшей сестре. -Она пуста." -setup_auto_205,important,важно -setup_auto_206,important content,важное содержимое -setup_auto_207,good version,хорошая версия -setup_auto_208,bad version,плохая версия -setup_auto_209,1 2 3 4,1 2 3 4 -setup_auto_210,1 2 3 4 5 6 7 8 9 11,1 2 3 4 5 6 7 8 9 11 +Она пуста.",TRANSLATED +setup_auto_205,important,важно,TRANSLATED +setup_auto_206,important content,важное содержимое,TRANSLATED +setup_auto_207,good version,хорошая версия,TRANSLATED +setup_auto_208,bad version,плохая версия,TRANSLATED setup_auto_211,"this is fine ? @@ -1812,7 +1805,7 @@ setup_auto_211,"this is fine ? -?" +?",TRANSLATED setup_auto_212,"this is fine this is also fine @@ -1825,7 +1818,7 @@ this is also fine ? -?" +?",TRANSLATED setup_auto_213,"this is fine this is also fine @@ -1838,7 +1831,7 @@ this is very bad это очень плохо -?" +?",TRANSLATED setup_auto_214,"this is fine this is also fine @@ -1851,42 +1844,42 @@ this is fine again","это нормально это очень плохо -это снова нормально" -setup_auto_215,important,важно -setup_auto_216,"2 + 3 = ","2 + 3 = " -setup_auto_217,You still have your key.,У вас все еще есть ключ. -setup_auto_218,Your pocket is empty.,Ваш карман пуст. -setup_auto_219,Is on the ground.,Лежит на земле. -setup_auto_220,Is holding a key in its beak.,Держит ключ в клюве. -setup_auto_221,A yellow cozy bed.,Желтая уютная кровать. -setup_auto_222,A tiny spider web is next to your window.,Крошечная паутина рядом с вашим окном. -setup_auto_223,A big spider web sticks above your bed.,Большая паутина висит над вашей кроватью. -setup_auto_224,A cozy bed.,Уютная кровать. -setup_auto_225,An extra thick spider web is right beside your door.,Очень толстая паутина прямо у вашей двери. -setup_auto_226,Line 1,Строка 1 -setup_auto_227,"Line 2, gnihihi","Строка 2, хихихи" -setup_auto_228,The bike shed should be ???,Велосипедный сарай должен быть ??? -setup_auto_229,The bike shed should be green,Велосипедный сарай должен быть зеленым -setup_auto_230,The bike shed should be blue,Велосипедный сарай должен быть синим -compare_win_hint_073,"Pick the timeline that's clearer, and make the alarm go off!","Выберите более понятную ветку и включите будильник!" -hint_drag_nodes,"You can drag these around with your mouse!","Вы можете перетаскивать их мышкой!" -hint_remote,"This is the time machine of another person! To interact with it, you need special commands!","Это машина времени другого человека! Чтобы взаимодействовать с ней, нужны особые команды!" -hint_file_browser,"Click on these files to edit them!","Нажмите на эти файлы, чтобы их отредактировать!" -hint_cli_badge,"You get a golden badge for each level you solve without using the playing cards! Can you solve them all using the command line?","Вы получаете золотой значок за каждый уровень, решенный без игральных карт! Сможете ли вы пройти их все, используя только командную строку?" -hint_cards,"These are your cards! Drag them to highlighted areas to play them!","Это ваши карты! Перетаскивайте их на подсвеченные области, чтобы сыграть!" -hint_terminal,"This is your terminal! All commands are executed here, and you can see their output. You can also type your own commands here!","Это ваш терминал! Все команды выполняются здесь, и вы видите их вывод. Вы также можете вводить здесь свои собственные команды!" -notif_btn_got_it,"Got it!","Понятно!" -notif_btn_interesting,"Interesting!","Интересно!" -notif_btn_very_useful,"Very useful!","Очень полезно!" -notif_btn_cool,"Cool!","Круто!" -notif_btn_nice,"Nice!","Отлично!" -notif_btn_thanks,"Thanks!","Спасибо!" -notif_btn_whatever,"Whatever...","Как скажешь..." -notif_btn_okay,"Okay!","Окей!" -notif_btn_yay,"Yay!","Ура!" -notif_btn_awesome,"Awesome!","Потрясающе!" +это снова нормально",TRANSLATED +setup_auto_215,important,важно,TRANSLATED +setup_auto_216,2 + 3 = ,2 + 3 = ,TRANSLATED +setup_auto_217,You still have your key.,У вас все еще есть ключ.,TRANSLATED +setup_auto_218,Your pocket is empty.,Ваш карман пуст.,TRANSLATED +setup_auto_219,Is on the ground.,Лежит на земле.,TRANSLATED +setup_auto_220,Is holding a key in its beak.,Держит ключ в клюве.,TRANSLATED +setup_auto_221,A yellow cozy bed.,Желтая уютная кровать.,TRANSLATED +setup_auto_222,A tiny spider web is next to your window.,Крошечная паутина рядом с вашим окном.,TRANSLATED +setup_auto_223,A big spider web sticks above your bed.,Большая паутина висит над вашей кроватью.,TRANSLATED +setup_auto_224,A cozy bed.,Уютная кровать.,TRANSLATED +setup_auto_225,An extra thick spider web is right beside your door.,Очень толстая паутина прямо у вашей двери.,TRANSLATED +setup_auto_226,Line 1,Строка 1,TRANSLATED +setup_auto_227,"Line 2, gnihihi","Строка 2, хихихи",TRANSLATED +setup_auto_228,The bike shed should be ???,Велосипедный сарай должен быть ???,TRANSLATED +setup_auto_229,The bike shed should be green,Велосипедный сарай должен быть зеленым,TRANSLATED +setup_auto_230,The bike shed should be blue,Велосипедный сарай должен быть синим,TRANSLATED +compare_win_hint_073,"Pick the timeline that's clearer, and make the alarm go off!",Выберите более понятную ветку и включите будильник!,TRANSLATED +hint_drag_nodes,You can drag these around with your mouse!,Вы можете перетаскивать их мышкой!,TRANSLATED +hint_remote,"This is the time machine of another person! To interact with it, you need special commands!","Это машина времени другого человека! Чтобы взаимодействовать с ней, нужны особые команды!",TRANSLATED +hint_file_browser,Click on these files to edit them!,"Нажмите на эти файлы, чтобы их отредактировать!",TRANSLATED +hint_cli_badge,You get a golden badge for each level you solve without using the playing cards! Can you solve them all using the command line?,"Вы получаете золотой значок за каждый уровень, решенный без игральных карт! Сможете ли вы пройти их все, используя только командную строку?",TRANSLATED +hint_cards,These are your cards! Drag them to highlighted areas to play them!,"Это ваши карты! Перетаскивайте их на подсвеченные области, чтобы сыграть!",TRANSLATED +hint_terminal,"This is your terminal! All commands are executed here, and you can see their output. You can also type your own commands here!","Это ваш терминал! Все команды выполняются здесь, и вы видите их вывод. Вы также можете вводить здесь свои собственные команды!",TRANSLATED +notif_btn_got_it,Got it!,Понятно!,TRANSLATED +notif_btn_interesting,Interesting!,Интересно!,TRANSLATED +notif_btn_very_useful,Very useful!,Очень полезно!,TRANSLATED +notif_btn_cool,Cool!,Круто!,TRANSLATED +notif_btn_nice,Nice!,Отлично!,TRANSLATED +notif_btn_thanks,Thanks!,Спасибо!,TRANSLATED +notif_btn_whatever,Whatever...,Как скажешь...,TRANSLATED +notif_btn_okay,Okay!,Окей!,TRANSLATED +notif_btn_yay,Yay!,Ура!,TRANSLATED +notif_btn_awesome,Awesome!,Потрясающе!,TRANSLATED default_congrats_key,"Good job, you solved the level! Feel free to try a few more things or click 'Next level'.","Отличная работа, уровень пройден! -Можешь ещё поэкспериментировать или нажми 'Следующий уровень'." +Можешь ещё поэкспериментировать или нажми 'Следующий уровень'.",TRANSLATED diff --git a/translations.csv.import b/translations.csv.import index 5eaaa1fc..1320e397 100644 --- a/translations.csv.import +++ b/translations.csv.import @@ -5,10 +5,10 @@ type="Translation" [deps] -files=[ "res://translations.en.translation", "res://translations.ru.translation" ] +files=[ "res://translations.en.translation", "res://translations.ru.translation", "res://translations.br.translation" ] source_file="res://translations.csv" -dest_files=[ "res://translations.en.translation", "res://translations.ru.translation" ] +dest_files=[ "res://translations.en.translation", "res://translations.ru.translation", "res://translations.br.translation" ] [params] diff --git a/translations.en.translation b/translations.en.translation index fd5a7e19db113a20808b34bc6868582971bef570..98a6b3c4b23a35e1ceb94a11db6b16b4c4a19c42 100644 GIT binary patch literal 14265 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 delta 16 Wcmdm)zmjQ#A|nR_5CjDWIRgMFo&)Fr diff --git a/translations.ru.translation b/translations.ru.translation index fd5a7e19db113a20808b34bc6868582971bef570..4795f4803e57bda79a628918082ecfd8b4b3b0f4 100644 GIT binary patch literal 32744 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 vJyjThY!2p70j-?