././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.7501018 thonny-4.0.1/0000775000175000017500000000000014307363733012660 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662904273.0 thonny-4.0.1/CHANGELOG.rst0000664000175000017500000021603114307363721014701 0ustar00annamaaannamaa=============== Version history =============== 4.0.1 (2022-09-11) ================== * Fix error when running script with closed Shell, #2412 * Fix error with programs calling `exit` (more robust handing of closing the back-end process), #1786, #2433, #2423 * Fix blank editor after switching tabs on macOS, #2425 * Instruct saving the program before debugging, #2415 * Fix find not highlighting selected result in block comments, #2407 * Fix new file creation error, #2406 * Fix Choice Dialog closing with ESC, #2406 * Fix the error when invoking Python's `help` function, #2435 * Fall back to killing current process when running and interrupt doesn't work, #2420 * Don't close the backend process when interrupting at idle prompt, #2422 * Fix Windows 11 version in About dialog, #2406 * Fix outdated test, #2413 * Make the Mac installer more compatible with Arm, #2409 * Allow downloading latest unstable MicroPython builds, #2408 * Allow new file command for remote file browser * Update Estonian, German and Chinese (TW) translations 4.0.0 (2022-08-22) ================== * Fix error when pressing Ctrl-D with unsubmitted input, #2388 * Fix the error when clicking info line in TODO view (by @kr-g), #2389 * Show previous location when re-loading externally modified file, #1589, #1455, #1968 * Don't propose completions automatically in comments, #2393 * Fix a_box_is_appearing completion error, #2256 * INTERNAL: Simplify jedi_utils, drop support for versions below 0.18.1 * Upgrade deps in XXL bundle * Fix "Seed find/replace with currently-selected text" for Linux, #2356 * Update German translations (by the contributors in POEditor) 4.0.0b4 (2022-08-14) ==================== * CHANGED: Require single click for toggling a breakpoint, #2293 * Refactor MicroPython/CircuitPython flashing dialog, #2344 * Add TODO view (by @kr-g), #2067 * Add possibility to activate a virtual environment via Files view (by @kr-g), #2381 * Add separate "Install ..." items to the back-end switcher menu if a device in UF2 bootloader mode is detected, #2387 * Automatically reload saved files after external modification (with help from @kr-g), #1589, #1455, #1968 * Add EV3 default password information to config page, #2284 * Don't choke on relative interpreter paths, #2335 * Don't crash when Windows network locations can't be found, #2285 * Don't show package extra deps even when the extra is combined with another condition * Make paddings larger for hi-res displays * Take OSC commands into account when looking for prompts (relevant for CircuitPython 8), #2349 * Support OSC sequences for setting terminal title, #2369 * Toggle hidden files also via file-browser's context menu, #1039 * Use "Install MicroPython" instead of "Install firmware", #2364 * Rename "Python 3" back-end to "Local Python 3" * Seed find/replace with currently-selected text, #2356 * Work around Pylint error (make Pylint work again), #2359 * Add coloring for `match` and `case` soft keywords, #2358 * Add Slovenian translation (by cspaier) * Update several translations * Fix translations with bad placeholders (by @abrarwali), #2253 4.0.0b3 (2022-05-15) ==================== * BREAKING: Don't SetProcessDpiAwareness for user programs anymore. This means for example, that Tkinter and Pygame programs on Windows run as if they were executed with plain Python (ie they may become blurry on modern displays). For clear picture, start your program with ``import ctypes; ctypes.OleDLL("shcore").SetProcessDpiAwareness(1)``, #2159 * Add "Assistant" help page explaining the possibility to omit selected Pylint checks, #1978 * Add command "Run => Visualize current script at Python Tutor", #2242 * Fix debugger error when importing user modules (regression introduced in 4.0.0b1), #2246 * Add options for automatically making uploaded or saved shebang scripts executable (includes changing Windows line breaks to Unix ones). See "Editor" and SSH-backends' config pages. * Don't propose pythonw.exe as initial backend, #2236 * Fix error when trying to open a file from file browser with ENTER, #1785 * Fix support for remote Python 3 over SSH (regression introduced in one of the 4.0.0 betas), #2249 * Support CircuitPython with micro:bit, #2251 * Avoid wobbling of AutomaticScrollbar, helpful report by @TooLazy0x00, #2258 * Fix problem uninstalling MicroPython packages * Install packages without --user in portable mode, #1606 * Allow back-end plugins to modify sys.path, #2281 * Use %run instead of %Run when skipping interpreter restart, #1565 * Updated Estonian, Thai and Brazilian Portuguese translations * EXPERIMENTAL: Add LEGO® EV3 back-end: "Run => Select interpreter => MicroPython (EV3)" 4.0.0b2 (2022-04-09) ==================== * Fix the problem with scripts having declared encoding something else than UTF-8, #1650 * Don't clear shell after automatic restart * Fixes certain problems with running Flask and multiprocessing programs, #2062 * Fix KeyError: 'ESP32.url' when connecting to WebREPL, #2082 (regression introduced in b1) * Fix parameter completions where name of local variable was proposed with trailing '=' * Fix error with printing (regression introduced in b1), #2233 * Fix Find & replace dialog not appearing, #2208 * Fix display of debugger frames (regression introduced in 4.0.0b1), #2216 * Warn when environment value is provided with quotes, #2184 * Let macOS installer know the bundle is able to run in arm64 mode, #2201 * Update completion stubs for MicroPython and CircuitPython (from @hlovatt and @adafruit) * Add compatibility with Python 3.8 via Windows launcher, #2206 * Disable "Run" command when MicroPython device is disconnected * Make Shell read-only when device is disconnected * Fix various problems with managing files on CircuitPython devices * Don't assume all CircuitPython boards have RTC, #1760 * Fix error with evaluating ``globals()`` on MicroPython device, #1938 * Add MicrobitImage inspector for Object inspector * Add Tamil translation, by Kamala Kannan K and அனிச்பிரபு தி, #2211 * Add Thai translation, by Tomzt Pimai and Game of * Update translations for German, Spanish, Japanese, Slovak, Korean, Brazilian Portuguese, Albanian 4.0.0b1 (2022-03-21) ==================== New & changed -------------- Distribution ~~~~~~~~~~~~ * Upgrade bundled Python to 3.10 * Drop support for Python 3.5, 3.6 and 3.7 * The main Windows bundle is now 64-bit. For fallback publish 32-bit bundle with Python 3.8 for 32-bit Windows 10 and 8.1 and all variants of Windows 7 and 8. * Mac bundle now comes with the universal2 build of Python * Stop publishing 32-bit Linux bundles. * Enhance Linux installer script (the .bash-file) to create a venv and pip-install Thonny if run on a platform for which there is no binary bundle available. This means you can now use Linux installer also on Raspberry Pi, #1736 Code completion and analysis ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Add the option for automatically getting completions while typing (Tools => Options => Editor) * Selecting a completion with Tab now replaces the name suffix right of the cursor, #1998 * Turn off requesting completions with Tab in editors by default, #2069 * Show documentation for the selected completion with another Ctrl-Space or automatically (Tools => Options => Editor) * Add "call-tips" -- a box describing the formal parameters of current method call. Invoke manually with Ctrl-Shift-Space or automatically after typing open parentheses (Tools => Options => Editor) * Enhance Go-to-definition (Ctrl-click). The name is now underlined while ctrl-hovering over it. MicroPython ~~~~~~~~~~~ * Use [pipkin](https://pypi.org/project/pipkin/) for managing packages on MicroPython and CircuitPython devices. This enables proper listing of packages together with version info and proper uninstallation. * Use `.local_rtc` config parameters instead of (oppositely worded) `.utc_clock` in MicroPython back-ends, 116aecd714d5e94a8ad6e244deac44aece5065eb * Present MicroPython time options (whether to sync time and whether to use local time) in back-end configuration page, #1638 * Automatically interrupt current process when connecting to bare-metal MicroPython or CircuitPython device. This can be turned off at device's settings page, #2059 * Don't hide the output when Stop/Restarting MicroPython, #1805 * Make internal MicroPython errors less intimidating. In several cases the errors are caused by bugs in MicroPython or USB driver and there is no use of showing the stacktrace. User is now directed to restart the device and stacktrace can be checked from the backend.log, #1799 * Make MicroPython back-end advise Ctrl+C also if only whitespace characters get printed, #1755 * Allow running MicroPython scripts without soft-rebooting first, #1565, #1716 * Add generic "MicroPython (RP2040)" back-end in addition to the more specific "MicroPython (Raspberry Pi Pico)", #2151 * Mention the possibility to reconfigure file types when denying opening remote files in a system app, #2148 Various ~~~~~~~ * Add new toolbar button which opens the wiki page describing ways to help Ukraine survive the attack from Russia. * Allow running content of untitled editors without saving, #778 * Clear Shell before starting new process (Run, Debug, Stop/Restart, ...) by default. Can be turned off in Tools => Options => Shell, #1681 * Make stacktrace links to ```` and ```` pseudo-files go to the editor containing corresponding source, #778 * Ask confirmation for adding .py extension when the user saves the file without any extension to MicroPython/CircuitPython device, #2077 * Don't add the .py extension when the user saves a local file and selects "All files" filter. * Add Cut/Copy/Paste to the file browser, #2001 by @kr-g * Make editor remember current line when reloading external changes, #2001 by @kr-g * Add "Edit => Go to line..." command (Ctrl-G), #2001 by @kr-g * Add "Rename" command for the local file browser, #2001 by @kr-g * Add nicer Stop-button for higher resolutions, #1445 by @speedy-10 * Improve icon scaling -- use larger icons when Treeview row height is larger than ``general.large_icon_rowheight_threshold`` * Use default font in Treeviews (including Files and Variables view). Therefore Treeview's font size is now affected by the scaling factor and is not affected by editor font size. * Use isolated mode for launching Thonny. This includes hiding user-site packages from Thonny's GUI process (not from user programs). Plug-ins now get installed under Thonny's data folder, #2038, #1651 * Allow installing packages for remote CPython backend, #1319 * Flatten the list of interpreters in the backend-switcher menu (lower-right corner of the main window) * Removed previously deprecated "A special virtual environment". Use regular virtual environments instead. * Merge "The same interpreter which runs Thonny" and "Alternative Python 3 interpreter or virtual environment" back-ends into "Local Python 3" * Back-end switcher now remembers several configurations for remote CPython and MicroPython. * Make package manager work for remote Python 3 (SSH) Fixed ----- * Fix issues with printouts containing more than 999 lines, #2118, #1646 * Fall back to default theme when used 3rd party theme gets uninstalled, #2117 * Fix problem with Files hamburger menu when nothing is selected, #2101 * Fix Windows version detection in "Tools => Open system shell", #1961 * Make sure Thonny's dialogs are treated as dialogs in macOS and Linux, #1790 * Don't issue two Ctrl+C-s too quickly in row when interrupting MicroPython process, in order to give time for finally-blocks to clean up, #1757 * Fix asm_pio error when working in with RP-pico in shell mode, #1718 * Fix the crash when scripts longer than 4KB are sent to Python 3 SSH back-end, #1680 * Properly interrupt MicroPython code before submitting new code when using F5 while code is running, #1668 * Use "vista" Tk-theme instead of "xpnative" in Windows. Gives nicer combobox, #1663 * Fix problems with full screen and split screen views in macOS, #1293, #1012 * Fix the crash when pasting certain Unicode chars to editor in macOS, #32 * Fix the crash caused by Cmd-backtick and others with Spanish keyboard in macOS, #886 * Fix focus issues in dialogs, #2153 * Fix automatic horizontal scrollbar not always appearing, #2169 and #659 by @jharris1993 and @lurch * Forward SSH password to the back-end process via stdin instead of command line. 3.3.14 (2021-08-01) =================== * Fix problems in org.thonny.Thonny.appdata.xml * Allow assigning Python coloring for Python-like files, #1927 * Increase the initial top coordinate of Thonny's main window. Fixes problem of Thonny's title bar being hidden by the system menubar, #1925 3.3.13 (2021-07-25) =================== * Update org.thonny.Thonny.appdata.xml 3.3.12 (2021-07-25) =================== * Restore syncing to localtime for RPi Pico (fixed regression introduced in 3.3.11), #1886 * Fix installing from requirements.txt in MicroPython, #1879 * Allow specifying different colors for method and function calls, by Jonathan Campbell, #1884 * Extend editor API for plug-ins (close event and content load/save hooks), by Nicolas Despres, #1891 * Fix technical errors in some translations, by Karolina Surma, #1895 * Warn when inputting non-ascii chars in MicroPython, #1911 * Fix installing for all users in Windows installer, #1119 and #1909 * Prepare Thonny for Flatpak, by Jordan Williams, #1900 and #1912 * Update Polish translation 3.3.11 (2021-06-25) =================== * Fix MicroPython management errors when user code shadows built-in names, #1856 * Fix package manager getting frozen when installing packages, #1871 * Fix problem of MicroPython package manager taking module names for distribution names, #1833 * Fix ugly error in ESP flasher dialog when esptool is not found, #1837 * Fix Tkinter error when using venv created from bundled Python, #1835 * Use 0..6 for weekday when synchronizing RTC via machine, #1868 * Make esptool auto-detect chip type, #1838 * Fix Unix MicroPython time validation (misdiagnosed time offset) * Update dependencies in Thonny+Python bundles * Update Spanish, Polish, Chinese (TW) translations 3.3.10 (2021-05-18) =================== * Restore Python 3.6 compatibility of minipip, #1541 * Fix missing libffi6 error in Linux builds, #767 3.3.9 (2021-05-18) ================== * Don't copy egg-info directories to target location when installing pip-compatible packages for MicroPython, #1541 3.3.8 (2021-05-18) ================== * Support installing regular pip-compatible packages to MicroPython or CircuitPython (so far only upip-compatible packages were supported), #1541 * Fix "error 403" problems when installing MicroPython packages from PyPI, #1822 * Fix error when Object inspector is open and a MicroPython object can't be found by id, #1796 * Reduce memory usage by Thonny's MicroPython helper (store last REPL value in global _ instead of storing N last values in a list), #1797, #1798 * Upgraded several dependencies in binary bundles 3.3.7 (2021-04-30) ================== * Make confugration dialog larger to fit French strings, by sourceperl, #1694 * Fix "_prepare_after_soft_reboot" error in Unix MicroPython mode, #1715 * Support interactive programs with Unix MicroPython, #1725 * Fix read-only filesystem error for CircuitPython in non-English variants of CircuitPython, #1662 * Fix error on right clicking in local file explorer with Italian translation, #1713 * Fix back-end switcher menu position and theme, #1719, #1720 * Fix "pop from empty list" error when MicroPython is having problems, #1586 * Fix MYPYPATH / MyPy not working, #1124 * Highlight unclosed strings even inside unclosed parens, #1770 * Fix problem running code via WebREPL, #1762 * Make Outline show also async, defs #1787 * Don't show full error info when ManagementError doesn't seem to be Thonny's fault, #1788 * Don't show error dialog when querying globals fails (error is shown on the variables table instead), #1789 * Recover from corrupted rpc.sock ("invalid literal for int() with base 10" error), #1745 * Add 3 translated Help files for Spanish, by José Carlos García, #1759 * Add Korean translations of Help files, by Hyungseok Choi, #1758 * Add first version of Finnish translation by Lrasinen * Update translations for Albanian, French, Korean 3.3.6 (2021-03-03) ================== * Fix crash in Shell when negative int-s are evaluated in MicroPython (regression introduced in 3.3.4), #1670 * Fix problems with wm_overrideredirect on macOS with Tk 8.6.11, #1659 * Fix crash in Plotter when more than 10 numbers are plotted, #1648 * Hide unsuitable PYTHONPATH environment variable in macOS, #1651 3.3.5 (2021-02-22) ================== * Fix too short reprs at MicroPython REPL (regression introduced in 3.3.4), #1627 * Fix incorrect presentation of long output lines, #1628 * Fix error in nicer debugger when stepping in generators, #1631 * Fix infinite recursion error when evaluating `globals()` in MicroPython REPL while object inspector is open, #1641 * Update Greek translation 3.3.4 (2021-02-17) ================== * CHANGED: MicroPython time synchronization now sets RTC to local time instead of UTC. This can be changed via a hidden configuration option (https://github.com/thonny/thonny/wiki/MicroPython#advanced-configuration), #1603 * Add time synchronization for RaspberryPi Pico, #1563, #1592 * Skip loading obsolete thonny-pico plug-in, which is now built in, #1575 * Get rid of misleading SSL warning in micropip.py and show a warning about non-MicroPython packages, #1621 * Fix WebREPL connection for MicroPython 1.14 by using regular paste mode instead of the new raw-paste mode, #1613 * Delay importing jedi and asttokens for improved performance, #1556 * Don't assume "dialout" group is required when MicroPython connection fails with permission error, #1286 * Reduce the memory usage of showing global variables by capping object representations to 50 first characters in MicroPython, #1582 * Add Hungarian translation (by Laszlo Kocsis) * Updated translations for German, Korean, Italian, Dutch (by various authors) 3.3.3 (2021-01-21) ================== * Add MicroPython support for Raspberry Pi Pico (https://www.raspberrypi.org/blog/raspberry-pi-silicon-pico-now-on-sale/) * Better support for MicroPython daily builds, #1545, #1553 * Automatically prepend relevant Anaconda directories to PATH. Fixes problem with importing Anaconda's numpy, #1522 * Make custom Python chooser see more interpreters, #1522 * Fix several spelling mistakes, by freddii, #1534 * Update toolbar buttons, when another editor gets selected, fixes wrong button states, #1536 * Catch errors when opening file in system app, #1526 * Fix internal error while using Outline View, #1543 * Fix truncated System Shell environment on macOS, #1529 * Add /usr/local/bin to the PATH of the back-end process if missing, #1131 * Fix error while parsing Pygame Zero error, #1535 * Fix MicroPython completion errors with jedi 0.18, #1560 * Add incomplete Korean language by Augene J. Pak, Fabianus.c, Suk-Hyung Hwang, YEON, $1531 * Add incomplete Albanian translation by Algent Albrahimi * [Technical] Allow older Send2Trash (Fedora doesn't have version 1.5 of this) * [Technical] Remove erroneous executable flags from some files 3.3.2 (2021-01-06) ================== * Fix the problem of missing docstrings, #1481 * Fix MicroPython management error after executing machine.reset(), #1492 * Add support for MicroPython raw paste mode (usable in MicroPython 1.14+), #1498 * Restore MicroPython raw mode as fallback, should fix problems with M5Stick and W600, #1516 * Add syntax highlighting for non-decimal number literals and support underscores, #1482 by Stefan Rothe * Make sure all output from the program gets presented, #1504 * Interrupt current program when running a MicroPython script, #1512 * Add support for Jedi 0.18, #1497 * Fix arguments completions for jedi 0.16+, #1511 * Make micro:bit support a bit more robust, #1515 * Add Persian (Farsi) translation by Farshid Meidani * Add Slovak translation by jose1711 * Add Armenian translation by Avag. sayan * Update Italian and Chinese (TW) translations 3.3.1 (2020-12-06) ================== * Allow installing MicroPython to micro:bit v2 * Fix problem with MicroPython programs creating lot of output very quickly, #1419 * Fix wrong message when saving to MP and device is busy, #1437 * Bump Pyserial version from 3.5b1 to 3.5, fix problem with some ESP devices, #1443 * Fix error when trying to download file from microbit, #1440 * Don't assume anything about conf files in Pi theme, #1436 * Fix error on reseting MicroPython device, #1442 * Fix unwanted output from expession statements in MicroPython, #1441 * Treat double-click in the remote file dialog differently from double-click in the Files view, #1432 * Fix error when closing MP file dialog without name, #1431 * Refactor "File => Rename" command (new label "Move / rename" and you can't "rename" a file on MP device to a file on local disc and vice versa), #1446 * Fix broken links in help pages, #1447 * Use THONNY_USER_DIR/temp for temp files. Fixes printing when default browser is Snap Chrome, #1435 * Fix error when clicking on "Attributes" tab on Object Inspector when no object is selected (MP) #1450 * Updated translations (Spanish an Brasilian Portuguese) * Allow specifying DTR/RTS for serial connection (to avoid restarting ESP on connect), #1462 * Open log window automatically if work dialog encounters error, #1466 * Don't close work dialog automatically if log window is opened, #1465 * Fix dummy MicroPython packages giving ugly errors, #1464 * Fix crashes in Assistant view with Dracula theme, #1463 * Work around Caps lock problem when binding command shortcuts, #1347 3.3.0 (2020-11-15) ================== New & changed ------------- * Removed automatic tabs => spaces conversion and its confirmation dialog, #599 * Added command for replacing tabs with spaces, #1411 * Added option for highlighting tabs (Tools => Options => Editor), #1409 * Added option for indenting with tabs (Tools => Options => Editor), #599 * Add an option to use Tk file dialogs instead of Zenity in Linux, #1404 * Reduce max repr length for MicroPython (1000 instead of 5000) * Forward https_proxy or http_proxy variable to pip, #535 * Allow specifying environment variables for the UI process, #1421 * Remove special support for Friendly-traceback, #1416 * Use exclusive access when connecting to a MP device over a serial port, #1418 Fixes ----- * Make sure expression box for while/for test is located properly, #1134 * In MicroPython backends only warn about failed epoch dectection if sync or validation is required * Don't show ugly traceback in debug mode * Internal error while debugging exceptions, #1403 * Automatically create Thonny user dir in remote machine, #1365 * Fix MicroPython uploading/downloading when started from an expanded dir, #1398 * Fix unrensponsive UI when MicroPython is printing in infinite loop, #1419 * Fix ugly stacktrace, when MicroPython device is disconnected during processing a command, #1420 New and updated translations ---------------------------- * Czech by Petr. moses and Radim * Romanian by Pop Vasile Alexandru * Norwegian (Bokmål and Nynorsk) by Gabriel Slørdahl * Updated Portuguese (BR) by Marcelo de Gomensoro Malheiros * Updated French, Polish, Greek, Spanish, Italian 3.3.0b7 (2020-11-01) ==================== * Add default black fg color to tooltips, #1381, by adzierzanowski * Use paste-mode instead of raw repl for executing code on MP devices, #1386 * Use WebREPL file protocol for uploading files, #1387 * Hide underscored names from autocomplete suggestions unless user already typed '_', #1382, by adzierzanowski * Add command to filebrowser menu for toggling hidden files, #1292 * Fix Unconnected network drive shorcuts make Files explorer broken #1333 * Don't allow save as a file which is already opened, #1310 * Color self and cls like builtins, #1080 * Soft-reboot MicroPython before "Run current script", #1393 * Fix error in clearing squeezed boxes, #1091 * Enhance upload/download dialogs, #1395 * Make "Open System shell" open ssh with remote back-ends * Make "Open System shell" open miniterm with MicroPython back-ends, #1287 * Better interrupt for download, #1320 3.3.0b6 (2020-10-19) ==================== * Clean up backend-switcher menu. 3.3.0b5 (2020-10-19) ==================== * Fixed a regression introduced in b4 -- Thonny crashed on launch when data directory didn't exist yet. 3.3.0b4 (2020-10-18) ==================== New --- * Statusbar with backend switcher, #1356 * Firmware flasher for CircuitPython, #1375, #1351 * Updated firmware flasher for micro:bit, #1351 Changed ------- * Refactor alternative interpreter configuration page, #1079 Fixed ----- * Don't choke when MP management output is wrapped between user input, #1346 * Include ampersand in URL regex in the Shell, #1323 * Dialogs may end up behind the main window, #1158, #1133 * Augment LD_LIBRARY_PATH instead of replacing it, #1008 * Fix "Install from requirements.txt" error, #1344 * File dialog should scroll to top when new folder gets selected, #1345 * Improve MicroPython file write reliability, #1355 * Fix CircuitPython directory creation * Allow selecting venv 'activate' instead of interpreter symlink in the interpreter configuration page, #1079 Technical --------- Improve diagnostic logging, #569 3.3.0b3 (2020-09-07) ==================== * Stop/Restart command now soft-reboots MicroPython device after reaching the prompt * Fixed problem with saving SSH password 3.3.0b2 (2020-09-03) ==================== * Fixed problem with circular imports affecting Python 3.7 * Restored Python 3.5 compatibility 3.3.0b1 (2020-09-03) ==================== New --- * Back-end for remote Python over SSH (try editing and running remote and local scripts and upload/download in the file browser; package manager, system shell, and debuggers don't work yet) * Back-end for remote Unix MicroPython over SSH * Back-end for local Unix MicroPython * Package manager for MicroPython (using micropip.py by Peter Hinch), #1299, see https://forum.micropython.org/viewtopic.php?f=15&t=8787&start=14 * Support Object inspector with MicroPython back-ends, #1309 * Thonny now synchronizes real-time clock of MicroPython devices on connect and before each file operation, #1004 * Allow editing any file as plain text, #1305 * File browser now allows setting default action by extension (open in system default app or in Thonny's editor), #1305 * ESP flash dialog now allows selecting flash mode, #1056 by Rune Langøy * "Save all" command, #1053 by Syed Nasim * Clicking on a value in the Shell selects it and opens in the Object inspector. * By default, after evaluating an expression in the Shell the value will be automatically shown in the Object inspector (if open). See Options => Shell to turn it off. * Object inspector now display more information about numbers (try 1024 or 0.1), #1230 * Support evaluating several expressions at once in the Shell (just like official Python REPL), #795 * Include esptool in binary bundles Changed ------- * Package manager now searches PyPI instead of requiring exact package name, #1300 * File browser now shows remote files below local files. This way local pane won't jump around when switching between local and remote back-ends. * TECHNICAL: Versions of serveral dependencies were updated Fixed ----- * Several intermittent bugs related to fragility of the communication with MicroPython REPL, #1103, #1147 * #1138: Allow semicolon in Shell input with Python 3.8 * #1129: Support terminator as system shell * #772: Allow invoking interrupt command from the menu when the editor has text selected (Ctrl+C would copy then) * #1146, #1159: "No module named pwd" error * #1283: Disable save button after save * Make Replayer work with timestamps without fractional part, #1116 * Don't raise exception when hitting end of undo/redo stack, #1211 by Andrew Scheller * Fix a typo in the code to display dialog. (#1260 by Ankith) Enhanced -------- * Convert keypad movement events to equivalent non-keypad ones, #1107 by Eliot Blennerhassett * Start file-open-dialog in same dir as current file, #1209 by Andrew Scheller * Bash install - do everything inside a new directory (#1203 by Andrew Scheller) * #1145: Provide understandable error message, when Linux installer downloader is run on a non-supported platform (by Andrew Scheller) 3.2.7 (2020-01-22) ================== * TECHNICAL: Skip name hilighter tests for recent Jedi versions 3.2.6 (2020-01-01) ================== * FIXED #1035: Make highlight names work with recent Jedi versions * FIXED #1043: Can't load files from MicroPython device (regression introduced in 3.2.5) * FIXED: Missing "Local files" label on save target selection dialog 3.2.5 (2019-12-25) ================== * CHANGED: Python version in binary bundles upgraded from 3.7.5 to 3.7.6 * CHANGED: MyPy checks are now enabled by default (Tools => Options => Assistant) * CHANGED: New Pylint checks are enabled * UPDATED #32: Thonny can now display/copy/paste Unicode emojis with Python 3.7.6+ / 3.8.1+ in Windows and Linux. Selection can be still wonky, though and emojis can freeze Thonny on macOS. Fixed by https://github.com/python/cpython/pull/16545 * FIXED #815: "Open System Shell" fails when no script is open * FIXED #973: Scrollbar in Help and Assistant acts funny * FIXED #1019: Crash on startup when Shell gets text inserted too soon * FIXED #1023: Accept code completions without parent and full_name * FIXED #1025: Extra imports by Thonny's back-end make stdlib name shadowing more troublesome * FIXED #1026: Allow '+' in image data URI chars in Shell * FIXED #1028: Thonny now has preliminary support for `Friendly Traceback `_. * FIXED: Allow larger images in shell (don't squeeze image URI-s), #401 * FIXED: Fallback to English, when configured language can't be loaded * FIXED: Problem using esptool on PATH 3.2.4 (2019-12-07) ================== * NEW: Turkish translation by M. Burak Kalkan * NEW: Polish translation by Jarek Miszczak * NEW: Partial Italian translation by sailslack * UPDATED: Greek and Spanish translations * CHANGED: XXL bundle now includes also pandas * CHANGED: Make faster tracer show exceptions only with step_over and step_into * CHANGE #1018: Use traditional stack view by default in Simple mode * ENHANCEMENT: Improved performance for Faster debugger (proposed and supported by Raspberry Pi) * FIXED #975: Fix stepping through lambdas with faster debugger * FIXED #977: Don't report certain exceptions in faster debugger * FIXED #983: Propose replacing tabs with spaces only in the editor (not in debugger frames) * FIXED #986: Nicer debugger fails when run with breakpoints only in secondary files * FIXED #987: MicroPython autocomplete problems by adzierzanowski * FIXED #1003: Wrong interpretation of MicroPython file timestamps * FIXED #1005: Avoid testing included MicroPython stubs * FIXED #1015: Indicate disabled toolbar buttons on macOS 3.2.3 (2019-11-03) ================== * NEW: Greek translation by Nikos * UPDATE: Updated several translations (by Vytenis, rnLIKEm, Dleta, Alex ANDRÉ, NathanBnm, LionelVaux, Paul, Eric W, Frank Stengel, ...) * UPDATE: Propose opening files via dialog in case of macOS Catalina permission error (#813). 3.2.2 (2019-11-01) ================== * NEW: ESP plug-in has been merged into main Thonny package * FIXED #219: Implement sending EOF / restart for CPython * FIXED #873: More robust color preference loading in Pi theme * FIXED #876: Don't step into comprehension calls * FIXED #897: Redo shortcut not working in Linux and Mac * FIXED #899: Can't set THONNY_USER_DIR in customize.py * FIXED #904: Don't show remote MicroPython dialogs when device is busy * FIXED #905: Problems with Thonny menu on Mac after closing a dialog * FIXED #911: Allow restoring default scaling factor * FIXED #921: Make MicroPython backend play nicer with device resets * FIXED #923: CircuitPython on Trinket m0 gives small int overflow when listing files * FIXED #925: Save or open problem with network paths * FIXED #927: Visual glitch / ghosting in Expression Box in macOS * FIXED #928: Tooltips stay on top in macOS * FIXED #929: Indicate dirty state in macOS close button * FIXED #933: Scaling doesn't work right for Treeviews (Files, Variables) * FIXED #934: Pad button captions for certain languages * FIXED #936: Problem uploading files to some STM boards * FIXED #939: More robust handling of different line endings * FIXED #943: Wrong syntax highlighting with triple quoted string * FIXED #946: Handle broken UTF-8 codepoints in MicroPython output * FIXED #951: Use standard tabstops for program output * FIXED #953: Allow running system commands with MP back-end * FIXED #957: Wrong encoding in multiprocessing output * FIXED #960: File browser is not working in replayer * FIXED #966: Thonny encounters "internal error" in programs calling exit() * FIXED #969: Provide nicer message, when MicroPython backend can't get to the REPL * FIXED: Don't apply theming to menu in macOS (menu items were dull with dark themes) 3.2.1 (2019-09-06) ================== * NEW: Add European Portuguese translation (by Emanuel Angelo) * NEW: Add Lithuanian translation (by Vytenis) * NEW: Add Ukrainian translation (by borpol) * FIXED #802: Avoid scary traceback on MicroPython disconnect * FIXED #840: Problems with file dialogs in macOS 10.15 * FIXED #843: Make right-click select items in Files view in macOS * FIXED #845: Crash with older ESP plug-in * FIXED #851: Ignore warnings when exporting variables * FIXED #854: Make single instance mode work in multi-user systems * FIXED #855: Wrong coloring with paren matching * FIXED #859: Support relative paths when opening files with Thonny from command line * FIXED #874: Multiline strings break stepping focus background * FIXED: Dutch translation was inproperly set up * FIXED: Internal error in Object Inspector (by Emanuel Angelo) * FIXED: Problem with compacting user event logs * TECHNICAL: Make tests run with Python 3.8 3.2.0 (2019-08-12) ================== * FIXED #849: Uploading single file to MicroPython doesn't work * UPDATE: Updated translations 3.2.0rc1 (2019-08-09) ===================== * NEW: Several new commands for Files view (New directory, Move to Trash, Delete, Upload (to MicroPython device), Download (from MicroPython device), ...) * CHANGED: MicroPython files are now displayed in the upper pane of Files view * CHANGED: Saving or loading editor content to/from MicroPython device displays progress bar * TECHNICAL: New dependency: Send2Trash 3.2.0b7 (2019-07-19) ==================== * FIXED: Problem with translation markers disturbing import 3.2.0b6 (2019-07-19) ==================== * NEW: BBC micro:bit plug-in has been merged into main Thonny package * CHANGED: micro:bit flasher now downloads latest MicroPython from GitHub * FIXED: Problems with micro:bit file browser * FIXED #808: multiprocessing doesn't work in Windows * FIXED #814: Ctrl+V inserts text twice in Windows (regression introduced in previous betas) 3.2.0b5 (2019-07-16) ==================== * FIXED #810: Use regular spacing in simple mode toolbar 3.2.0b4 (2019-07-14) ==================== * FIXED #809: Advertise indent/dedent in Edit menu * FIXED: Marked more terms for translation * FIXED: Updated Estonian translation 3.2.0b3 (2019-07-13) ==================== * FIXED #803: %cd gives error on MP/CP backend * FIXED #804: Changing directories does not show in FilesView for MP/CP * FIXED #805: Thonny user dir was not created at startup 3.2.0b2 (2019-07-13) ==================== * NEW: Former thonny-pi plug-in (containing Raspberry Pi theme) is now part of main Thonny package * NEW: Former thonny-circuitpython plug-in (containing CircuitPython back-end) is now part of main Thonny package * NEW: pip GUI now allows installing from requirements.txt file * NEW: Portable/thumbdrive bundles for Windows, macOS and Linux (https://github.com/thonny/thonny/wiki/DeploymentOptions#portable-version) * FIXED #188: Tkinter windows won't close on macOS * FIXED #361: Include Python development files in binary bundles * FIXED #488: Modal dialogs may get stuck * FIXED #639: Unset misleading environment variables in Windows launcher * FIXED #676: Can't close matplotlib window when MacOSX backend is used * FIXED #706: In Linux Thonny hangs on close sometimes * FIXED #800: Can't load large files * FIXED: Plotter now listens for theme changes (ie. changes background without restart) * CHANGED: Welcome dialog is not show on Raspberry Pi * CHANGED: Usage event logging is now disabled by default and can be enabled in Tools => Options => General * CHANGED: MicroPython back-ends don't interrupt running process on connecting * TECHNICAL: MicroPython back-end got a big refactoring 3.2.0b1 (2019-06-17) ==================== * NEW: [Work in progress] UI and help content can be translated to other languages (big thanks to cspaier, Georges Khaznadar and translators). See docs/translate.md for contrubution instructions. * NEW: Shell supports ANSI color codes and line overwriting with ``\b`` and ``\r``. See "Help => Shell" for more info. * NEW: Shell now has extension called "Plotter", which visualizes series of numbers printed to the standard output. See "Help => Plotter" for more info. * NEW: Shell presents PNG data URL-s printed to stdout as images. Try print("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==") * NEW: Automatic change of working directory is now optional (Tools => Options => Run & Debug) * NEW: Files view now allows setting working directory (double-click on folder name) * NEW: Files view allows browsing device's filesystem with MicroPython back-ends * NEW: Files from MicroPython devices can be opened in the editor and edited directly * NEW: You can now choose which debugger is invoked when clicking on the "Debug" toolbar button (Tools => Options => Run & Debug) * NEW: On first run Thonny presents a dialog for selecting UI language and initial settings ("standard" or "Raspberry Pi"). With Raspberry Pi settings Thonny will start in simple mode, preferred debugger set to "faster" and UI theme set to "Raspberry Pi". * NEW: Shell IO font can be configured (Tools => Options => Fonts & Themes). By André Roberge * NEW: Support for running Flask programs with F5. Also fixed several issues which prevented running and debugging Flask programs. See "Help => Web development with Flask" for more info. * NEW: "File => Save copy" allows saving current editor content to a different location without changing editor file name. * FIXED #630: Pressing up then down in shell doesn't leave shell in previous state. Fixed by Chad Purdy * FIXED #691: No Show shell on run with no input() prompt. Fixed by Chad Purdy * FIXED #692: Cancelling Save As dialog causes error. Fixed by Chad Purdy * FIXED #700: Allow viewing all files in file dialogs in Linux * FIXED #703: Exception view was not legible with dark theme * FIXED #704: Suggest current filename with Save As. Fixed by Илья Кругликов * FIXED #708: Error when stacktrace includes Cython frames. * FIXED #711: Thonny can now handle UNC paths * FIXED #719: Buttons are too narrow in Search/Replace dialog * FIXED #725: When saving a file, respect the original fileformat. By badukaire * FIXED #727: Respect fileformat for unix files too. By badukaire * FIXED #731: Right click menu disappears immediately and executes unwanted Undo action * FIXED #738: Window appears lower on each start * FIXED #749: "Focus shell" should bring you to a new prompt. By Ivoz * CHANGED: In order to work around ``tkinter.Text`` performance problems, Shell squeezes very long lines into a button. The button opens a dialog for expanding, viewing or copying those lines. Shell also deletes old output to remain responsive. * CHANGED: Various changes in simple mode (Zoom and Quit buttons, merging Run and Resume buttons, automatic display of Variables view). * CHANGED: Disabled Tk clipboard management workaround in Linux (occasionally caused UI freezes). This means clipboard becomes emptied after closing Thonny. * CHANGED: MicroPython commands from "Device" menu have been redesigned (use Files view instead) or moved to other menus (Run and Tools). The goal is to get rid of Device menu and keep only magic commands which make sense from the back-end perspective. Several of these features were proposed and supported by Raspberry Pi Foundation. 3.1.2 (2019-02-13) ================== * FIXED: Make Terminal features work in Windows again * FIXED #685: Print cuts lines * FIXED #686: Stepping over user modules can be too slow * ENHANCEMENT: Include pip in binary bundles 3.1.1 (2019-02-09) ================== * FIXED #674: Print doesn't work on Mac * FIXED #675: Make focus editor / shell shortcuts usable on Mac * FIXED #677: Debugging fails with extended slice syntax 3.1.0 (2019-01-28) ================== * NEW: "Run => Pygame Zero mode" allows running Pygame Zero programs with F5 * NEW: Support for Birdseye debugger (Run => Debug current script (Birdseye)) by Alex Hall * NEW: Notes view for writing down code snippets, task descriptions, etc. * NEW: Allow running current script in system terminal * NEW: "File => Print..." allows printing current script (via default web browser) * NEW: Shell's context menu now has editing commands * ENHANCEMENT: Open the Shell window on Run if it is not open * ENHANCEMENT: More robust support for running system commands in Thonny Shell (with ! prefix) * ENHANCEMENT: Allow switching off Pylint and/or MyPy checks * ENHANCEMENT: Make it clear how to exit Heap mode (with notification box in the upper-right corner of the main window) * FIXED #621: Holding Enter in the Shell causes a crash * FIXED #623: Parameters code completion error * FIXED #627: Debugging stops after raise statement * FIXED #628: Wrong line highlighted when stepping in for-loop * FIXED #629: Interrupting system command (!) shows ugly traceback * FIXED #633: pasting can't affect read-only text anymore * FIXED #641: Better font scaling in Linux (see Tools => Options => General for more control) * FIXED #646: Simple open file to edit from command line failing * FIXED #655: Invalid f-string crashes Assistant * FIXED #666: Make stdin iterable * FIXED: Solved several problems related to stepping through raising an exception * FIXED: Issues with automatic indentation (Thanks to Alex Hall!) * CHANGED: Use Konsole as terminal in KDE * CHANGED: "Tools => Open system shell" now shows relevant commands differently * CHANGED: Make Assistant's MyPy checks disabled by default * CHANGED: Source code now lives at GitHub (https://github.com/thonny/thonny) 3.0.8 (2018-11-15) ================== * FIXED #424: Font scaling problems in Linux * FIXED #584: Guard against bad repr calls * TECHNICAL: Reduced required pyserial version (Fedora only has 3.1) 3.0.8 (2018-11-15) ================== * FIXED #597: The directory with Python scripts may not be in path for executing system commands from shell * FIXED: Make executing shell commands compatible with Python 3.5 * FIXED: Make MyPy support compatible with older MyPy versions * FIXED: Make turtle.pyi compatible with Python 3.5 and remove Windows linebreaks * FIXED: MyPy error col offset 3.0.7 (2018-11-14) ================== * FIXED #592: MyPy doesn't work when cwd == sys.prefix * FIXED #593: No-message exceptions crash the Assistant * FIXED #595: Running system commands causes an error * FIXED #596: Arguments are ignored when running system commands from shell in Posix 3.0.6 (2018-11-13) ================== * FIXED #538: Turtle programs may give false warnings (Typeshed stubs were not packaged) * FIXED #586: Import interception mechanism fails for some modules * FIXED #591: Assistant fails when filename is missing from error info 3.0.5 (2018-10-26) ================== * FIXED #573: "Highlight matching names" and "Highlight local variables" makes editor very slow * FIXED #574: Error in outline * FIXED #578: resizing local variable pane in debugger causes error 3.0.4 (2018-10-22) ================== * FIXED #564: In Windows "Highlight local variables" and "Higlight matching names" cause Thonny to load Jedi files 3.0.3 (2018-10-21) ================== * FIXED: Regression from 3.0.2 (incomplete code refactoring) 3.0.2 (2018-10-21) ================== * FIXED #563: Problems with HeapView and EventsView * FIXED #565: Don't replace tabs in shell 3.0.1 (2018-10-17) ================== * FIXED: Problems with executing "Run" and "Debug" commands together with "cd" command * FIXED: Editor file name issues * FIXED: MicroPython %cat command failed over serial 3.0.0 (2018-10-16) ================== * CHANGED: Line numbers are now visible by default * CHANGED: Stack and Assistant views are now in the bottom-right corner * CHANGED: Shell doesn't show full path of bundled interpreters anymore * ENHANCEMENT #555: Internal errors are now shown with more suitable dialog * FIXED #170: Command+k for clearing shell in Mac * FIXED #547: Recommend "..." button when plug-ins latest stable isn't suitable for this Thonny version * FIXED #548: Prevent inconsistent use of tabs and spaces error (when pasting or opening text containing tabs, Thonny proposes to replace them with spaces) * FIXED #557: Default window size too small for simple mode * FIXED #559: Make text copied to clipboard available even after closing Thonny * FIXED: Implemented workaround for https://bugs.python.org/issue34927 * TECHNICAL: MicroPython backend now shows the source of failing internal commands 3.0.0rc1 (2018-10-08) ===================== * ENHANCEMENT: Documented several features (see Help => Help contents) * FIXED #523: Open system shell doesn't work with pip 10 * FIXED #534: Add shortcut for step-back * FIXED #538: Turtle programs give false warnings 3.0.0b6 (2018-09-30) ==================== * CHANGED: In order to avoid pollution of user home directory, the configuration file and logs are now stored in directories recommended by platform style guides (%APPDATA%/Thonny on Windows, ~/Library/Thonny on Mac and ~/.config/Thonny on Linux). Old configuration and user logs will be imported on first run. * CHANGED: "Back end" configuration page was renamed to "Interpreter" (as it was in Thonny 2.1) * CHANGED: Python version in Thonny+Python bundles upgraded to 3.7.1rc1 * NEW: File menu received a submenu for easy opening of recent files. * ENHANCEMENT: Add shortcut for clearing shell (Ctrl+L) * ENHANCEMENT: Warn when script is saved with a common library module name (eg. turtle.py) * ENHANCEMENT: Allow switching between regular and simple mode (Tools => Options => General) * FIXED #72: "View => Full screen" (in Expert mode) is now also available on Mac * FIXED #262: Add ability to select an autocomplete suggestion with TAB * FIXED #316: Nice debugger doesn't handle named arguments properly * FIXED #339: Allow disabling sound Tools => Options => General * FIXED #389: AST marker fails with dict merge * FIXED #478: Add option to reopen all files on start-up * FIXED #479: Make Thonny save configuration when "Quit"-ed on Mac * FIXED #480: Thonny now properly remembers opened files * FIXED #498: Open System Shell doesn't work on Raspberry * FIXED #501: Assistant feedback preview link doesn't work on mac * FIXED #510: Error when listing available interpreters in config page * FIXED #518: add menu item: "device" / "Upload current script" for MicroPython (by Jens Diemer) * FIXED: Object inspector can show images (again) * FIXED: Pylint and MyPy processes don't hang anymore with large output. 3.0.0b5 (2018-09-01) ==================== * FIXED: requirements.txt was missing mypy 3.0.0b4 (2018-08-31) ==================== * NEW: When program has syntax error or crashes with an exception, Assistant pane opens and tries to help diagnose the problem. Uses Pylint, MyPy and custom dynamic analysis under the hood. (Big "Thank you!" to Raspberry Pi Foundation for the support!) * ENHANCEMENT: Resizing the main window doesn't mess up views' layout anymore. * ENHANCEMENT: Better support for debugging f-strings. * ENHANCEMENT: Nice debugger now recovers better when it is not able to understand a program. * FIXED #496: Regression which caused Variables view to skip variables updates during "nicer debugging". * FIXED #440: Copy&paste over a selection will now delete the text selection first (was problem for some Linuxes) * FIXED: Removed a nasty debugging statement left into b3, which may cause a crash in the end of debugging. 3.0.0b3 (2018-08-11) ==================== * FIXED: Various problems with pip GUI * FIXED: Variables view misses events * FIXED: Error when last back-end was not available anymore * TECHNICAL: Implemented ChoiceDialog 3.0.0b2 (2018-08-11) ==================== * FIXED: problems with pip GUI in virtualenv 3.0.0b1 (2018-08-11) ==================== Note: This version is successor of 2.2.0b4 and 2.1.21. Stable release of 2.2.0 was skipped. (Incrementing the major version felt more appropriate considering the amount of new and changed features.) * NEW: Thonny now has two debug modes: beside original AST based debug mode (the "nicer" one, Ctrl+F5) there is now also line-based mode (the "faster" one, Shift+F5), which is not so intuitive but much more efficient. * NEW: Both debug modes now support breakpoints (switch on line numbers and double-click on the margin). Big thanks to Raspberry Pi Foundation for the support! * NEW: Alternative presentation for call stack (in single window, just like in most debuggers; see Tools => Options => Debugger) * NEW: Clicking on the links in stacktrace now shows the variables of those frames. * NEW: You can re-run your changed program without closing it first (relevant for graphical programs). * NEW: Checking "Run => Dock user windows" makes your Tkinter windows stay on top and appear always on the same location. This allows tweaking your turtle programs while looking at current output. * NEW: "View => Program arguments" opens a box where you can write the argument string for your program * NEW: "Tools => Options => Backend => Custom Python interpreter" now allows creating virtual environments * NEW: "Tools => Manage packages" now allows installing new packages with all CPython backends, not only virtual environments. If the backend is not a virtual environment it installs to user site packages (with `pip install --user`) * NEW: Thonny now includes basic support for MicroPython (former `thonny_microbit` plug-in). See https://bitbucket.org/plas/thonny/wiki/MicroPython for more info. * CHANGED: Upgraded Python to version 3.7.0 in Thonny+Python bundles * CHANGED: Dropped support for Python 3.4 (both for front-end and back-end) * CHANGED: Dropped support for Tk 8.5. All bundles (including Mac's) now come with Tk 8.6.8 * CHANGED: Default back-end is now "Same as front-end" (was "A special virtual environment"). This makes deployment easier in classroom setting and it is simpler scheme in general. "Special virtual environment" backend may be removed in future versions. * CHANGED: Plug-ins will be now installed to regular user site packages directory (was ~/.thonny/plugins) * CHANGED: If Thonny (front-end) is run from a virtual environment, user directory (with configuration.ini and logs) will be .thonny under virtual environment's root directory (instead of usual ~/.thonny). * ENHANCEMENT: Better Windows installer (run as administrator for all-users install) * ENHANCEMENT: thonny.exe is now digitally signed * ENHANCEMENT: On Linux Thonny now uses native file dialogs (via zenity) * ENHANCEMENT: Nicer debugger can now step into your functions defined in other modules * ENHANCEMENT: Nicer debugger can now stop before the assignement of loop variable in for-loops * ENHANCEMENT: "Run to cursor" can be called by right-clicking desired line in the editor and selecting the command from context menu * ENHANCEMENT: Great time and memory optimizations in nicer debug mode. The ability to step back in time is not so expensive anymore. * ENHANCEMENT: Thonny now detects external file modifications and proposes to reload * ENHANCEMENT: New Windows installer (run as administrator for all-users install) * FIXED #163: Uninstaller now correctly removes "Open with Thonny" context menu entry * FIXED #340: Validate geometry before loading * FIXED #358: sys.exit() in user programs doesn't show stacktrace anymore * FIXED #363: subprocess.run causes Thonny backend to hang * FIXED #375: Files are now saved with linebreaks suitable for current platform * FIXED #419: logging doesn't work in user programs * FIXED #422: Make Ctrl+C, Ctrl+V etc. work on Greek keyboard * FIXED #440: In Linux paste over selection doesn't remove the selection * FIXED #450: Locals marker doesn't work with jedi 0.12 * FIXED #468: Problem with changing backend interpreter * FIXED #471: Problem when Thonny uses jedi 0.11 or newer * FIXED #475: Heap view misbehaving on startup * FIXED: "Run => Run to cursor" works again * FIXED: Thonny now honors PEP 263 style encoding markers when saving files. (UTF-8 is still the default) * FIXED: Problem when jedi 0.10 and parso are both installed * TECHNICAL: Plug-in writers can now control each import in user programs (thonny.backend.VM.add_import_handler) * TECHNICAL: Communication messages between back-end and front-end were changed * TECHNICAL: Thonny doesn't tweak PYTHONUSERBASE anymore to put plugins under ~/.thonny. Regular user site packages is used instead * TECHNICAL: Dependency to "packaging" introduced in 2.2 betas is now replaced with "setuptools" 2.2.0b4 (2018-06-05) ==================== * FIXED: Couldn't open menus with None backend 2.2.0b3 (2018-06-05) ==================== * FIXED #425: Too big automatic scaling * FIXED #427: Can't run files with spaces in filename * FIXED: Fixed a bug when debugging and encountering an exception (by Alar Leemet) * ENHANCEMENT: Show indicator about stepping in the past in the text of editor tabs * ENHANCEMENT: Added Thonny version guards for installing plug-ins * EXPERIMENTAL: Preliminary support for running system commands in Thonny shell (eg. `!ls` or `!dir`) * TECHNICAL: thonny.exe in Windows bundle is now signed * TECHNICAL: Delay starting of Runner until UI is shown * TECHNICAL: Various enhancements to support MicroPython plug-ins 2.2.0b2 (2018-05-04) ==================== * FIXED: Options dialog crashes when Variables view hasn't been created yet 2.2.0b1 (2018-05-04) ==================== * NEW: Added support for stepping back in time during debugging (Run => Step back) by Alar Leemet. If you accidentally stepped over an interesting part of code, then now you can step back and step into. * NEW: Added support for UI and syntax theming (https://bitbucket.org/plas/thonny/wiki/Theming) * NEW: Added several built-in dark themes * NEW: Added support for display scaling / high-DPI screens (Tools => Options => General) * NEW: Added closing buttons to the tabs of all views * NEW: Added support for (CPython) back-end plug-ins (https://bitbucket.org/plas/thonny/wiki/Plugins) * NEW: Current editor line can be highlighted (Tools => Options => Editor) * NEW: Thonny can be started in simple mode (https://bitbucket.org/plas/thonny/wiki/Modes) * NEW: Variables view now allows viewing variables from other modules beside __main__ (Tools => Options => General) * CHANGED: Dropped support for Python 3.4 (both for front-end and back-end) * CHANGED: Reorganized back-end configuration ("Tools => Options => Back-end" instead of "Tools => Options => Interpreter") * CHANGED: The roles of Interrupt and Stop commands are now more clear: Stop always restarts the backend and Interrupt only tries to interrupt * CHANGED: Editing the running program doesn't interrupt it anymore. * CHANGED: Object inspector now shows attributes and object overview on different tabs * CHANGED: Can't set thonny.THONNY_USER_DIR directly in customize.py anymore (https://bitbucket.org/plas/thonny/wiki/DeploymentOptions) * CHANGED: For plug-in writers: Unified early and late plug-ins (load_early_plugin should be renamed to load_plugin) * CHANGED: For plug-in writers: get_workbench and get_runner moved from thonny.globals to thonny * FIXED #358: Hide the stacktrace of SystemExit * FIXED #368: "Open system shell" doesn't work in Xfce (fix by Miro Hrončok) * FIXED #370: Made zooming with Ctrl++ / Ctrl+- work on the numpad on Linux * FIXED #372: Now it's possible to specify a link as backend interpreter (fix by Miro Hrončok) * FIXED #396: exec causes range marker to crash * FIXED #403: Window width may become negative * TECHNICAL: Changed the location and sharing of backend.py, common.py, ast_utils.py * TECHNICAL: Cleaner approach for sharing jedi with the back-end * TECHNICAL: Package manager now uses pypi.org instead of pypi.python.org * TECHNICAL: Several changes in Runner and BackendProxy interface * TECHNICAL: Saving an editor now forces writing to disk (see https://learn.adafruit.com/adafruit-circuit-playground-express/creating-and-editing-code#1-use-an-editor-that-writes-out-the-file-completely-when-you-save-it) 2.1.22 (2018-08-20) =================== Happy re-independence day to Estonia! * ENHANCEMENT: Less intrusive logging for AST marking problems * FIXED #340: Validate geometry before loading * FIXED #363: subprocess.run causes Thonny backend to hang * FIXED #419: logging doesn't work in user programs * FIXED #440: In Linux paste over selection doesn't remove the selection * FIXED #487: Use PyPI.org and turn off pip warnings in package manager * FIXED #490: Debugger gets confused with f-strings * FIXED: In case of back-end problems, kill backend instead of resetting * FIXED: Colorize f-string prefixes 2.1.21 (2018-07-17) =================== * FIXED #471: Another problem when Thonny uses jedi 0.11 or newer 2.1.20 (2018-07-16) =================== * FIXED: Problem when jedi 0.10 and parso are both installed 2.1.19 (2018-07-16) =================== Updates in this version are relevant only on Windows * FIXED #467: Error when running Thonny with pythonw on Windows (regression from 2.1.18) * ENHANCEMENT: New Windows installer (run as administrator for all-users install) * ENHANCEMENT: Upgraded Python to version 3.6.6 in Thonny+Python bundles 2.1.18 (2018-06-22) =================== * FIXED #450: Locals marker doesn't work with jedi 0.12 2.1.17 (2018-03-21) =================== * FIXED #409: Package manager crashed after release of pip 9.0.2 2.1.16 (2017-11-10) =================== * Tests moved under thonny package * Tests included in the source distribution * More icons included in the source distribution 2.1.15 (2017-11-07) =================== * Removed StartupNotify from Linux .desktop file (StartupNotify=true leaves cursor spinning in Debian) 2.1.14 (2017-11-02) =================== * Added some Linux-specific files to source distribution. No new features or fixes. 2.1.13 (2017-10-29) =================== * Temporary workaround for #351: Locals and name highlighter occasionally make Thonny freeze * Include only required licenses in source dist 2.1.12 (2017-10-13) =================== * FIXED #303: Allow specifying same interpreter for backend as frontend uses * FIXED #304: Allow specifying backend interpreter by relative path * FIXED #312: Closing unsaved tab causes error * FIXED #319: Linux install script needs quoting around the path(s) * FIXED #320: Install gets recursive if trying to install within extracted tarball * FIXED #321: Linux installer fails if invoked with relative, local user path * FIXED #334: init.tcl not found (Better control over back-end environment variables) * FIXED #343: Thonny now also works with jedi 0.11 2.1.11 (2017-07-22) =================== * FIXED #31: Infinite print loop freezes Thonny * FIXED #285: Previous used interpreters are not shown in options dialog * FIXED #296: Make it more explicit that pip GUI search box needs exact package name * FIXED #298: Python crashes keep backend hanging * FIXED #305: Variables table doesn't get updated, if it's blocked by another view 2.1.10 (2017-06-09) =================== * NEW: More flexibility for classroom setups (see https://bitbucket.org/plas/thonny/wiki/ClassroomSetup) * FIXED #276: Copy with Ctrl+C causes bell * FIXED #277: Triple-quoted strings keep keyword coloring * FIXED #278: Paste in shell causes bell * FIXED #281: Wrong unindentation with SHIFT+TAB when last line does not end with linebreak * FIXED #283: backend.log path doesn't take THONNY_USER_DIR into account * FIXED #284: Internal error when saving to a read-only folder/file (now proposes to choose another name) 2.1.9 (2017-06-01) ================== * FIXED #273: Memory leak in editor margin because of undo log * FIXED #275: Updating line numbers is very inefficient * FIXED: Pasted text occasionally was hidden below bottom edge of the editor * FIXED: sys.exit() didn't really close the backend 2.1.8 (2017-05-28) ================== * ENHANCEMENT: Code completion with Tab-key is now optional (see Tools => Options => Editor) * ENHANCEMENT: Clicking on the editor now closes code completion box * CHANGED: Code completion box doesn't offer names starting with double underscore anymore. * FIXED: Error caused by too fast typing with open code completions box * ENHANCEMENT: Find/Replace dialog can now be operated with F3 * ENHANCEMENT: Find/Replace pre-selects previously used search string * ENHANCEMENT: Find/Replace dialog doesn't block main window anymore * FIXED: Find/Replace doesn't ignore spaces in search string anymore * FIXED: Closed views reappeared after restart if they were only views in that notebook * FIXED #264: Debugger fails with with conditional list comprehension * FIXED #265: Error when using two word search string in pip GUI * FIXED #266: Occasional incorrect line numbering * FIXED #267: Kivy application main window didn't show in Windows * TECHNICAL: Better diagnostic logging 2.1.7 (2017-05-13) ================== * CHANGED: pip GUI now works in read-only mode unless backend is a virtual environment * FIXED: Error when non-default backend was used without previously generated Thonny-private virtual environment 2.1.6 (2017-05-12) ================== * FIXED #260: Strange behaviour when indenting with TAB * FIXED #261: Editing a triple-quoted string breaks coloring in following lines * FIXED: Made outdated pip detection more general 2.1.5 (2017-05-09) ================== * FIXED: Jedi version checking problem 2.1.4 (2017-05-09) ================== (This release is meant for making Thonny work better with system Python 3.4 in Debian Jessie) * FIXED #254: "Manage plug-ins" now gives instructions for installing pip if system is missing it or it's too old * FIXED #255: Name highlighter and locals marker are now quietly disabled when system has too old jedi * FIXED: Virtual env dialog now closes properly * TECHNICAL: SubprocessDialog now has more robust returncode checking in Linux 2.1.3 (2017-05-09) ================== * FIXED #250: Debugger focus was off by one line in function frames * FIXED #251: Debugger timing issue (wrong command type in the backend) * FIXED #252: Debugger timing issue (get_globals and debugger commands interfere) * FIXED #253: Creating default virtual env does not work when using Debian python3 without ensurepip 2.1.2 (2017-05-08) ================== * FIXED #220 and #237: Icon problems in Linux tasbar. * FIXED #245: Tooltips not working in Mac * FIXED #246: Current script did not get executed if cursor was not in the end of the shell * FIXED #249: Reset, Run and Debug caused double prompt 2.1.1 (2017-05-03) ================== * FIXED #241: Some menu items gave errors with micro:bit backend. * FIXED #242: Focus got stuck on first run (no entry was possible neither in shell nor editor when initialization dialog closed) 2.1.0 (2017-05-02) ================== * TECHNICAL: Changes in diagnostic logging 2.1.0b11 (2017-04-29) ===================== * TECHNICAL: Implemented more robust approach for installing Thonny plugins 2.1.0b10 (2017-04-29) ===================== * CHANGED: Installed plugins now end up under ~/.thonny/plugins * TECHNICAL: Backend preparation now occurs when main window has been opened 2.1.0b9 (2017-04-28) ==================== * FIXED: Backend related regression introduced in b8 2.1.0b8 (2017-04-27) ==================== * CHANGED: (FIXED #231) Stop/Reset button is now Interrupt/Reset button (tries to interrupt a running command instead of reseting. Resets if pressed in idle state) * FIXED #232: Ubuntu showed pip GUI captions with too big font * FIXED #233: Thonny now remembers which view was on top in a panel. * FIXED #234: Multiline support problems in shell (trailing whitespace was causing trouble) * FIXED: pip GUI shows latest version number when there is no stable version. * FIXED: pip GUI now can handle also packages without PyPI presence * TECHNICAL: Backends are not sent Reset command for initialization anymore. 2.1.0b7 (2017-04-25) ================== * FIXED: Removed some circular import to support Python 3.4 * FIXED: pip GUI now also lists installed pre-releases * EXPERIMENTAL: GUI for installing Thonny plug-ins (Tools => Manage plug-ins...) * TECHNICAL: Thonny+Python bundles again include pip (needed for installing plug-ins) * TECHNICAL: Refactored creation of several widgets to support theming * TECHNICAL: THONNY_USER_DIR environment variable can now specify where Thonny stores user data (conf files, default virtual env, ...) 2.1.0b6 (2017-04-19) ================== * ENHANCEMENT: Shell now shows location of external interpreter as welcome text * FIXED #224: Tab-indentation didn't work if tail of the text was selected and text didn't end with empty line * FIXED: Tab with selected text occasionally invoked code-completion * TECHNICAL: Tweaks in Windows console allocation * TECHNICAL: Thonny+Python bundles don't include pip anymore (venv gets pip via ensurepip) 2.1.0b5 (2017-04-18) ================== * FIXED: Typo in pipGUI (regression introduced in b4) 2.1.0b4 (2017-04-18) ==================== * CHANGED: If you want to use Thonny with external Python interpreter, then now you should select python.exe instead of pythonw.exe. * FIXED #223: Can't interrupt subprocess when Thonny is run via thonny.exe * FIXED: Private venv didn't find Tcl/Tk in ubuntu (commit 33eabff) * FIXED: Right-click on editor tabs now also works on macOS. 2.1.0b3 (2017-04-17) ==================== * NEW: Dialog for managing 3rd party packages / a simple pip GUI. Check it out: "Tools => Manage packages" * NEW: Shell now supports multiline commands * ENHANCEMENT: Window title now shows full path and cursor location of current file. * ENHANCEMENT: Editor lines can be selected by clicking and/or dragging on line-number margin (thanks to Sven). * ENHANCEMENT: Most programs can now be interrupted by Ctrl+C without restarting the process. * ENHANCEMENT: You can start editing the code that is still running (the process gets interrupted automatically). This is handy when developing tkinter applications. * ENHANCEMENT: Tab can be used as alternative code-completion shortcut. * ENHANCEMENT: Recommended pip-command now appears faster in System Shell. * ENHANCEMENT: Alternative interpreter doesn't need to have jedi installed in order to provide code-completions (see #171: Code auto-complete error) * ENHANCEMENT: Double-click on autocomplete list inserts the completion * EXPERIMENTAL: Ctrl-click on a name in code tries to locate its definition. NB! Not finished yet! * CHANGED: Bundled Python version has been upgraded to 3.6.1 * CHANGED: Bundled Python in Mac and Linux now uses SSL certs from certifi project (https://pypi.python.org/pypi/certifi). * REMOVED: Moved incomplete Exercise system to a separate plugin (https://bitbucket.org/plas/thonny-exersys). With this got rid of tkinterhtml, requests and beautifulsoup4 dependencies. * FIXED #16: Run doesn't clear variables (again?) * FIXED #98: Nested functions crashed the debugger. * FIXED #114: Crash when trying to change interpreter in macOS. * FIXED #142: "Open system shell" failed when Thonny path had spaces in it. Paths are now properly quoted. * FIXED #154: Problems with Notebook tabs' context menus * FIXED #159: Debugging list or set comprehension caused crash * FIXED #166: Can't delete one of two spaces with backspace * FIXED #180: Right-click doesn't focus editor * FIXED #187: Main modules launched by Thonny were missing ``__spec__`` attribute. * FIXED #195: Debugger crashes when using generators. * FIXED #201: "Tools => Open Thonny data folder" now works also in macOS. * FIXED #211: Linux installer was failing when using ``xdg-user-dir`` (thanks to Ryan McQuen) * FIXED #213: In single instance mode new Window doesn't get focus * FIXED #217: Debugger on Python 3.5 and later can't handle splat operator * FIXED #221: Context menus in Linux can now be closed by clicking elsewhere * FIXED: Event logger did not save filenames (eb34c5d). * FIXED: Problem in replayer (db78855). * TECHNICAL: Bundled Jedi version has been upgraded to 0.10.2. * TECHNICAL: 3rd party Thonny plugins must now be under ``thonnycontrib`` namespace package. * TECHNICAL: Introduced the concept of "eary plugins" (plugins, which get loaded before initializing the runner). * TECHNICAL: Refactored the interface between GUI and backend to allow different backend implementations * TECHNICAL: Previously, with bundled Python, Thonny was using nasty tricks to force pip install packages install under ~/.thonny. Now it creates a proper virtual environment under ~/.thonny and uses this as the backend by default (instead of using interpreter running the GUI directly). * TECHNICAL: Automatic tkinter updates on the backend are now less invasive 2.0.7 (2017-01-06) ================== * FIXED: Making font size too small would crash Thonny. * FIXED: Another take on configuration file corruption. * FIXED: Shift-Tab wasn’t working in some cases. * FIXED #165: "Open system shell" did not add Scripts dir to PATH in Windows. * FIXED #183: ``from __future__ import`` crashed the debugger. 2.0.6 (2017-01-06) ================== * FIXED: a bug in Linux installer (configuration file wasn’t created in new installations) 2.0.5 (2016-11-30) ================== * FIXED: Corrected shift key detection (a82bd4d) 2.0.4 (2016-10-26) ================== * FIXED: Configuration file was occasionally getting corrupted (for mysterious reasons, maybe a bug in Python’s configparser) * FIXED #104: Negative font size crashed Thonny * FIXED #143: Linux installer fails if desktop isn't named "Desktop". (Later turned out this wasn't fixed for all cases). * FIXED #134: "Open system shell" doesn't work in Centos 7 KDE 2.0.3 (2016-09-30) ================== * FIXED: Quoting in "Open system shell" in Mac. Again. 2.0.2 (2016-09-30) ================== * FIXED: Quoting in "Open system shell" in Mac. 2.0.1 (2016-09-30) ================== * FIXED #106: Don't let user logs grow too big 2.0.0 (2016-09-29) ================== * NEW: Added code completion (powered by Jedi: https://github.com/davidhalter/jedi) * NEW: Added new command "Tools => Open system shell" which opens terminal where current Python is in PATH. * CHANGED: Single instance mode is now optional (Tools => Options => General) * FIXED: Many bugs 1.2.0b2 (2016-02-10) ==================== * NEW: Thonny now runs in single instance mode. Previously, when you opened a py file with Thonny, a new Thonny instance (window) was created even if an instance existed already. This became nuisance if you opened several files. Now Thonny works as single instance program, meaning only one instance of Thonny runs at the time. When you open another file, it is opened in existing window. * NEW: Editor enhancements. Added option to show line numbers and right margin in the editor. In order to keep first impression cleaner, they are disabled by default. See Tools => Options => Editor. Don't forget that you don't need line numbers for locating lines mentioned in error messages -- you can click them and Thonny shows you the line. * FIXED: Some bugs where Thonny couldn't prepare some programs for debugging. Older versions ============== See https://github.com/thonny/thonny/issues and https://github.com/thonny/thonny/commits ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1661285315.0 thonny-4.0.1/CREDITS.rst0000664000175000017500000001116314301231703014472 0ustar00annamaaannamaa======= Credits ======= Thonny is thankful to: Its home -------- Thonny grew up in University of Tartu (https://www.ut.ee), Institute of Computer Science (https://www.cs.ut.ee). Supporters ---------- * Development of several features in Thonny 3.0 and 3.3 was proposed and supported by Raspberry Pi Foundation (https://www.raspberrypi.org). * Since September 2018, development of Thonny is partially supported by Cybernetica AS (https://cyber.ee). Several companies and organizations have provided us with free hardware for testing Thonny (and for having fun): * Phidgets Education (https://www.phidgets.com/education/) * Adafruit (https://www.adafruit.com/) * Raspberry Pi Foundation (https://www.raspberrypi.org) * M5Stack (https://m5stack.com/) * Micro:bit educational foundation (https://microbit.org/) * Calliope (https://calliope.cc/en) * @bwshockley (https://minifigboards.com/) Python ------ It's a really nice language for teaching programming. It also has some nice technical properties, that made Thonny's program animation features pleasure to implement. Libraries, resources and tools ------------------------------ * asttokens (https://github.com/gristlabs/asttokens) provides source locations to AST nodes. * jedi (http://jedi.readthedocs.io) is used for code completion, go to definition, etc. * pylint (https://www.pylint.org/) is used as one of the engines behind warnings presented by the Assistant. * mypy (http://mypy-lang.org/) is used, just like pylint, as a warning engine in the Assistant. * pyserial (https://github.com/pyserial/pyserial) is used for communicating with MicroPython devices. * docutils (http://docutils.sourceforge.net/) is used for parsing help content written in reStructuredText. * send2trash (https://github.com/hsoft/send2trash) is used by the Files view. * certifi (https://pypi.python.org/pypi/certifi) provides SSL certs for bundled Python in Linux and Mac. * distro (https://pypi.python.org/pypi/distro) is optionally used for detecting Linux version in About dialog. * paramiko (https://pypi.org/project/paramiko) is optionally used for writing and running code on remote machines. * websockets (https://pypi.org/project/websockets) is optionally used for communicating with MicroPython devices over WebREPL. * Most icons are taken from Eclipse project (https://www.eclipse.org/, https://github.com/eclipse/eclipse.platform.debug/tree/master/org.eclipse.debug.ui/icons/full/, https://github.com/eclipse/eclipse.platform.ui/tree/master/bundles/org.eclipse.ui/icons/full/, https://github.com/eclipse/eclipse.jdt.ui/tree/master/org.eclipse.jdt.ui/icons/full/), on Linux, some are overridden by Tango icons (http://tango.freedesktop.org/) * POEditor (https://poeditor.com/) is used for managing translations of UI strings. Source contributors, sponsors, advisors, translators and frequent bug-reporters ------------------------------------------------------------------------------- * adzierzanowski * Aivar Annamaa * Albin * Alar Leemet * Aleks ANDRÉ * Alex Hall * Alexandre Barrozo do Amaral Villares * Algent Albrahimi * Anatoly Techtonik * Anders Pamdal * Andrew Scheller * André Roberge * Andy Piper * Ankith * Antonio Carlos * atesin * Augene J. Pak * Austin Bart * Avag. sayan * badukaire * borpol * cefn * Celso Isayah Dias * Chad Purdy * codemee * Collision Detection * cspaier * cubimon * Curtis Wang * Dominic Twyman * Dominik George * Donald Butt * Eliot Blennerhassett * Emanuel Angelo * Fabianus.c * Farshid Meidani * Filip Schouwenaars * Fizban * freddii * fstengel * Gabriel Slørdahl * Gagan Saksena * Georges Khaznadar * Helmut Ascheid * Hyungseok Choi * IhorNehrutsa * Ingo Blechschmidt * Ivanhercaz * Ivan.schamann * Илья Кругликов * Jarek Miszczak * Jens Diemer * jharris1993 * Juan Falgueras * Jonathan Campbell * Jordan Williams * jose1711 * José Carlos García * Kaspar Papli * Kauri Raba * kr-g * Laszlo Kocsis * Lrasinen * M Burak Kalkan * Marcelo de Gomensoro Malheiros * Marie Roald * Marko Ristin * Matt Iversen * Miro Hrončok * NathanBnm * Nicolas Despres * Pavel Minaev * Peter Marshall * Petr. moses * Phil Duby * phr0gger * Pop Vasile Alexandru * Radim * Rene Lehtma * Rune Langøy * Saishen, Inc. * Sam Warmuth * Sami Almuhammady * sailslack * segalion * Simon Gijsen * Simon Long * sourceperl * speedy-10 * Stefan Rothe * Suk-Hyung Hwang * Sven Duzont * Syed Nasim * Taavi Ilp * tabreturn * TANAKA Masayuki * TooLazy0x00 * Toomas Mölder * Tristan Bunn * Tusamten * Vytenis (svajoklis-1) * Xin Rong * YEON * 丁向阳 (Ding-XiangYang) * 涂紳騰 (Shen-Teng Tu) * 張文宏 (Wen-Hung, Chang) Please let us know if we have forgotten to add your name to this list! Also, let us know if you want to remove your name. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/LICENSE.txt0000664000175000017500000000207114276461532014504 0ustar00annamaaannamaaThe MIT License (MIT) Copyright (c) 2022 Aivar Annamaa Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/MANIFEST.in0000664000175000017500000000047514276461532014425 0ustar00annamaaannamaainclude CHANGELOG.rst include CREDITS.rst include LICENSE.txt include README.rst include requirements.txt include licenses/ECLIPSE-ICONS-LICENSE.txt include packaging/linux/thonny.1 include packaging/icons/*.png include packaging/linux/org.thonny.Thonny.appdata.xml include packaging/linux/org.thonny.Thonny.desktop ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.7501018 thonny-4.0.1/PKG-INFO0000664000175000017500000000316214307363733013757 0ustar00annamaaannamaaMetadata-Version: 2.1 Name: thonny Version: 4.0.1 Summary: Python IDE for beginners Home-page: https://thonny.org Author: Aivar Annamaa and others Author-email: thonny@googlegroups.com License: MIT Project-URL: Source code, https://github.com/thonny/thonny Project-URL: Bug tracker, https://github.com/thonny/thonny/issues Keywords: IDE education debugger Platform: Windows Platform: macOS Platform: Linux Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: MacOS X Classifier: Environment :: Win32 (MS Windows) Classifier: Environment :: X11 Applications Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Education Classifier: Intended Audience :: End Users/Desktop Classifier: License :: Freeware Classifier: License :: OSI Approved :: MIT License Classifier: Natural Language :: English Classifier: Operating System :: MacOS Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: POSIX Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Topic :: Education Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: Debuggers Classifier: Topic :: Text Editors Requires-Python: >=3.8 License-File: LICENSE.txt Thonny is a simple Python IDE with features useful for learning programming. See https://thonny.org for more info. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/README.rst0000664000175000017500000000134614276461532014354 0ustar00annamaaannamaa.. image:: https://github.com/thonny/thonny/blob/master/thonny/res/Ukraine.png `Support Ukraine! `_ ====== Thonny ====== Thonny is a Python `IDE `_ meant for learning programming. End users --------- See https://thonny.org and `wiki `_ for more info. Contributors ------------ Contributions are welcome! See `CONTRIBUTING.rst `_ for more info. Sponsors ---------- You can sponsor development of Thonny by sending a donation to Thonny's main author Aivar Annamaa: https://github.com/thonny/thonny/wiki/Sponsors ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6781073 thonny-4.0.1/licenses/0000775000175000017500000000000014307363733014465 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/licenses/ECLIPSE-ICONS-LICENSE.txt0000664000175000017500000002612314276461532020250 0ustar00annamaaannamaa# Several Thonny icons are taken from http://eclipse-icons.i24.cc ------------------------------ Eclipse Public License - v 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/packaging/0000775000175000017500000000000014307363733014604 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1662904282.682107 thonny-4.0.1/packaging/icons/0000775000175000017500000000000014307363733015717 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/icons/thonny-128x128.png0000664000175000017500000000306714276461532020706 0ustar00annamaaannamaaPNG  IHDRi7@bKGD̿ pHYs  tIME 6%IDATx_TU?Y+"kIX| &FaJQC KCж&Bpgfϝ{g9zgGs<}s~;      sfe0&I /nZ SR~ҌVf_[Zyʹf0"'y&_ Nw||ɰ^;h4/6fd\ Nt)-K/k23㬺gztі|dձ[8o6Ǩx݁Koy&~'E>Å):E+928D[gOC&:,)q++e8mn\"zyeЄ1q5ԡK|ŕ=hs wMZsoDNPr|!ew&ieW ٸHg 5i@.@j:&3lleDf\ zyZzJ{ 0V-gXS䛞iGk] 8╴(;xً^YGb&A6Ag=Xֳ0x77 *f6 A4$F706}4: uHMBE*SY_5-xhJS$ yL>Oՙ`"{RaICsh׆N}a0QgѮJ[eRLm"gD}1\~; fu @|>zZ~кeǰ+|گzS) B6wGcP=N~@KzhvG1|gBe2hӥԳQQߡ\J3 e'۾CAo`wle3%Z }&      ? M7BIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/icons/thonny-16x16.png0000664000175000017500000000032614276461532020531 0ustar00annamaaannamaaPNG  IHDR7bKGD̿ pHYs  tIME agIDAT(ϭ (CMRD"Ag|}|ۖ@n uYjPHӐ6ɚĆn:hVZȺGNOBTt#5IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/icons/thonny-192x192.png0000664000175000017500000000600514276461532020703 0ustar00annamaaannamaaPNG  IHDRդbKGD̿ pHYs  tIME;b IDATx]]lG]lݫ}zPiTTTP U%MRʛ[ו* D$JJ*ED2%ED}hԊЫ#vn;3;37{í/sf@ @ @ ]&Y+(1CC%\>f1wg(`$ ]|Gg=O"D 4 `1崙نkx'ZC@x}~X tI %uu ig@2+R n Y_a/1hۃxKgǏ)*F,߼r:L0W}㒯w:"!Cf5<]=-sfo{+ G~U/4i89\As bGCT< *oܱp>S*&ƽAp+yC*(^5#KkijF ÝDS`ۼcjMp<$Yu8gFDǒ;Ic.(o?:'`:~+md`2Jjw6Zߤ @N'Z7x j:zCP0ַM(# oizz=؅&MT)g: OM O&9T?cf$}{O  SAsZ/6R0K.){9i^Zu۽)WAt820~'13f瘛5cŠrAG=J+W.x@/:Cdg՝Muc.S7q6 G1mՙIajGTa\9JtqZczb7<lh̅|'tzR K K:zbۀZ*pBE)Z*tBG8`16S =q̽KZ$|D= wD8϶ cns)y$- )E&($ô{iBR「T/e0I}Bb.)#@( \I@6 63Ovsb;` ݜZ 8a8'4,§GkYpQ }%mh+ro惠6^< J<>3m]Tix ~D`dsPd3V=p*rͲHJW_dE_E|n0S_U|hd#_,]%e%E;֬A/aÜ염Z%y.a+X-9%[񌬙,OW#bSfT03tl:vBuRpm@#3%@~b} UUHV -C[-5mhy bnXǒcŘI.񿖛ҒhQѤAOAq rJ[ [g:%Ѹ1ꤚ(@$Tn(Ds 7&T9Pf3%TABLI 7$@h=G%p7=AQ U+SAs')cS"YVCrdc[>wkG9R0iqeFprO:-uaީCW=!XYQ@r$T]pi.x 9u*h! $:JQGNi(ZGff^U vd Ҿ~zLl܀L * %~  ;fVpx#Zwk= PQhZ,>Sp+S6_+g:fxPJ%L׺ wH^yVEߜi2FTf4C~IWT+x)55) knĬh[of4A|Mse&֡hs5kqQ#6ak3QAkbЄ`yIWmZ)9U 3Ka`g`S+j}swk:ChU.mSNY{ZHue[0nZ7$yrj%@kuެ[0nV=&lj%4Y59HJV[xdg.3⮧Qʒn$ R+^6yhPCSaʻl{"DS3@^ *RRtw`<+ӟq G < "O˚-=KULƖYݸV_Οo 1A~l/ӎI@Hp-k$ ڀJz\fawVՏ w'l"@lَ3mV#C7my.HF>lYH8Aek' {ɼ'!i A#tG JB+RGj#6`HiI,3PN4_ ,0r6|l(񽹲mTg?džo,6#0H1^͠\l/6/QQ}[Ҙsb*caWn#MHNPªl ZGUʪc"m:r`TmVo#HZS-hf#ib k*,gk#HFR֑2mLq܇>KsI~@ @ @ DY~j$OIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/icons/thonny-2.png0000664000175000017500000000050414276461532020103 0ustar00annamaaannamaaPNG  IHDR7gAMA a cHRMz&u0`:pQ<bKGD̿tIME \MLIDAT(ϭO90Mo2PPm,^U$ܲ!&T'5v91'IJ:%tEXtdate:create2017-11-09T04:26:24-05:00xG%tEXtdate:modify2017-11-09T04:26:24-05:00%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/icons/thonny-22x22.png0000664000175000017500000000103614276461532020522 0ustar00annamaaannamaaPNG  IHDRnbKGD̿ pHYs  tIME 5.~\IDAT(ϕ=kA3r7#FP0`΀_"E"`(Qbr{Oݽܞoy? uʊELz2eXH$ʔQ4Pwjl]C0N9KX$Q;zvFzhem#z8$DDH )ښl r8Gb{K`ϹKg2,F\Xǝ .H6! kmH ,j +Q򐔀}aaRe!0{,˰0} Ժz~?PNNɻ? =|9rj nH2yGFX^!) ?*W_.[M|7E0 ͼ3=X%zguc i~+kKIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/icons/thonny-256x256.png0000664000175000017500000000735714276461532020720 0ustar00annamaaannamaaPNG  IHDR{`gAMA a cHRMz&u0`:pQ<bKGD̿tIME \M IDATx_]EǿK[!Զ0& b "ARu'%(AM|4@"_[S&F16h`?»P] 53,:7??o؁&6y|B?(FAFn6Cs6[a|;df]F<:){/RMĥ86E.b;~Z)r-ފTMX+PR4#cfq3as?թ#Q\ʠޭ7,~يp--x ٟJ55?k)H8/M\Id]kx zڸfOxw r>"޽?IY]m w('I\UVDpM?C@1._[1oCK1Nh$#}/Ÿ0`.L"8t[E<ݘmyQHK#phh xO 5`mt꾾dOr i6_2U'U7 UFA|S|?`K,(f;zV)d6#IsG;CF$U^Wp-u:1%vGs$[>v? [, Tw\yaYEcUAR]׉CXU-hFqm[Uɱ [ jw\تYH||SJ{ ߱lt<2M|9BԗI46.x'8T`d `wch~P ھTC I/X[/O!Hz錍t~.m Dnlh/$ y;MKf $ !Ljht[8'l @U<#+{$>(ظN*03@nHb. ZN*o ~iV?E+H@|Db?@ a,o熏C&Y@}%,q9>&ĜdȲrb2`qͰʃAWȄz^N/B(,?2!6}bNrI>4#9 f:_'p-nB?a1JNBtdV܃pI)_c|o ~Iwf+# ԑn?X2(*:ȾZ)c]و'0:QlflM܆?︹d25,đN/ 1Z. ( Fy=}!N%* ,Up ;_9&",ݖǕhҨȖ@23RӑfU?-G <]eq,Y 9eMY.B*rOѾAJ)55WH脖J5BiYaI.D04MJ4fݚz;m՜<$>)7KRޅMIL\fMp\aW15;-\ ,[ΪezZH .-L@gJm-pRn 0 8nR`rUZ\,FSPTLe3t A@ި)ϕRh53E*I_E3˚j #]L9EU[w8N+ %ۡ]hm7Fa$>G˸fpZΌ!Khiճ ~wp<}@lE& |&]T u)r`:GvQY^->A3fD9r#krX5V|T͖D|x|vv3QqH@_kgcYYmEݜ6$MkIpV $$*[ Ê+z&&)5QH{k5~C#d2}Ms2oM457]Llq2/~ogFLx''ӡo2/wnNvL 5 'SlU{7<6@8lJujm(B꫼ |j )Ժ:uP8' !SmZW':eՑR4c{G:n\zDgdӰH}O4wF%kg0e ^jD4w-Vөrix8(U)Kw,usq9@#P>ww~ r Qʒrn544 q2(H9K44nʟM\QY4MM/IR{OĘ-jDϲ;CݢL븭Y.Ty^Gn%B%2ӏc~'"!u+ #S>=N@40b\+Ihj"ie~q1|Roi~]GA#3Df& )՚ 2(ɸdd6~Q}3g}LLr?GCQIwPUJ)u{W'Q&Mͤ`Psp\u/ns5|RgiYqCds^?!9k$6$_BHr)\ uf?!$c8W6L%dRz3ɏ{&`'@pnU` 7E!B!B!B!B!B!B!B!B!B!B!B!B!A4Y~O%tEXtdate:create2017-11-09T04:26:24-05:00xG%tEXtdate:modify2017-11-09T04:26:24-05:00%IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/icons/thonny-32x32.png0000664000175000017500000000116014276461532020522 0ustar00annamaaannamaaPNG  IHDR sbKGD̿ pHYs  tIME 16 \ؽIDATH;kAg/1 !,DC *BDڊ` L#bc!h!hBBl e^Zb9gμ3{3k U<6e, c.$ŕYڧG.J`ܓB3\tsưѪX ?C ^_{Y5c& #x'퇼Fa-/|}ʦB 4VxU$ _cQ0)ҴN(M;1LIxN~5 0V 6CJK+6@uB\̜;rB !Sa *WBlu;)Vc_bNo1f]D2Ge&9郉UWHW*)tcd\Й=Pi%VsPŒ9XXc϶'AV6@ד9TX KQ'KURxVqc_2BlnRfmhw)v)6V'n2?@/濰W\gcIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/icons/thonny-48x48.png0000664000175000017500000000162214276461532020543 0ustar00annamaaannamaaPNG  IHDR00 1 bKGD̿ pHYs  tIME "6|*#IDATXkw?3of7$nҒڭ/$65 (xH< "|AD)-4BPH%P(%bj1m63;_YήH/wo} ; apy Iմ,]<3RHis_$pby0%7fyH]a! asw@]w໮0pĬܠ+(@ťQI1O!,b{X)C Nx:\&2ٿ`3IdN`)Kh94NひoF+8}oJ3&`qybcZs{6q6z-sCy.Zh:+ TW#*+z)jIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/icons/thonny-64x64.png0000664000175000017500000000164514276461532020544 0ustar00annamaaannamaaPNG  IHDR@@`UbKGD̿ pHYs  tIME "AA6IDAThIhAN& ACxIP! x0FAE o^rxA=(j<\&f!HQb .A4.=T86m' O!@|أPlC {(Si!,f"f!{Ix!rTAGE;/i+bT;lS?;*vތܗq@7XXW:{91 "K7SBC7_xG/_1LSjYfSٔծT!bWӕI6h S;G\EgEcJ$"Vi&0L`[z(DYZ]s󰌃J hN $QsI{Kb d<d#IRP?{?i&3)"O rWN@)LE?UjL.K Kb-'D_ڞE $ nGtDUgNHMQnWO$IB|F[m B,~^$]t `\!6>) nrv1N"+I:,;II8BT&:JI~r',%[ VI~($ ,3FoB@KQ|t%jHLC5blWM@&aO2(%qsȯ @`5ם^8]X°ܨ^p!uqǓSLVxg5|J^w7 CʈSX8{֪]u7Ѱyc_CݰK_O2=IeIENDB`././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1662904282.682107 thonny-4.0.1/packaging/linux/0000775000175000017500000000000014307363733015743 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662902977.0 thonny-4.0.1/packaging/linux/org.thonny.Thonny.appdata.xml0000664000175000017500000000603314307361301023450 0ustar00annamaaannamaa org.thonny.Thonny.desktop MIT MIT Thonny Python IDE for beginners

Thonny is a simple Python IDE with features useful for learning programming. It comes with a debugger which is able to visualize all the conceptual steps taken to run a Python program (executing statements, evaluating expressions, maintaining the call stack). There is a GUI for installing 3rd party packages and special mode for learning about references.

See the homepage for more information, screenshots and a walk-through video.

Development Education Debugger IDE ComputerScience org.thonny.Thonny.desktop https://thonny.org https://github.com/thonny/thonny/issues https://github.com/thonny/thonny/wiki https://thonny.org/img/screenshot.png Thonny stepping through a recursive function thonny

Bug-fix release.

Feature release.

This release fixes some minor bugs.

This is minor technical update over 3.3.12.

This is a bug-fix release.

This is a bug-fix release.

This is mainly a bug-fix release with one new feature -- the ability to install pip-compatible packages for MicroPython.

This is mainly a bug-fix release.

././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/linux/org.thonny.Thonny.desktop0000664000175000017500000000052314276461532022722 0ustar00annamaaannamaa[Desktop Entry] Type=Application Name=Thonny GenericName=Python IDE Exec=/usr/bin/thonny %F Comment=Python IDE for beginners Icon=thonny StartupWMClass=Thonny Terminal=false Categories=Development;IDE Keywords=programming;education MimeType=text/x-python; Actions=Edit; [Desktop Action Edit] Exec=/usr/bin/thonny %F Name=Edit with Thonny ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/packaging/linux/thonny.10000664000175000017500000000172014276461532017345 0ustar00annamaaannamaa.TH THONNY 1 .SH NAME thonny \- Python IDE for beginners .SH SYNOPSIS .B thonny [\fIFILE...\fR] .SH DESCRIPTION Thonny is a Python IDE for learning and teaching programming. .SH BASIC USAGE On the first run you see a code editor and the Python shell. .PP Enter some Python code (eg. .B print("Hello world") ) into the editor and save the file with Ctrl+S. .PP Now run the code by pressing F5. You should see the output of the program in the Python shell. .PP You can also enter Python code directly into the shell. .SH USING THE DEBUGGER You can see the steps Python takes to run your code. For this you need to press Ctrl+F5 to run the program in debug mode. In this mode you can advance the program either with big steps (F6) or small steps (F7). If you want to see how the steps affect program variables, then open global variables pane (View => Variables). .SH MORE INFORMATION You can find more information, screenshots and a walk-through video at https://thonny.org. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/pyproject.toml0000664000175000017500000000046114276461532015576 0ustar00annamaaannamaa[tool.black] line-length = 100 target_version = ['py38', 'py39', 'py310'] exclude = ".*api_stubs|vendored_libs" [tool.isort] profile = "black" src_paths = ["thonny"] line_length = 100 skip = ["api_stubs", "esp32_api_stubs", "esp_common_api_stubs", "base_api_stubs", "generic_api_stubs", "vendored_libs"] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660796664.0 thonny-4.0.1/requirements.txt0000664000175000017500000000026414277337370016152 0ustar00annamaaannamaajedi>=0.18.1 setuptools>=45.2 pyserial>=3.4 pylint>=2.4 docutils>=0.16 mypy>=0.761 asttokens>=2.0 Send2Trash>=1.5 # wheel is required by pipkin, which is currently vendored wheel ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.7501018 thonny-4.0.1/setup.cfg0000664000175000017500000000004614307363733014501 0ustar00annamaaannamaa[egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1661084632.0 thonny-4.0.1/setup.py0000664000175000017500000000645514300421730014365 0ustar00annamaaannamaaimport os.path import sys from setuptools import find_packages, setup def recursive_files(directory): paths = [] for (path, _, filenames) in os.walk(directory): for filename in filenames: if not filename.endswith(".pyc"): paths.append(os.path.join('..', path, filename)) return paths if sys.version_info < (3, 6): raise RuntimeError("Thonny requires Python 3.6 or later") setupdir = os.path.dirname(__file__) with open(os.path.join(setupdir, "thonny", "VERSION"), encoding="ASCII") as f: version = f.read().strip() requirements = [] for line in open(os.path.join(setupdir, "requirements.txt"), encoding="ASCII"): if line.strip() and not line.startswith("#"): requirements.append(line) setup( name="thonny", version=version, description="Python IDE for beginners", long_description="Thonny is a simple Python IDE with features useful for learning programming. See https://thonny.org for more info.", url="https://thonny.org", author="Aivar Annamaa and others", author_email="thonny@googlegroups.com", license="MIT", classifiers=[ "Development Status :: 5 - Production/Stable", "Environment :: MacOS X", "Environment :: Win32 (MS Windows)", "Environment :: X11 Applications", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: End Users/Desktop", "License :: Freeware", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Topic :: Education", "Topic :: Software Development", "Topic :: Software Development :: Debuggers", "Topic :: Text Editors", ], keywords="IDE education debugger", project_urls={ "Source code": "https://github.com/thonny/thonny", "Bug tracker": "https://github.com/thonny/thonny/issues", }, platforms=["Windows", "macOS", "Linux"], install_requires=requirements, python_requires=">=3.8", packages=find_packages(), package_data={ "": ["VERSION", "defaults.ini", "res/*"] + recursive_files("thonny/locale") + recursive_files("thonny/vendored_libs"), "thonny.plugins.help": ["*.rst"], "thonny.plugins.pi": ["res/*.*"], "thonny.plugins.printing": ["*.html"], "thonny.plugins.micropython": ["api_stubs/*.*"], "thonny.plugins.circuitpython": ["api_stubs/*.*"], "thonny.plugins.microbit": ["api_stubs/*.*"], "thonny.plugins.rp2040": ["api_stubs/*.*"], "thonny.plugins.ev3": ["api_stubs/*.*"], "thonny.plugins.prime_inventor": ["api_stubs/*.*"], "thonny.plugins.esp": ["esp32_api_stubs/*.*", "esp_8266_api_stubs/*.*"], "thonny.plugins.mypy": ["typeshed_extras/*.pyi"], }, entry_points={"gui_scripts": ["thonny = thonny:launch"]}, ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6861067 thonny-4.0.1/thonny/0000775000175000017500000000000014307363733014177 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662904273.0 thonny-4.0.1/thonny/VERSION0000664000175000017500000000000514307363721015237 0ustar00annamaaannamaa4.0.1././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662835904.0 thonny-4.0.1/thonny/__init__.py0000664000175000017500000003746114307156300016311 0ustar00annamaaannamaaimport logging import os.path import sys import time from logging import getLogger from typing import TYPE_CHECKING, List, Optional, cast from thonny.common import is_private_python, is_virtual_executable _last_module_count = 0 _last_modules = set() _last_time = time.time() logger = getLogger(__name__) def report_time(label: str) -> None: """ Method for finding unwarranted imports and delays. """ # return global _last_time, _last_module_count, _last_modules log_modules = True t = time.time() mod_count = len(sys.modules) mod_delta = mod_count - _last_module_count if mod_delta > 0: mod_info = f"(+{mod_count - _last_module_count} modules)" else: mod_info = "" logger.info("TIME/MODS %s %s %s", f"{t - _last_time:.3f}", label, mod_info) if log_modules and mod_delta > 0: current_modules = set(sys.modules.keys()) logger.info("NEW MODS %s", list(sorted(current_modules - _last_modules))) _last_modules = current_modules _last_time = t _last_module_count = mod_count report_time("After defining report_time") SINGLE_INSTANCE_DEFAULT = True BACKEND_LOG_MARKER = "Thonny's backend.log" def _get_known_folder(ID): # http://stackoverflow.com/a/3859336/261181 # http://www.installmate.com/support/im9/using/symbols/functions/csidls.htm import ctypes.wintypes SHGFP_TYPE_CURRENT = 0 buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) ctypes.windll.shell32.SHGetFolderPathW(0, ID, 0, SHGFP_TYPE_CURRENT, buf) assert buf.value return buf.value def _get_roaming_appdata_dir(): return _get_known_folder(26) def _get_local_appdata_dir(): return _get_known_folder(28) def _compute_thonny_user_dir(): if os.environ.get("THONNY_USER_DIR", ""): return os.path.expanduser(os.environ["THONNY_USER_DIR"]) elif is_portable(): if sys.platform == "win32": root_dir = os.path.dirname(sys.executable) elif sys.platform == "darwin": root_dir = os.path.join( os.path.dirname(sys.executable), "..", "..", "..", "..", "..", ".." ) else: root_dir = os.path.join(os.path.dirname(sys.executable), "..") return os.path.normpath(os.path.abspath(os.path.join(root_dir, "user_data"))) elif is_virtual_executable(sys.executable) and not is_private_python(sys.executable): return os.path.join(sys.prefix, ".thonny") elif sys.platform == "win32": return os.path.join(_get_roaming_appdata_dir(), "Thonny") elif sys.platform == "darwin": return os.path.expanduser("~/Library/Thonny") else: # https://specifications.freedesktop.org/basedir-spec/latest/ar01s02.html data_home = os.environ.get( "XDG_CONFIG_HOME", os.path.expanduser(os.path.join("~", ".config")) ) return os.path.join(data_home, "Thonny") def _read_configured_debug_mode(): if not os.path.exists(CONFIGURATION_FILE): return False try: with open(CONFIGURATION_FILE, encoding="utf-8") as fp: for line in fp: if "debug_mode" in line and "True" in line: return True return False except Exception: import traceback traceback.print_exc() return False def is_portable(): # it can be explicitly declared as portable or shared ... portable_marker_path = os.path.join(os.path.dirname(sys.executable), "portable_thonny.ini") shared_marker_path = os.path.join(os.path.dirname(sys.executable), "shared_thonny.ini") if os.path.exists(portable_marker_path) and not os.path.exists(shared_marker_path): return True elif not os.path.exists(portable_marker_path) and os.path.exists(shared_marker_path): return False # ... or it becomes implicitly portable if it's on a removable drive abs_location = os.path.abspath(__file__) if sys.platform == "win32": drive = os.path.splitdrive(abs_location)[0] if drive.endswith(":"): from ctypes import windll return windll.kernel32.GetDriveTypeW(drive) == 2 # @UndefinedVariable else: return False elif sys.platform == "darwin": # not exact heuristics return abs_location.startswith("/Volumes/") else: # not exact heuristics return abs_location.startswith("/media/") or abs_location.startswith("/mnt/") def get_version(): try: package_dir = os.path.dirname(sys.modules["thonny"].__file__) with open(os.path.join(package_dir, "VERSION"), encoding="ASCII") as fp: return fp.read().strip() except Exception: return "0.0.0" THONNY_USER_DIR = _compute_thonny_user_dir() CONFIGURATION_FILE = os.path.join(THONNY_USER_DIR, "configuration.ini") _CONFIGURED_DEBUG = _read_configured_debug_mode() _IPC_FILE = None def get_ipc_file_path(): global _IPC_FILE if _IPC_FILE: return _IPC_FILE if sys.platform == "win32": base_dir = _get_local_appdata_dir() else: base_dir = os.environ.get("XDG_RUNTIME_DIR") if not base_dir or not os.path.exists(base_dir): base_dir = os.environ.get("TMPDIR") if not base_dir or not os.path.exists(base_dir): base_dir = THONNY_USER_DIR for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): if name in os.environ: username = os.environ.get(name) break else: username = os.path.basename(os.path.expanduser("~")) ipc_dir = os.path.join(base_dir, "thonny-%s" % username) os.makedirs(ipc_dir, exist_ok=True) if not sys.platform == "win32": os.chmod(ipc_dir, 0o700) _IPC_FILE = os.path.join(ipc_dir, "ipc.sock") return _IPC_FILE def _check_welcome(): from thonny import misc_utils if not os.path.exists(CONFIGURATION_FILE) and not misc_utils.running_on_rpi(): from thonny.config import ConfigurationManager from thonny.first_run import FirstRunWindow mgr = ConfigurationManager(CONFIGURATION_FILE) win = FirstRunWindow(mgr) win.mainloop() return win.ok else: return True def launch(): import runpy if sys.executable.endswith("thonny.exe"): # otherwise some library may try to run its subprocess with thonny.exe # NB! Must be pythonw.exe not python.exe, otherwise Runner thinks console # is already allocated. sys.executable = sys.executable[: -len("thonny.exe")] + "pythonw.exe" set_dpi_aware() try: runpy.run_module("thonny.customize", run_name="__main__") except ImportError: pass prepare_thonny_user_dir() _configure_frontend_logging() if not _check_welcome(): return 0 if _should_delegate(): try: _delegate_to_existing_instance(sys.argv[1:]) print("Delegated to an existing Thonny instance. Exiting now.") return 0 except Exception: import traceback traceback.print_exc() # Did not or could not delegate try: from thonny import workbench bench = workbench.Workbench() bench.mainloop() return 0 except Exception: import tkinter as tk import traceback from logging import exception exception("Internal launch or mainloop error") from thonny import ui_utils dlg = ui_utils.LongTextDialog("Internal error", traceback.format_exc()) ui_utils.show_dialog(dlg, tk._default_root) return -1 finally: runner = get_runner() if runner is not None: runner.destroy_backend() return 0 def prepare_thonny_user_dir(): if not os.path.exists(THONNY_USER_DIR): os.makedirs(THONNY_USER_DIR, mode=0o700, exist_ok=True) # user_dir_template is a post-installation means for providing # alternative default user environment in multi-user setups template_dir = os.path.join(os.path.dirname(__file__), "user_dir_template") if os.path.isdir(template_dir): import shutil def copy_contents(src_dir, dest_dir): # I want the copy to have current user permissions for name in os.listdir(src_dir): src_item = os.path.join(src_dir, name) dest_item = os.path.join(dest_dir, name) if os.path.isdir(src_item): os.makedirs(dest_item, mode=0o700) copy_contents(src_item, dest_item) else: shutil.copyfile(src_item, dest_item) os.chmod(dest_item, 0o600) copy_contents(template_dir, THONNY_USER_DIR) def _should_delegate(): if not os.path.exists(get_ipc_file_path()): # no previous instance return False from thonny.config import try_load_configuration configuration_manager = try_load_configuration(CONFIGURATION_FILE) configuration_manager.set_default("general.single_instance", SINGLE_INSTANCE_DEFAULT) return configuration_manager.get_option("general.single_instance") def _delegate_to_existing_instance(args): import socket from thonny import workbench transformed_args = [] for arg in args: if not arg.startswith("-"): arg = os.path.abspath(arg) transformed_args.append(arg) try: sock, secret = _create_client_socket() except Exception: # Maybe the lock is abandoned or the content is corrupted try: os.remove(get_ipc_file_path()) except Exception: import traceback traceback.print_exc() raise data = repr((secret, transformed_args)).encode(encoding="utf_8") sock.settimeout(2.0) sock.sendall(data) sock.shutdown(socket.SHUT_WR) response = bytes([]) while len(response) < len(workbench.SERVER_SUCCESS): new_data = sock.recv(2) if len(new_data) == 0: break else: response += new_data if response.decode("UTF-8") != workbench.SERVER_SUCCESS: raise RuntimeError("Unsuccessful delegation") def _create_client_socket(): import socket timeout = 2.0 if sys.platform == "win32": with open(get_ipc_file_path(), "r") as fp: port = int(fp.readline().strip()) secret = fp.readline().strip() # "localhost" can be much slower than "127.0.0.1" client_socket = socket.create_connection(("127.0.0.1", port), timeout=timeout) else: client_socket = socket.socket(socket.AF_UNIX) # @UndefinedVariable client_socket.settimeout(timeout) client_socket.connect(get_ipc_file_path()) secret = "" return client_socket, secret def _configure_frontend_logging() -> None: _configure_logging(get_frontend_log_file(), _choose_logging_level()) def configure_backend_logging() -> None: _configure_logging(get_backend_log_file(), None) def get_backend_log_file(): return os.path.join(THONNY_USER_DIR, "backend.log") def get_frontend_log_file(): return os.path.join(THONNY_USER_DIR, "frontend.log") def _get_orig_argv() -> Optional[List[str]]: try: from sys import orig_argv # since 3.10 return sys.orig_argv except ImportError: # https://stackoverflow.com/a/57914236/261181 import ctypes argc = ctypes.c_int() argv = ctypes.POINTER(ctypes.c_wchar_p if sys.version_info >= (3,) else ctypes.c_char_p)() try: ctypes.pythonapi.Py_GetArgcArgv(ctypes.byref(argc), ctypes.byref(argv)) except AttributeError: # See https://github.com/thonny/thonny/issues/2206 # and https://bugs.python.org/issue40910 # This symbol is not available in thonny.exe built agains Python 3.8 return None # Ctypes are weird. They can't be used in list comprehensions, you can't use `in` with them, and you can't # use a for-each loop on them. We have to do an old-school for-i loop. arguments = list() for i in range(argc.value): arguments.append(argv[i]) return arguments def _configure_logging(log_file, console_level=None): logFormatter = logging.Formatter( "%(asctime)s.%(msecs)03d %(levelname)-7s %(name)s: %(message)s", "%H:%M:%S" ) file_handler = logging.FileHandler(log_file, encoding="UTF-8", mode="w") file_handler.setFormatter(logFormatter) main_logger = logging.getLogger("thonny") contrib_logger = logging.getLogger("thonnycontrib") pipkin_logger = logging.getLogger("pipkin") # NB! Don't mess with the main root logger, because (CPython) backend runs user code for logger in [main_logger, contrib_logger, pipkin_logger]: logger.setLevel(_choose_logging_level()) logger.propagate = False # otherwise it will be also reported by IDE-s root logger logger.addHandler(file_handler) if console_level is not None: console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(logFormatter) console_handler.setLevel(console_level) for logger in [main_logger, contrib_logger]: logger.addHandler(console_handler) # Log most important info as soon as possible main_logger.info("Thonny version: %s", get_version()) main_logger.info("cwd: %s", os.getcwd()) main_logger.info("original argv: %s", _get_orig_argv()) main_logger.info("sys.executable: %s", sys.executable) main_logger.info("sys.argv: %s", sys.argv) main_logger.info("sys.path: %s", sys.path) main_logger.info("sys.flags: %s", sys.flags) import faulthandler fault_out = open(os.path.join(THONNY_USER_DIR, "frontend_faults.log"), mode="w") faulthandler.enable(fault_out) def get_user_base_directory_for_plugins() -> str: return os.path.join(THONNY_USER_DIR, "plugins") def get_sys_path_directory_containg_plugins() -> str: from thonny.misc_utils import get_user_site_packages_dir_for_base return get_user_site_packages_dir_for_base(get_user_base_directory_for_plugins()) def set_dpi_aware(): # https://stackoverflow.com/questions/36134072/setprocessdpiaware-seems-not-to-work-under-windows-10 # https://bugs.python.org/issue33656 # https://msdn.microsoft.com/en-us/library/windows/desktop/dn280512(v=vs.85).aspx # https://github.com/python/cpython/blob/master/Lib/idlelib/pyshell.py if sys.platform == "win32": try: import ctypes PROCESS_SYSTEM_DPI_AWARE = 1 ctypes.OleDLL("shcore").SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE) except (ImportError, AttributeError, OSError): pass if TYPE_CHECKING: # Following imports are required for MyPy # http://mypy.readthedocs.io/en/stable/common_issues.html#import-cycles import thonny.workbench from thonny.running import Runner from thonny.shell import ShellView from thonny.workbench import Workbench _workbench = None # type: Optional[Workbench] def get_workbench() -> "Workbench": return cast("Workbench", _workbench) _runner = None # type: Optional[Runner] def set_logging_level(level=None): if level is None: level = _choose_logging_level() logging.getLogger("thonny").setLevel(level) def _choose_logging_level(): if in_debug_mode(): return logging.DEBUG else: return logging.INFO def in_debug_mode() -> bool: # Value may be something other than string when it is set in Python code return ( os.environ.get("THONNY_DEBUG", False) in [ "1", 1, "True", True, "true", ] or _CONFIGURED_DEBUG ) def get_runner() -> "Runner": return cast("Runner", _runner) def get_shell() -> "ShellView": return cast("ShellView", get_workbench().get_view("ShellView")) report_time("After loading thonny module") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/__main__.py0000664000175000017500000000011614276461532016270 0ustar00annamaaannamaafrom thonny import launch, report_time report_time("Before launch") launch() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/assistance.py0000664000175000017500000010414114276461532016710 0ustar00annamaaannamaaimport ast import datetime import os.path import subprocess import sys import textwrap import tkinter as tk from collections import namedtuple from logging import getLogger from tkinter import messagebox, ttk from typing import Dict # pylint disable=unused-import from typing import List # pylint disable=unused-import from typing import Optional # pylint disable=unused-import from typing import Tuple # pylint disable=unused-import from typing import Type # pylint disable=unused-import from typing import Union # pylint disable=unused-import from typing import Iterable import thonny from thonny import get_runner, get_workbench, rst_utils, tktextext, ui_utils from thonny.common import ( REPL_PSEUDO_FILENAME, STRING_PSEUDO_FILENAME, ToplevelResponse, read_source, ) from thonny.languages import tr from thonny.misc_utils import levenshtein_damerau_distance, running_on_mac_os from thonny.ui_utils import CommonDialog, get_hyperlink_cursor, scrollbar_style logger = getLogger(__name__) Suggestion = namedtuple("Suggestion", ["symbol", "title", "body", "relevance"]) _program_analyzer_classes = [] # type: List[Type[ProgramAnalyzer]] _last_feedback_timestamps = {} # type: Dict[str, str] _error_helper_classes = {} # type: Dict[str, List[Type[ErrorHelper]]] class AssistantView(tktextext.TextFrame): def __init__(self, master): tktextext.TextFrame.__init__( self, master, text_class=AssistantRstText, vertical_scrollbar_style=scrollbar_style("Vertical"), horizontal_scrollbar_style=scrollbar_style("Horizontal"), horizontal_scrollbar_class=ui_utils.AutoScrollbar, read_only=True, wrap="word", font="TkDefaultFont", # cursor="arrow", padx=10, pady=0, insertwidth=0, ) self._analyzer_instances = [] self._snapshots_per_main_file = {} self._current_snapshot = None self._accepted_warning_sets = [] self.text.tag_configure( "section_title", spacing3=5, font="BoldTkDefaultFont", # foreground=get_syntax_options_for_tag("stderr")["foreground"] ) self.text.tag_configure( "intro", # font="ItalicTkDefaultFont", spacing3=10, ) self.text.tag_configure("relevant_suggestion_title", font="BoldTkDefaultFont") self.text.tag_configure("suggestion_title", lmargin2=16, spacing1=5, spacing3=5) self.text.tag_configure("suggestion_body", lmargin1=16, lmargin2=16) self.text.tag_configure("body", font="ItalicTkDefaultFont") main_font = tk.font.nametofont("TkDefaultFont") # Underline on font looks better than underline on tag italic_underline_font = main_font.copy() italic_underline_font.configure(slant="italic", size=main_font.cget("size"), underline=True) self.text.tag_configure("feedback_link", justify="right", font=italic_underline_font) self.text.tag_bind("feedback_link", "", self._ask_feedback, True) self.text.tag_configure("python_errors_link", justify="right", font=italic_underline_font) self.text.tag_bind( "python_errors_link", "", lambda e: get_workbench().open_url("errors.rst"), True, ) get_workbench().bind("ToplevelResponse", self.handle_toplevel_response, True) add_error_helper("*", GenericErrorHelper) def handle_toplevel_response(self, msg: ToplevelResponse) -> None: # Can be called by event system or by Workbench # (if Assistant wasn't created yet but an error came) if not msg.get("user_exception") and msg.get("command_name") in [ "execute_system_command", "execute_source", ]: # Shell commands may be used to investigate the problem, don't clear assistance return self._clear() from thonny.plugins.cpython_frontend import LocalCPythonProxy if not isinstance(get_runner().get_backend_proxy(), LocalCPythonProxy): # TODO: add some support for MicroPython as well return # prepare for snapshot # TODO: should distinguish between and ? key = msg.get("filename", STRING_PSEUDO_FILENAME) self._current_snapshot = { "timestamp": datetime.datetime.now().isoformat()[:19], "main_file_path": key, } self._snapshots_per_main_file.setdefault(key, []) self._snapshots_per_main_file[key].append(self._current_snapshot) if msg.get("user_exception"): if not msg["user_exception"].get("message", None): msg["user_exception"]["message"] = "" self._exception_info = msg["user_exception"] self._explain_exception(msg["user_exception"]) if get_workbench().get_option("assistance.open_assistant_on_errors"): get_workbench().show_view("AssistantView", set_focus=False) else: self._exception_info = None if msg.get("filename") and os.path.exists(msg["filename"]): self.main_file_path = msg["filename"] source = read_source(msg["filename"]) self._start_program_analyses( msg["filename"], source, _get_imported_user_files(msg["filename"], source) ) else: self.main_file_path = None self._present_conclusion() def _explain_exception(self, error_info): rst = ( self._get_rst_prelude() + rst_utils.create_title( error_info["type_name"] + ": " + rst_utils.escape(error_info["message"]) ) + "\n" ) if ( error_info.get("lineno") is not None and error_info.get("filename") and os.path.exists(error_info["filename"]) ): rst += "`%s, line %d <%s>`__\n\n" % ( os.path.basename(error_info["filename"]), error_info["lineno"], self._format_file_url(error_info), ) helpers = [] for helper_class in ( _error_helper_classes.get(error_info["type_name"], []) + _error_helper_classes["*"] ): try: helpers.append(helper_class(error_info)) except HelperNotSupportedError: pass except Exception as e: logger.exception("Could not create helper %s", helper_class, exc_info=e) best_intro = helpers[0] for helper in helpers: if helper.intro_confidence > best_intro.intro_confidence: best_intro = helper # intro if best_intro.intro_text: rst += ( ".. note::\n" + " " + best_intro.intro_text.strip().replace("\n", "\n\n ") + "\n\n" ) suggestions = [ suggestion for helper in helpers for suggestion in helper.suggestions if suggestion is not None ] suggestions = sorted(suggestions, key=lambda s: s.relevance, reverse=True) if suggestions[0].relevance > 1 or best_intro.intro_confidence > 1: relevance_threshold = 2 else: # use relevance 1 only when there is nothing better relevance_threshold = 1 suggestions = [s for s in suggestions if s.relevance >= relevance_threshold] for i, suggestion in enumerate(suggestions): rst += self._format_suggestion( suggestion, i == len(suggestions) - 1, # TODO: is it good if first is preopened? # It looks cleaner if it is not. False, # i==0 ) self._current_snapshot["exception_suggestions"] = [ dict(sug._asdict()) for sug in suggestions ] self.text.append_rst(rst) self._append_text("\n") self._current_snapshot["exception_type_name"] = error_info["type_name"] self._current_snapshot["exception_message"] = error_info["message"] self._current_snapshot["exception_file_path"] = error_info["filename"] self._current_snapshot["exception_lineno"] = error_info["lineno"] self._current_snapshot["exception_rst"] = rst # for debugging purposes def _format_suggestion(self, suggestion, last, initially_open): return ( # assuming that title is already in rst format ".. topic:: " + suggestion.title + "\n" + " :class: toggle%s%s\n" % (", open" if initially_open else "", ", tight" if not last else "") + " \n" + textwrap.indent(suggestion.body, " ") + "\n\n" ) def _append_text(self, chars, tags=()): self.text.direct_insert("end", chars, tags=tags) def _clear(self): self._accepted_warning_sets.clear() for wp in self._analyzer_instances: wp.cancel_analysis() self._analyzer_instances = [] self.text.clear() def _start_program_analyses(self, main_file_path, main_file_source, imported_file_paths): for cls in _program_analyzer_classes: analyzer = cls(self._accept_warnings) if analyzer.is_enabled(): self._analyzer_instances.append(analyzer) if not self._analyzer_instances: return self._append_text("\nAnalyzing your code ...", ("em",)) # save snapshot of current source self._current_snapshot["main_file_path"] = main_file_path self._current_snapshot["main_file_source"] = main_file_source self._current_snapshot["imported_files"] = { name: read_source(name) for name in imported_file_paths } # start the analysis for analyzer in self._analyzer_instances: analyzer.start_analysis(main_file_path, imported_file_paths) def _accept_warnings(self, analyzer, warnings): if analyzer.cancelled: return self._accepted_warning_sets.append(warnings) if len(self._accepted_warning_sets) == len(self._analyzer_instances): self._present_warnings() self._present_conclusion() def _present_conclusion(self): if not self.text.get("1.0", "end").strip(): if self.main_file_path is not None and os.path.exists(self.main_file_path): self._append_text("\n") self.text.append_rst( "The code in `%s <%s>`__ looks good.\n\n" % ( os.path.basename(self.main_file_path), self._format_file_url({"filename": self.main_file_path}), ) ) self.text.append_rst( "If it is not working as it should, " + "then consider using some general " + "`debugging techniques `__.\n\n", ("em",), ) if self.text.get("1.0", "end").strip(): self._append_feedback_link() if self._exception_info: self._append_text( "General advice on dealing with errors.\n", ("a", "python_errors_link") ) def _present_warnings(self): warnings = [w for ws in self._accepted_warning_sets for w in ws] self.text.direct_delete("end-2l linestart", "end-1c lineend") if not warnings: return if self._exception_info is None: intro = "May be ignored if you are happy with your program." else: intro = "May help you find the cause of the error." rst = ( self._get_rst_prelude() + rst_utils.create_title("Warnings") + ":remark:`%s`\n\n" % intro ) by_file = {} for warning in warnings: if warning["filename"] not in by_file: by_file[warning["filename"]] = [] if warning not in by_file[warning["filename"]]: # Pylint may give double warnings (eg. when module imports itself) by_file[warning["filename"]].append(warning) for filename in by_file: rst += "`%s <%s>`__\n\n" % ( os.path.basename(filename), self._format_file_url(dict(filename=filename)), ) file_warnings = sorted( by_file[filename], key=lambda x: (x.get("lineno", 0), -x.get("relevance", 1)) ) for i, warning in enumerate(file_warnings): rst += self._format_warning(warning, i == len(file_warnings) - 1) + "\n" rst += "\n" self.text.append_rst(rst) # save snapshot self._current_snapshot["warnings_rst"] = rst self._current_snapshot["warnings"] = warnings if get_workbench().get_option("assistance.open_assistant_on_warnings"): get_workbench().show_view("AssistantView") def _format_warning(self, warning, last): title = rst_utils.escape(warning["msg"].splitlines()[0]) if warning.get("lineno") is not None: url = self._format_file_url(warning) if warning.get("lineno"): title = "`Line %d <%s>`__ : %s" % (warning["lineno"], url, title) if warning.get("explanation_rst"): explanation_rst = warning["explanation_rst"] elif warning.get("explanation"): explanation_rst = rst_utils.escape(warning["explanation"]) else: explanation_rst = "" if warning.get("more_info_url"): explanation_rst += "\n\n`More info online <%s>`__" % warning["more_info_url"] explanation_rst = explanation_rst.strip() topic_class = "toggle" if explanation_rst else "empty" if not explanation_rst: explanation_rst = "n/a" return ( ".. topic:: %s\n" % title + " :class: " + topic_class + ("" if last else ", tight") + "\n" + " \n" + textwrap.indent(explanation_rst, " ") + "\n\n" ) def _append_feedback_link(self): self._append_text("Was it helpful or confusing?\n", ("a", "feedback_link")) def _format_file_url(self, atts): return format_file_url(atts["filename"], atts.get("lineno"), atts.get("col_offset")) def _ask_feedback(self, event=None): all_snapshots = self._snapshots_per_main_file[self._current_snapshot["main_file_path"]] # TODO: select only snapshots which are not sent yet snapshots = all_snapshots ui_utils.show_dialog(FeedbackDialog(get_workbench(), self.main_file_path, snapshots)) def _get_rst_prelude(self): return ".. default-role:: code\n\n" + ".. role:: light\n\n" + ".. role:: remark\n\n" class AssistantRstText(rst_utils.RstText): def configure_tags(self): super().configure_tags() main_font = tk.font.nametofont("TkDefaultFont") italic_font = main_font.copy() italic_font.configure(slant="italic", size=main_font.cget("size")) h1_font = main_font.copy() h1_font.configure(weight="bold", size=main_font.cget("size")) self.tag_configure("h1", font=h1_font, spacing3=0, spacing1=10) self.tag_configure("topic_title", font="TkDefaultFont") self.tag_configure("topic_body", font=italic_font, spacing1=10, lmargin1=25, lmargin2=25) self.tag_raise("sel") class Helper: def get_intro(self) -> Tuple[str, int]: raise NotImplementedError() def get_suggestions(self) -> Iterable[Suggestion]: raise NotImplementedError() class ErrorHelper(Helper): def __init__(self, error_info): # TODO: don't repeat all this for all error helpers self.error_info = error_info self.last_frame = error_info["stack"][-1] self.last_frame_ast = None if self.last_frame.source: try: self.last_frame_ast = ast.parse(self.last_frame.source, self.last_frame.filename) except SyntaxError: pass self.last_frame_module_source = None self.last_frame_module_ast = None if self.last_frame.code_name == "": self.last_frame_module_source = self.last_frame.source self.last_frame_module_ast = self.last_frame_ast elif self.last_frame.filename is not None: try: self.last_frame_module_source = read_source(self.last_frame.filename) self.last_frame_module_ast = ast.parse(self.last_frame_module_source) except Exception: pass self.intro_confidence = 1 self.intro_text = "" self.suggestions = [] class GenericErrorHelper(ErrorHelper): def __init__(self, error_info): super().__init__(error_info) self.intro_text = "No specific suggestions for this error (yet)." self.intro_confidence = 1 self.suggestions = [ Suggestion( "ask-for-specific-support", "Let Thonny developers know", "Click on the feedback link at the bottom of this panel to let Thonny developers know " + "about your problem. They may add support for " + "such cases in future Thonny versions.", 1, ) ] if error_info["message"].lower() != "invalid syntax": self.suggestions.append( Suggestion( "generic-search-the-web", "Search the web", "Try performing a web search for\n\n``Python %s: %s``" % ( self.error_info["type_name"], rst_utils.escape(self.error_info["message"].replace("\n", " ").strip()), ), 1, ) ) class ProgramAnalyzer: def __init__(self, on_completion): self.completion_handler = on_completion self.cancelled = False def is_enabled(self): return True def start_analysis(self, main_file_path, imported_file_paths): raise NotImplementedError() def cancel_analysis(self): pass class SubprocessProgramAnalyzer(ProgramAnalyzer): def __init__(self, on_completion): super().__init__(on_completion) self._proc = None def cancel_analysis(self): self.cancelled = True if self._proc is not None: self._proc.kill() class LibraryErrorHelper(ErrorHelper): """Explains exceptions, which doesn't happen in user code""" def get_intro(self): return "This error happened in library code. This may mean a bug in " def get_suggestions(self): return [] class FeedbackDialog(CommonDialog): def __init__(self, master, main_file_path, all_snapshots): super().__init__(master=master) main_frame = ttk.Frame(self) main_frame.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.main_file_path = main_file_path self.snapshots = self._select_unsent_snapshots(all_snapshots) self.title("Send feedback for Assistant") padx = 15 intro_label = ttk.Label( main_frame, text="Below are the messages Assistant gave you in response to " + ( "using the shell" if self._happened_in_shell() else "testing '" + os.path.basename(main_file_path) + "'" ) + " since " + self._get_since_str() + ".\n\n" + "In order to improve this feature, Thonny developers would love to know how " + "useful or confusing these messages were. We will only collect version " + "information and the data you enter or approve on this form.", wraplength=550, ) intro_label.grid(row=1, column=0, columnspan=3, sticky="nw", padx=padx, pady=(15, 15)) tree_label = ttk.Label( main_frame, text="Which messages were helpful (H) or confusing (C)? Click on [ ] to mark!", ) tree_label.grid(row=2, column=0, columnspan=3, sticky="nw", padx=padx, pady=(15, 0)) tree_frame = ui_utils.TreeFrame( main_frame, columns=["helpful", "confusing", "title", "group", "symbol"], displaycolumns=["helpful", "confusing", "title"], height=10, borderwidth=1, relief="groove", ) tree_frame.grid(row=3, column=0, columnspan=3, sticky="nsew", padx=padx) self.tree = tree_frame.tree self.tree.column("helpful", width=35, anchor=tk.CENTER, stretch=False) self.tree.column("confusing", width=35, anchor=tk.CENTER, stretch=False) self.tree.column("title", width=350, anchor=tk.W, stretch=True) self.tree.heading("helpful", text="H", anchor=tk.CENTER) self.tree.heading("confusing", text="C", anchor=tk.CENTER) self.tree.heading("title", text="Group / Message", anchor=tk.W) self.tree["show"] = ("headings",) self.tree.bind("<1>", self._on_tree_click, True) main_font = tk.font.nametofont("TkDefaultFont") bold_font = main_font.copy() bold_font.configure(weight="bold", size=main_font.cget("size")) self.tree.tag_configure("group", font=bold_font) self.include_thonny_id_var = tk.IntVar(value=1) include_thonny_id_check = ttk.Checkbutton( main_frame, variable=self.include_thonny_id_var, onvalue=1, offvalue=0, text="Include Thonny's installation time (allows us to group your submissions)", ) include_thonny_id_check.grid( row=4, column=0, columnspan=3, sticky="nw", padx=padx, pady=(5, 0) ) self.include_snapshots_var = tk.IntVar(value=1) include_snapshots_check = ttk.Checkbutton( main_frame, variable=self.include_snapshots_var, onvalue=1, offvalue=0, text="Include snapshots of the code and Assistant responses at each run", ) include_snapshots_check.grid( row=5, column=0, columnspan=3, sticky="nw", padx=padx, pady=(0, 0) ) comments_label = ttk.Label(main_frame, text="Any comments? Enhancement ideas?") comments_label.grid(row=6, column=0, columnspan=3, sticky="nw", padx=padx, pady=(15, 0)) self.comments_text_frame = tktextext.TextFrame( main_frame, vertical_scrollbar_style=scrollbar_style("Vertical"), horizontal_scrollbar_style=scrollbar_style("Horizontal"), horizontal_scrollbar_class=ui_utils.AutoScrollbar, wrap="word", font="TkDefaultFont", # cursor="arrow", padx=5, pady=5, height=4, borderwidth=1, relief="groove", ) self.comments_text_frame.grid(row=7, column=0, columnspan=3, sticky="nsew", padx=padx) url_font = tk.font.nametofont("TkDefaultFont").copy() url_font.configure(underline=1, size=url_font.cget("size")) preview_link = ttk.Label( main_frame, text="(Preview the data to be sent)", style="Url.TLabel", cursor=get_hyperlink_cursor(), font=url_font, ) preview_link.bind("<1>", self._preview_submission_data, True) preview_link.grid(row=8, column=0, sticky="nw", padx=15, pady=15) submit_button = ttk.Button(main_frame, text="Submit", width=10, command=self._submit_data) submit_button.grid(row=8, column=0, sticky="ne", padx=0, pady=15) cancel_button = ttk.Button(main_frame, text="Cancel", width=7, command=self._close) cancel_button.grid(row=8, column=1, sticky="ne", padx=(10, 15), pady=15) self.protocol("WM_DELETE_WINDOW", self._close) self.bind("", self._close, True) main_frame.columnconfigure(0, weight=1) main_frame.rowconfigure(3, weight=3) main_frame.rowconfigure(6, weight=2) self._empty_box = "[ ]" self._checked_box = "[X]" self._populate_tree() def _happened_in_shell(self): return self.main_file_path is None or self.main_file_path == REPL_PSEUDO_FILENAME def _populate_tree(self): groups = {} for snap in self.snapshots: if snap.get("exception_message") and snap.get("exception_suggestions"): group = snap["exception_type_name"] groups.setdefault(group, set()) for sug in snap["exception_suggestions"]: groups[group].add((sug["symbol"], sug["title"])) # warnings group if snap.get("warnings"): group = "Warnings" groups.setdefault(group, set()) for w in snap["warnings"]: groups[group].add((w["symbol"], w["msg"])) for group in sorted(groups.keys(), key=lambda x: x.replace("Warnings", "z")): group_id = self.tree.insert("", "end", open=True, tags=("group",)) self.tree.set(group_id, "title", group) for symbol, title in sorted(groups[group], key=lambda m: m[1]): item_id = self.tree.insert("", "end") self.tree.set(item_id, "helpful", self._empty_box) self.tree.set(item_id, "confusing", self._empty_box) self.tree.set(item_id, "title", title) self.tree.set(item_id, "symbol", symbol) self.tree.set(item_id, "group", group) self.tree.see("") def _on_tree_click(self, event): item_id = self.tree.identify("item", event.x, event.y) column = self.tree.identify_column(event.x) if not item_id or not column: return value_index = int(column[1:]) - 1 values = list(self.tree.item(item_id, "values")) if values[value_index] == self._empty_box: values[value_index] = self._checked_box elif values[value_index] == self._checked_box: values[value_index] = self._empty_box else: return # update values self.tree.item(item_id, values=tuple(values)) def _preview_submission_data(self, event=None): import tempfile temp_path = os.path.join( tempfile.mkdtemp(dir=get_workbench().get_temp_dir()), "ThonnyAssistantFeedback_" + datetime.datetime.now().isoformat().replace(":", ".")[:19] + ".txt", ) data = self._collect_submission_data() with open(temp_path, "w", encoding="ascii") as fp: fp.write(data) if running_on_mac_os(): subprocess.Popen(["open", "-e", temp_path]) else: import webbrowser webbrowser.open(temp_path) def _collect_submission_data(self): import json tree_data = [] for iid in self.tree.get_children(): values = self.tree.item(iid, "values") tree_data.append( { "helpful": values[0] == self._checked_box, "confusing": values[1] == self._checked_box, "message": values[2], "group": values[3], "symbol": values[4], } ) submission = { "feedback_format_version": 1, "thonny_version": thonny.get_version(), "python_version": ".".join(map(str, sys.version_info[:3])), "message_feedback": tree_data, "comments": self.comments_text_frame.text.get("1.0", "end"), } try: import mypy.version submission["mypy_version"] = str(mypy.version.__version__) except ImportError: logger.exception("Could not get MyPy version") try: import pylint submission["pylint_version"] = str(pylint.__version__) except ImportError: logger.exception("Could not get Pylint version") if self.include_snapshots_var.get(): submission["snapshots"] = self.snapshots if self.include_thonny_id_var.get(): submission["thonny_timestamp"] = get_workbench().get_option( "general.configuration_creation_timestamp" ) return json.dumps(submission, indent=2) def _submit_data(self): import gzip import urllib.request json_data = self._collect_submission_data() compressed_data = gzip.compress(json_data.encode("ascii")) def do_work(): try: handle = urllib.request.urlopen( "https://thonny.org/store_assistant_feedback.php", data=compressed_data, timeout=10, ) return handle.read() except Exception as e: return str(e) result = ui_utils.run_with_waiting_dialog(self, do_work, description="Uploading") if result == b"OK": if self.snapshots: last_timestamp = self.snapshots[-1]["timestamp"] _last_feedback_timestamps[self.main_file_path] = last_timestamp messagebox.showinfo( "Done!", "Thank you for the feedback!\n\nLet us know again when Assistant\nhelps or confuses you!", master=self.master, ) self._close() else: messagebox.showerror( "Problem", "Something went wrong:\n%s\n\nIf you don't mind, then try again later!" % result[:1000], master=self, ) def _select_unsent_snapshots(self, all_snapshots): if self.main_file_path not in _last_feedback_timestamps: return all_snapshots else: return [ s for s in all_snapshots if s["timestamp"] > _last_feedback_timestamps[self.main_file_path] ] def _close(self, event=None): self.destroy() def _get_since_str(self): if not self.snapshots: assert self.main_file_path in _last_feedback_timestamps since = datetime.datetime.strptime( _last_feedback_timestamps[self.main_file_path], "%Y-%m-%dT%H:%M:%S" ) else: since = datetime.datetime.strptime(self.snapshots[0]["timestamp"], "%Y-%m-%dT%H:%M:%S") if since.date() == datetime.date.today() or ( datetime.datetime.now() - since ) <= datetime.timedelta(hours=5): since_str = since.strftime("%X") else: # date and time without yer since_str = since.strftime("%c").replace(str(datetime.date.today().year), "") # remove seconds if since_str.count(":") == 2: i = since_str.rfind(":") if ( i > 0 and len(since_str[i + 1 : i + 3]) == 2 and since_str[i + 1 : i + 3].isnumeric() ): since_str = since_str[:i] + since_str[i + 3 :] return since_str.strip() def name_similarity(a, b): # TODO: tweak the result values a = a.replace("_", "") b = b.replace("_", "") minlen = min(len(a), len(b)) if a.replace("0", "O").replace("1", "l") == b.replace("0", "O").replace("1", "l"): if minlen >= 4: return 7 else: return 6 a = a.lower() b = b.lower() if a == b: if minlen >= 4: return 7 else: return 6 if minlen <= 2: return 0 # if names differ at final isolated digits, # then they are probably different vars, even if their # distance is small (eg. location_1 and location_2) if a[-1].isdigit() and not a[-2].isdigit() and b[-1].isdigit() and not b[-2].isdigit(): return 0 # same thing with _ + single char suffixes # (eg. location_a and location_b) if a[-2] == "_" and b[-2] == "_": return 0 distance = levenshtein_damerau_distance(a, b, 5) if minlen <= 5: return max(8 - distance * 2, 0) elif minlen <= 10: return max(9 - distance * 2, 0) else: return max(10 - distance * 2, 0) def _get_imported_user_files(main_file, source=None): assert os.path.isabs(main_file) if source is None: source = read_source(main_file) try: root = ast.parse(source, main_file) except SyntaxError: return set() main_dir = os.path.dirname(main_file) module_names = set() # TODO: at the moment only considers non-package modules for node in ast.walk(root): if isinstance(node, ast.Import): for item in node.names: module_names.add(item.name) elif isinstance(node, ast.ImportFrom): module_names.add(node.module) imported_files = set() for file in {name + ext for ext in [".py", ".pyw"] for name in module_names}: possible_path = os.path.join(main_dir, file) if os.path.exists(possible_path): imported_files.add(possible_path) return imported_files # TODO: add recursion def add_program_analyzer(cls): _program_analyzer_classes.append(cls) def add_error_helper(error_type_name, helper_class): _error_helper_classes.setdefault(error_type_name, []) _error_helper_classes[error_type_name].append(helper_class) def format_file_url(filename, lineno, col_offset): s = "thonny-editor://" + rst_utils.escape(filename).replace(" ", "%20") if lineno is not None: s += "#" + str(lineno) if col_offset is not None: s += ":" + str(col_offset) return s class HelperNotSupportedError(RuntimeError): pass def init(): get_workbench().set_default("assistance.open_assistant_on_errors", True) get_workbench().set_default("assistance.open_assistant_on_warnings", False) get_workbench().set_default("assistance.disabled_checks", []) get_workbench().add_view(AssistantView, tr("Assistant"), "se", visible_by_default=False) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/ast_utils.py0000664000175000017500000001407214276461532016565 0ustar00annamaaannamaa# -*- coding: utf-8 -*- import ast from typing import Union def extract_text_range(source, text_range): if isinstance(source, bytes): # TODO: may be wrong encoding source = source.decode("utf-8") lines = source.splitlines(True) # get relevant lines lines = lines[text_range.lineno - 1 : text_range.end_lineno] # trim last and first lines lines[-1] = lines[-1][: text_range.end_col_offset] lines[0] = lines[0][text_range.col_offset :] return "".join(lines) def find_expression(start_node, text_range): for node in ast.walk(start_node): if ( isinstance(node, ast.expr) and node.lineno == text_range.lineno and node.col_offset == text_range.col_offset and node.end_lineno == text_range.end_lineno and node.end_col_offset == text_range.end_col_offset ): return node return None def parse_source(source: str, filename="", mode="exec", fallback_to_one_char=False): assert isinstance(source, str) root = ast.parse(source, filename, mode) mark_text_ranges(root, source, fallback_to_one_char) return root def get_last_child(node, skip_incorrect=True): """Returns last focusable child expression or child statement""" def ok_node(node): if node is None: return None assert isinstance(node, (ast.expr, ast.stmt)) if skip_incorrect and getattr(node, "incorrect_range", False): return None return node def last_ok(nodes): for i in range(len(nodes) - 1, -1, -1): if ok_node(nodes[i]): node = nodes[i] if isinstance(node, ast.Starred): if ok_node(node.value): return node.value else: return None else: return nodes[i] return None if isinstance(node, ast.Call): # TODO: take care of Python 3.5 updates (Starred etc.) if hasattr(node, "kwargs") and ok_node(node.kwargs): return node.kwargs elif hasattr(node, "starargs") and ok_node(node.starargs): return node.starargs else: kw_values = list(map(lambda x: x.value, node.keywords)) last_ok_kw = last_ok(kw_values) if last_ok_kw: return last_ok_kw elif last_ok(node.args): return last_ok(node.args) else: return ok_node(node.func) elif isinstance(node, ast.BoolOp): return last_ok(node.values) elif isinstance(node, ast.BinOp): if ok_node(node.right): return node.right else: return ok_node(node.left) elif isinstance(node, ast.Compare): return last_ok(node.comparators) elif isinstance(node, ast.UnaryOp): return ok_node(node.operand) elif isinstance(node, (ast.Tuple, ast.List, ast.Set)): return last_ok(node.elts) elif isinstance(node, ast.Dict): # TODO: actually should pairwise check last value, then last key, etc. return last_ok(node.values) elif isinstance( node, (ast.Index, ast.Return, ast.Assign, ast.AugAssign, ast.Yield, ast.YieldFrom) ): return ok_node(node.value) elif isinstance(node, ast.Delete): return last_ok(node.targets) elif isinstance(node, ast.Expr): return ok_node(node.value) elif isinstance(node, ast.Assert): if ok_node(node.msg): return node.msg else: return ok_node(node.test) elif isinstance(node, ast.Slice): # [:] if ok_node(node.step): return node.step elif ok_node(node.upper): return node.upper else: return ok_node(node.lower) elif isinstance(node, ast.ExtSlice): # [:,:] for dim in reversed(node.dims): result = get_last_child(dim, skip_incorrect) assert result is None or isinstance(result, ast.expr) if result is not None: return result return None elif isinstance(node, ast.Subscript): result = get_last_child(node.slice, skip_incorrect) if result is not None: return result else: return node.value elif isinstance(node, ast.Raise): if ok_node(node.cause): return node.cause elif ok_node(node.exc): return node.exc elif isinstance(node, (ast.For, ast.While, ast.If, ast.With)): return True # There is last child, but I don't know which it will be # TODO: pick more cases from here: """ (isinstance(node, (ast.IfExp, ast.ListComp, ast.SetComp, ast.DictComp, ast.GeneratorExp)) # or isinstance(node, ast.FunctionDef, ast.Lambda) and len(node.args.defaults) > 0 and (node.dest is not None or len(node.values) > 0)) #"TODO: Import ja ImportFrom" # TODO: what about ClassDef ??? """ return None def mark_text_ranges(node, source: Union[str, bytes], fallback_to_one_char=False): """ Node is an AST, source is corresponding source as string. Function adds recursively attributes end_lineno and end_col_offset to each node which has attributes lineno and col_offset. """ assert isinstance(source, (str, bytes)) from asttokens.asttokens import ASTTokens ASTTokens(source, tree=node) for child in ast.walk(node): if hasattr(child, "last_token"): child.end_lineno, child.end_col_offset = child.last_token.end if hasattr(child, "lineno"): # Fixes problems with some nodes like binop child.lineno, child.col_offset = child.first_token.start # some nodes stay without end info if ( hasattr(child, "lineno") and (not hasattr(child, "end_lineno") or not hasattr(child, "end_col_offset")) and fallback_to_one_char ): child.end_lineno = child.lineno child.end_col_offset = child.col_offset + 2 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662870927.0 thonny-4.0.1/thonny/backend.py0000664000175000017500000010024414307262617016140 0ustar00annamaaannamaa# -*- coding: utf-8 -*- import _thread import io import os.path import pathlib import queue import stat import sys import threading import time import traceback import warnings from abc import ABC, abstractmethod from logging import getLogger from typing import Any, BinaryIO, Callable, Dict, Iterable, List, Optional, Tuple, Union import thonny from thonny import report_time from thonny.common import BackendEvent # TODO: try to get rid of this from thonny.common import ( IGNORED_FILES_AND_DIRS, CommandToBackend, EOFCommand, ImmediateCommand, InlineCommand, InlineResponse, InputSubmission, MessageFromBackend, ToplevelCommand, ToplevelResponse, UserError, parse_message, read_one_incoming_message_str, serialize_message, try_load_modules_with_frontend_sys_path, universal_dirname, ) NEW_DIR_MODE = 0o755 logger = getLogger(__name__) class BaseBackend(ABC): """Methods for both MainBackend and forwarding backend""" def __init__(self): self._current_command = None self._incoming_message_queue = queue.Queue() # populated by the reader thread self._interrupt_lock = threading.Lock() self._last_progress_reporting_time = 0 self._last_sent_output = "" self._init_command_reader() def _init_command_reader(self): # NB! This approach is used only in MicroPython and SshCPython backend. # MainCPython backend uses main thread for reading commands # https://github.com/thonny/thonny/issues/1363 threading.Thread(target=self._read_incoming_messages, daemon=True).start() def mainloop(self): report_time("Beginning of mainloop") try: while True: self._check_for_connection_error() try: msg = self._fetch_next_incoming_message(timeout=0.01) except KeyboardInterrupt: self._send_output( "\nKeyboardInterrupt", "stderr" ) # CPython idle REPL does this self.send_message(ToplevelResponse()) except queue.Empty: self._perform_idle_tasks() else: if isinstance(msg, InputSubmission): self._handle_user_input(msg) elif isinstance(msg, EOFCommand): self._handle_eof_command(msg) else: self._current_command = msg self._handle_normal_command(msg) except KeyboardInterrupt: self._send_output("\nKeyboardInterrupt", "stderr") sys.exit(0) except ConnectionError as e: self.handle_connection_error(e) except Exception: # Error in Thonny's code logger.exception("mainloop error") self._report_internal_exception("mainloop error") logger.info("After mainloop") sys.exit(17) def handle_connection_error(self, error=None): logger.info("Handling connection error") message = "Connection lost" if error: message += " -- " + str(error) self._send_output("\n" + message + "\n", "stderr") self._send_output("\n" + "Use Stop/Restart to reconnect." + "\n", "stderr") sys.exit(1) def _current_command_is_interrupted(self): return getattr(self._current_command, "interrupted", False) def _fetch_next_incoming_message(self, timeout=None): return self._incoming_message_queue.get(timeout=timeout) def _report_progress( self, cmd, description: Optional[str], value: float, maximum: float ) -> None: # Don't notify too often (unless it's the final notification) if value != maximum and time.time() - self._last_progress_reporting_time < 0.2: return self.send_message( BackendEvent( event_type="InlineProgress", command_id=cmd["id"], value=value, maximum=maximum, description=description, ) ) self._last_progress_reporting_time = time.time() def _report_current_action(self, cmd, description: str) -> None: self.send_message( BackendEvent( event_type="InlineProgress", command_id=cmd["id"], description=description, ) ) def _read_incoming_messages(self): # works in a separate thread while True: if not self._read_one_incoming_message(): break def _read_one_incoming_message(self): msg_str = read_one_incoming_message_str(self._read_incoming_msg_line) if not msg_str: return False msg = parse_message(msg_str) if isinstance(msg, ImmediateCommand): # This will be handled right away self._handle_immediate_command(msg) else: self._incoming_message_queue.put(msg) return True def _prepare_command_response( self, response: Union[MessageFromBackend, Dict, None], command: CommandToBackend ) -> MessageFromBackend: if response is None: response = {} if "id" in command and "command_id" not in response: response["command_id"] = command["id"] if isinstance(response, MessageFromBackend): if "command_name" not in response: response["command_name"] = command["name"] return response else: if isinstance(response, dict): args = response else: args = {} if isinstance(command, ToplevelCommand): return ToplevelResponse(command_name=command.name, **args) else: assert isinstance(command, InlineCommand) return InlineResponse(command_name=command.name, **args) def send_message(self, msg: MessageFromBackend) -> None: sys.stdout.write(serialize_message(msg) + "\n") sys.stdout.flush() def _send_output(self, data, stream_name): if not data: return data = self._transform_output(data, stream_name) msg = BackendEvent(event_type="ProgramOutput", stream_name=stream_name, data=data) self._last_sent_output = data self.send_message(msg) def _transform_output(self, data, stream_name): return data def _read_incoming_msg_line(self) -> str: return sys.stdin.readline() def _perform_idle_tasks(self): """Executed when there is no commands in queue""" pass def _report_internal_exception(self, msg: str) -> None: user_msg = "PROBLEM IN THONNY'S BACK-END: " + msg if sys.exc_info()[1]: err_msg = "\n".join( traceback.format_exception_only(sys.exc_info()[0], sys.exc_info()[1]) ).strip() user_msg += f" ({err_msg})" user_msg += ".\nSee " + thonny.BACKEND_LOG_MARKER + " for more info." print(user_msg, file=sys.stderr) def _report_internal_warning(self, msg: str) -> None: user_msg = f"Warning: {msg}.\nSee backend.log for more info." print(user_msg, file=sys.stderr) @abstractmethod def _check_for_connection_error(self) -> None: ... @abstractmethod def _handle_user_input(self, msg: InputSubmission) -> None: pass @abstractmethod def _handle_eof_command(self, msg: EOFCommand) -> None: pass @abstractmethod def _handle_normal_command(self, cmd: CommandToBackend) -> None: pass @abstractmethod def _handle_immediate_command(self, cmd: ImmediateCommand) -> None: """Command handler will be executed in command reading thread, right after receiving the command""" class MainBackend(BaseBackend, ABC): """Backend which does not forward to another backend""" def __init__(self): self._command_handlers = {} self._jedi_is_loaded = False BaseBackend.__init__(self) def add_command(self, command_name, handler): """Handler should be 1-argument function taking command object. Handler may return None (in this case no response is sent to frontend) or a BackendResponse """ self._command_handlers[command_name] = handler def send_message(self, msg: MessageFromBackend) -> None: super().send_message(msg) # take the time for pre-loading jedi after the first toplevel response if isinstance(msg, ToplevelResponse): self._check_load_jedi() def _handle_normal_command(self, cmd: CommandToBackend) -> None: assert isinstance(cmd, (ToplevelCommand, InlineCommand)) logger.debug("Command: %r", cmd) if cmd.name in self._command_handlers: handler = self._command_handlers[cmd.name] else: handler = getattr(self, "_cmd_" + cmd.name, None) if handler is None: if isinstance(cmd, ToplevelCommand): self._send_output(f"Unknown command '{cmd.name}'", "stderr") response = {"error": "Unknown command: " + cmd.name} else: try: response = handler(cmd) # Exceptions must be caused by Thonny or plugins code, because the ones # from user code are caught at execution places except UserError as e: logger.info("UserError while handling %r", cmd.name, exc_info=True) if isinstance(cmd, ToplevelCommand): print(str(e), file=sys.stderr) response = {} else: response = {"error": str(e)} except KeyboardInterrupt as e: if isinstance(cmd, ToplevelCommand): print(str(e), file=sys.stderr) response = {} else: response = {"error": "Interrupted", "interrupted": True} except Exception as e: logger.exception("Exception while handling %r", cmd.name) self._report_internal_exception("Exception while handling %r" % cmd.name) sys.exit(1) if response is False: # Command doesn't want to send any response return real_response = self._prepare_command_response(response, cmd) self.send_message(real_response) def _cmd_get_dirs_children_info(self, cmd): """Provides information about immediate children of paths opened in a file browser""" data = { path: self._get_filtered_dir_children_info(path, cmd["include_hidden"]) for path in cmd["paths"] } return {"node_id": cmd["node_id"], "dir_separator": self._get_sep(), "data": data} def _cmd_prepare_upload(self, cmd): """Returns info about items to be overwritten or merged by cmd.paths""" return {"existing_items": self._get_paths_info(cmd.target_paths, recurse=False)} def _cmd_prepare_download(self, cmd): assert "id" in cmd """Returns info about all items under and including cmd.paths""" return {"all_items": self._get_paths_info(cmd.source_paths, recurse=True)} def _cmd_shell_autocomplete(self, cmd): error = None try: from thonny import jedi_utils except ImportError: completions = [] error = "Could not import jedi" else: import __main__ with warnings.catch_warnings(): completions = jedi_utils.get_interpreter_completions( cmd.source, [__main__.__dict__], sys_path=self._get_sys_path_for_analysis() ) return dict( source=cmd.source, completions=completions, error=error, row=cmd.row, column=cmd.column, ) def _cmd_editor_autocomplete(self, cmd): logger.debug("Starting _cmd_editor_autocomplete") error = None try: from thonny import jedi_utils with warnings.catch_warnings(): completions = jedi_utils.get_script_completions( cmd.source, cmd.row, cmd.column, cmd.filename, sys_path=self._get_sys_path_for_analysis(), ) except ImportError: completions = [] error = "Could not import jedi" return dict( source=cmd.source, row=cmd.row, column=cmd.column, filename=cmd.filename, completions=completions, error=error, ) def _cmd_get_completion_details(self, cmd): # it is assumed this gets called after requesting editor or shell completions from thonny import jedi_utils return InlineResponse( "get_completion_details", full_name=cmd.full_name, details=jedi_utils.get_completion_details(cmd.full_name), ) def _cmd_get_editor_calltip(self, cmd): from thonny import jedi_utils signatures = jedi_utils.get_script_signatures( cmd.source, cmd.row, cmd.column, cmd.filename, sys_path=self._get_sys_path_for_analysis(), ) return InlineResponse( "get_editor_calltip", source=cmd.source, row=cmd.row, column=cmd.column, filename=cmd.filename, signatures=signatures, ) def _cmd_get_shell_calltip(self, cmd): import __main__ from thonny import jedi_utils signatures = jedi_utils.get_interpreter_signatures( cmd.source, [__main__.__dict__], sys_path=self._get_sys_path_for_analysis() ) return InlineResponse( "get_shell_calltip", source=cmd.source, row=cmd.row, column=cmd.column, filename=cmd.filename, signatures=signatures, ) def _cmd_highlight_occurrences(self, cmd): from thonny import jedi_utils refs = jedi_utils.get_references( cmd.source, cmd.row, cmd.column, cmd.filename, scope="file", sys_path=self._get_sys_path_for_analysis(), ) return {"references": refs, "text_last_operation_time": cmd.text_last_operation_time} def _cmd_get_definitions(self, cmd): from thonny import jedi_utils defs = jedi_utils.get_definitions( cmd.source, cmd.row, cmd.column, filename=cmd.filename, sys_path=self._get_sys_path_for_analysis(), ) return {"definitions": defs} def _cmd_get_active_distributions(self, cmd): raise NotImplementedError() def _cmd_install_distributions(self, cmd): raise NotImplementedError() def _cmd_uninstall_distributions(self, cmd): raise NotImplementedError() def _get_sys_path_for_analysis(self) -> Optional[List[str]]: return None def _get_paths_info(self, paths: List[str], recurse: bool) -> Dict[str, Dict]: result = {} for path in paths: info = self._get_path_info(path) if info is not None: info["anchor"] = path result[path] = info if recurse and info is not None and info["kind"] == "dir": desc_infos = self._get_dir_descendants_info(path) for key in desc_infos: desc_infos[key]["anchor"] = path result.update(desc_infos) return result def _get_dir_descendants_info(self, path: str, include_hidden: bool = False) -> Dict[str, Dict]: """Assumes path is dir. Dict is keyed by full path""" result = {} children_info = self._get_filtered_dir_children_info(path, include_hidden) for child_name, child_info in children_info.items(): full_child_path = path + self._get_sep() + child_name result[full_child_path] = child_info if child_info["kind"] == "dir": result.update(self._get_dir_descendants_info(full_child_path)) return result def _get_filtered_dir_children_info( self, path: str, include_hidden: bool = False ) -> Optional[Dict[str, Dict]]: children = self._get_dir_children_info(path, include_hidden) if children is None: return None return {name: children[name] for name in children if name not in IGNORED_FILES_AND_DIRS} @abstractmethod def _get_path_info(self, path: str) -> Optional[Dict]: """Returns information about this path or None if it doesn't exist""" @abstractmethod def _get_dir_children_info( self, path: str, include_hidden: bool = False ) -> Optional[Dict[str, Dict]]: """For existing dirs returns Dict[child_short_name, Dict of its information]. Returns None if path doesn't exist or is not a dir. """ @abstractmethod def _get_sep(self) -> str: """Returns symbol for combining parent directory path and child name""" def _check_load_jedi(self) -> None: if self._jedi_is_loaded: return logger.info("Loading Jedi") report_time("Before loading Jedi") try_load_modules_with_frontend_sys_path(["jedi", "parso"]) self._jedi_is_loaded = True report_time("After loading Jedi") class UploadDownloadMixin(ABC): """Backend, which runs on a local process and talks to a nonlocal system, and therefore is able to upload/download""" def _cmd_download(self, cmd): errors = self._transfer_files_and_dirs( cmd.items, self._ensure_local_directory, self._download_file, cmd, pathlib.Path ) return {"errors": errors} def _cmd_upload(self, cmd): def upload_file_wrapper(source_path, target_path, callback): self._upload_file( source_path, target_path, callback, cmd["make_shebang_scripts_executable"] ) errors = self._transfer_files_and_dirs( cmd.items, self._ensure_remote_directory, upload_file_wrapper, cmd, pathlib.PurePosixPath, ) return {"errors": errors} def _cmd_read_file(self, cmd): def callback(completed, total): self._report_progress(cmd, cmd["path"], completed, total) with io.BytesIO() as fp: self._read_file(cmd["path"], fp, callback) fp.seek(0) content_bytes = fp.read() return {"content_bytes": content_bytes, "path": cmd["path"]} def _cmd_write_file(self, cmd): def callback(completed, total): self._report_progress(cmd, cmd["path"], completed, total) with io.BytesIO() as fp: fp.write(cmd["content_bytes"]) fp.seek(0) self._write_file( fp, cmd["path"], file_size=len(cmd["content_bytes"]), callback=callback, make_shebang_scripts_executable=cmd["make_shebang_scripts_executable"], ) return InlineResponse( command_name="write_file", path=cmd["path"], editor_id=cmd.get("editor_id") ) def _supports_directories(self) -> bool: return True def _transfer_files_and_dirs( self, items: Iterable[Dict], ensure_dir_fun: Callable[[str], None], transfer_file_fun: Callable, cmd, target_path_class, ) -> List[str]: total_cost = 0 for item in items: if item["kind"] == "file": total_cost += item["size"] + self._get_file_fixed_cost() else: total_cost += self._get_dir_transfer_cost() completed_cost = 0 errors = [] ensured_dirs = set() def ensure_dir(path): if path in ensured_dirs: return ensure_dir_fun(path) ensured_dirs.add(path) for item in sorted(items, key=lambda x: x["source_path"]): self._report_progress(cmd, "Starting", completed_cost, total_cost) def copy_bytes_notifier(completed_bytes, total_bytes): completed = completed_cost + completed_bytes desc = str(round(completed / total_cost * 100)) + "%" self._report_progress(cmd, desc, completed, total_cost) try: if item["kind"] == "dir": ensure_dir(item["target_path"]) completed_cost += self._get_dir_transfer_cost() else: if self._supports_directories(): ensure_dir(self._get_parent_directory(item["target_path"])) print("%s (%d bytes)" % (item["source_path"], item["size"])) transfer_file_fun(item["source_path"], item["target_path"], copy_bytes_notifier) completed_cost += self._get_file_fixed_cost() + item["size"] except OSError as e: errors.append( "Could not copy %s to %s: %s" % (item["source_path"], item["target_path"], str(e)) ) return errors def _download_file(self, source_path, target_path, callback): with open(target_path, "bw") as target_fp: self._read_file(source_path, target_fp, callback) def _upload_file( self, source_path, target_path, callback, make_shebang_scripts_executable: bool ): with open(source_path, "br") as source_fp: self._write_file( source_fp, target_path, os.path.getsize(source_path), callback, make_shebang_scripts_executable, ) def _get_dir_transfer_cost(self): # Validating and maybe creating a directory is taken to be equal to copying this number of bytes return 1000 def _get_file_fixed_cost(self): # Creating or overwriting a file is taken to be equal to copying this number of bytes return 100 def _get_parent_directory(self, path: str): return universal_dirname(path) def _ensure_local_directory(self, path: str) -> None: os.makedirs(path, NEW_DIR_MODE, exist_ok=True) def _ensure_remote_directory(self, path: str) -> None: # assuming remote system is Posix ensure_posix_directory(path, self._get_stat_mode_for_upload, self._mkdir_for_upload) @abstractmethod def _get_stat_mode_for_upload(self, path: str) -> Optional[int]: """returns None if path doesn't exist""" @abstractmethod def _mkdir_for_upload(self, path: str) -> None: raise NotImplementedError() @abstractmethod def _write_file( self, source_fp: BinaryIO, target_path: str, file_size: int, callback: Callable[[int, int], None], make_shebang_scripts_executable: bool, ) -> None: raise NotImplementedError() @abstractmethod def _read_file( self, source_path: str, target_fp: BinaryIO, callback: Callable[[int, int], None] ) -> None: raise NotImplementedError() @abstractmethod def _report_internal_exception(self): raise NotImplementedError() @abstractmethod def _report_progress( self, cmd, description: Optional[str], value: float, maximum: float ) -> None: raise NotImplementedError() class RemoteProcess: """Modelled after subprocess.Popen""" def __init__(self, client, channel, stdin, stdout, pid): self._client = client self._channel = channel self.stdin = stdin self.stdout = stdout self.pid = pid self.returncode = None def poll(self): if self._channel.exit_status_ready(): self.returncode = self._channel.recv_exit_status() return self.returncode else: return None def wait(self): self.returncode = self._channel.recv_exit_status() return self.returncode def kill(self): _, stdout, _ = self._client.exec_command("kill -9 %s" % self.pid) # wait until completion stdout.channel.recv_exit_status() class SshMixin(UploadDownloadMixin): def __init__(self, host, user, password, interpreter, cwd): # UploadDownloadMixin.__init__(self) try: import paramiko from paramiko.client import AutoAddPolicy, SSHClient except ImportError: print( "\nThis back-end requires an extra package named 'paramiko'." " Install it from 'Tools => Manage plug-ins' or via your system package manager.", file=sys.stderr, ) sys.exit(1) self._host = host self._user = user self._password = password self._target_interpreter = interpreter self._cwd = cwd self._proc = None # type: Optional[RemoteProcess] self._sftp = None # type: Optional[paramiko.SFTPClient] self._client = SSHClient() self._client.load_system_host_keys() self._client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy()) # TODO: does it get closed properly after process gets killed? self._connect() def _connect(self): from paramiko import SSHException try: self._client.connect( hostname=self._host, username=self._user, password=self._password, passphrase=self._password, ) except (SSHException, OSError) as e: print( "\nCan't connect to '%s' with user '%s': %s" % (self._host, self._user, str(e)), file=sys.stderr, ) print("Re-check your host, authentication method, password or keys.", file=sys.stderr) delete_stored_ssh_password() sys.exit(1) def _create_remote_process(self, cmd_items: List[str], cwd: str, env: Dict) -> RemoteProcess: import shlex # Before running the main thing: # * print process id (so that we can kill it later) # http://redes-privadas-virtuales.blogspot.com/2013/03/getting-hold-of-remote-pid-through.html # * change to desired directory # # About -onlcr: https://stackoverflow.com/q/35887380/261181 cmd_line_str = ( "echo $$ ; stty -echo ; stty -onlcr ; " + (" cd %s 2> /dev/null ;" % shlex.quote(cwd) if cwd else "") + (" exec " + " ".join(map(shlex.quote, cmd_items))) ) stdin, stdout, _ = self._client.exec_command( cmd_line_str, bufsize=0, get_pty=True, environment=env ) # stderr gets directed to stdout because of pty pid = stdout.readline().strip() channel = stdout.channel return RemoteProcess(self._client, channel, stdin, stdout, pid) def _handle_immediate_command(self, cmd: ImmediateCommand) -> None: if cmd.name == "kill": self._kill() elif cmd.name == "interrupt": self._interrupt() else: raise RuntimeError("Unknown immediateCommand %s" % cmd.name) def _kill(self): if self._proc is None or self._proc.poll() is not None: return self._proc.kill() def _interrupt(self): pass def _get_sftp(self, fresh: bool): if fresh and self._sftp is not None: self._sftp.close() self._sftp = None if self._sftp is None: import paramiko # TODO: does it get closed properly after process gets killed? self._sftp = paramiko.SFTPClient.from_transport(self._client.get_transport()) return self._sftp def _read_file( self, source_path: str, target_fp: BinaryIO, callback: Callable[[int, int], None] ) -> None: self._perform_sftp_operation_with_retry( lambda sftp: sftp.getfo(source_path, target_fp, callback) ) def _write_file( self, source_fp: BinaryIO, target_path: str, file_size: int, callback: Callable[[int, int], None], make_shebang_scripts_executable: bool, ) -> None: logger.info("Writing bytes to %r", target_path) if make_shebang_scripts_executable: source_fp, has_shebang = convert_newlines_if_has_shebang(source_fp) else: has_shebang = None self._perform_sftp_operation_with_retry( lambda sftp: sftp.putfo(source_fp, target_path, callback) ) logger.debug( "make_shebang_scripts_executable: %r, has_shebang: %r", make_shebang_scripts_executable, has_shebang, ) if make_shebang_scripts_executable and has_shebang: self._perform_sftp_operation_with_retry(lambda sftp: sftp.chmod(target_path, 0o755)) def _perform_sftp_operation_with_retry(self, operation) -> Any: try: return operation(self._get_sftp(fresh=False)) except OSError: # It looks like SFTPClient gets stale after a while. # Try again with fresh SFTPClient return operation(self._get_sftp(fresh=True)) def _get_stat_mode_for_upload(self, path: str) -> Optional[int]: try: return self._perform_sftp_operation_with_retry(lambda sftp: sftp.stat(path).st_mode) except OSError as e: return None def _mkdir_for_upload(self, path: str) -> None: self._perform_sftp_operation_with_retry(lambda sftp: sftp.mkdir(path, NEW_DIR_MODE)) def _longest_common_path_prefix(str_paths, path_class): assert str_paths if len(str_paths) == 1: return str_paths[0] list_of_parts = [] for str_path in str_paths: list_of_parts.append(path_class(str_path).parts) first = list_of_parts[0] rest = list_of_parts[1:] i = 0 while i < len(first): item_i = first[i] if not all([len(x) > i and x[i] == item_i for x in rest]): break else: i += 1 if i == 0: return "" result = path_class(first[0]) for j in range(1, i): result = result.joinpath(first[j]) return str(result) def ensure_posix_directory( path: str, stat_mode_fun: Callable[[str], Optional[int]], mkdir_fun: Callable[[str], None] ) -> None: assert path.startswith("/") if path == "/": return for step in list(reversed(list(map(str, pathlib.PurePosixPath(path).parents)))) + [path]: if step != "/": mode = stat_mode_fun(step) if mode is None: mkdir_fun(step) elif not stat.S_ISDIR(mode): raise AssertionError("'%s' is file, not a directory" % step) def interrupt_local_process() -> None: """Meant to be executed from a background thread""" import signal if hasattr(signal, "raise_signal"): # Python 3.8 and later signal.raise_signal(signal.SIGINT) elif sys.platform == "win32": # https://stackoverflow.com/a/51122690/261181 import ctypes ucrtbase = ctypes.CDLL("ucrtbase") c_raise = ucrtbase["raise"] c_raise(signal.SIGINT) else: # Does not give KeyboardInterrupt in Windows os.kill(os.getpid(), signal.SIGINT) def get_ssh_password_file_path(): from thonny import THONNY_USER_DIR return os.path.join(THONNY_USER_DIR, "ssh_password") def delete_stored_ssh_password(): if os.path.exists(get_ssh_password_file_path()): # invalidate stored password os.remove(get_ssh_password_file_path()) def convert_newlines_if_has_shebang(fp: BinaryIO) -> Tuple[BinaryIO, bool]: if fp.read(3) == b"#!/": fp.seek(0) new_fp = io.BytesIO() new_fp.write(fp.read().replace(b"\r\n", b"\n")) fp.close() new_fp.seek(0) return new_fp, True else: fp.seek(0) return fp, False if __name__ == "__main__": # print(_closest_common_directory(["C:\\kala\\pala", "C:\\kala", "D:\\kuku"], pathlib.PureWindowsPath)) print(_longest_common_path_prefix(["C:\\kala\\pala", "C:\\kala"], pathlib.PureWindowsPath)) print(_longest_common_path_prefix(["C:\\kala\\pala"], pathlib.PureWindowsPath)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1661840667.0 thonny-4.0.1/thonny/base_file_browser.py0000664000175000017500000015065014303326433020224 0ustar00annamaaannamaaimport datetime import os.path import shutil import stat import subprocess import time import tkinter as tk from logging import getLogger from tkinter import messagebox, simpledialog, ttk from typing import Optional from thonny import get_runner, get_workbench, misc_utils, tktextext from thonny.common import InlineCommand, UserError, get_dirs_children_info from thonny.languages import tr from thonny.misc_utils import running_on_mac_os, running_on_windows, sizeof_fmt from thonny.ui_utils import ( CommonDialog, ask_one_from_choices, ask_string, create_string_var, ems_to_pixels, get_hyperlink_cursor, lookup_style_option, scrollbar_style, show_dialog, ) _dummy_node_text = "..." _LOCAL_FILES_ROOT_TEXT = "" # needs to be initialized later ROOT_NODE_ID = "" HIDDEN_FILES_OPTION = "file.show_hidden_files" logger = getLogger(__name__) class BaseFileBrowser(ttk.Frame): def __init__(self, master, show_expand_buttons=True): self.show_expand_buttons = show_expand_buttons self._cached_child_data = {} self.path_to_highlight = None ttk.Frame.__init__(self, master, borderwidth=0, relief="flat") self.vert_scrollbar = ttk.Scrollbar( self, orient=tk.VERTICAL, style=scrollbar_style("Vertical") ) self.vert_scrollbar.grid(row=0, column=1, sticky=tk.NSEW, rowspan=3) tktextext.fixwordbreaks(tk._default_root) self.building_breadcrumbs = False self.init_header(row=0, column=0) spacer = ttk.Frame(self, height=1) spacer.grid(row=1, sticky="nsew") self.tree = ttk.Treeview( self, columns=["#0", "kind", "path", "name", "modified", "size"], displaycolumns=( # 4, # 5 ), yscrollcommand=self.vert_scrollbar.set, selectmode="extended", ) self.tree.grid(row=2, column=0, sticky=tk.NSEW) self.vert_scrollbar["command"] = self.tree.yview self.columnconfigure(0, weight=1) self.rowconfigure(2, weight=1) self.tree["show"] = "tree" self.tree.bind("<3>", self.on_secondary_click, True) if misc_utils.running_on_mac_os(): self.tree.bind("<2>", self.on_secondary_click, True) self.tree.bind("", self.on_secondary_click, True) self.tree.bind("", self.on_double_click, True) self.tree.bind("<>", self.on_open_node) self.copypaste = None wb = get_workbench() self.folder_icon = wb.get_image("folder") self.python_file_icon = wb.get_image("python-icon") self.text_file_icon = wb.get_image("text-file") self.generic_file_icon = wb.get_image("generic-file") self.hard_drive_icon = wb.get_image("hard-drive") self.tree.column("#0", width=200, anchor=tk.W) self.tree.heading("#0", text=tr("Name"), anchor=tk.W) self.tree.column("modified", width=60, anchor=tk.W) self.tree.heading("modified", text=tr("Modified"), anchor=tk.W) self.tree.column("size", width=40, anchor=tk.E) self.tree.heading("size", text=tr("Size (bytes)"), anchor=tk.E) self.tree.column("kind", width=30, anchor=tk.W) # self.tree.heading("kind", text="Kind") # self.tree.column("path", width=300, anchor=tk.W) # self.tree.heading("path", text="path") # self.tree.column("name", width=60, anchor=tk.W) # self.tree.heading("name", text="name") # set-up root node self.tree.set(ROOT_NODE_ID, "kind", "root") self.menu = tk.Menu(self.tree, tearoff=False) self.current_focus = None def init_header(self, row, column): header_frame = ttk.Frame(self, style="ViewToolbar.TFrame") header_frame.grid(row=row, column=column, sticky="nsew") header_frame.columnconfigure(0, weight=1) self.path_bar = tktextext.TweakableText( header_frame, borderwidth=0, relief="flat", height=1, font="TkDefaultFont", wrap="word", padx=ems_to_pixels(0.6), pady=ems_to_pixels(0.5), insertwidth=0, highlightthickness=0, background=lookup_style_option("ViewToolbar.TFrame", "background"), ) self.path_bar.grid(row=0, column=0, sticky="nsew") self.path_bar.set_read_only(True) self.path_bar.bind("", self.resize_path_bar, True) self.path_bar.tag_configure( "dir", foreground=lookup_style_option("Url.TLabel", "foreground") ) self.path_bar.tag_configure("underline", underline=True) def get_dir_range(event): mouse_index = self.path_bar.index("@%d,%d" % (event.x, event.y)) return self.path_bar.tag_prevrange("dir", mouse_index + "+1c") def dir_tag_motion(event): self.path_bar.tag_remove("underline", "1.0", "end") dir_range = get_dir_range(event) if dir_range: range_start, range_end = dir_range self.path_bar.tag_add("underline", range_start, range_end) def dir_tag_enter(event): self.path_bar.config(cursor=get_hyperlink_cursor()) def dir_tag_leave(event): self.path_bar.config(cursor="") self.path_bar.tag_remove("underline", "1.0", "end") def dir_tag_click(event): mouse_index = self.path_bar.index("@%d,%d" % (event.x, event.y)) lineno = int(float(mouse_index)) if lineno == 1: self.request_focus_into("") else: assert lineno == 2 dir_range = get_dir_range(event) if dir_range: _, end_index = dir_range path = self.path_bar.get("2.0", end_index) if path.endswith(":"): path += "\\" self.request_focus_into(path) self.path_bar.tag_bind("dir", "<1>", dir_tag_click) self.path_bar.tag_bind("dir", "", dir_tag_enter) self.path_bar.tag_bind("dir", "", dir_tag_leave) self.path_bar.tag_bind("dir", "", dir_tag_motion) # self.menu_button = ttk.Button(header_frame, text="≡ ", style="ViewToolbar.Toolbutton") self.menu_button = ttk.Button( header_frame, text=" ≡ ", style="ViewToolbar.Toolbutton", command=self.post_button_menu ) # self.menu_button.grid(row=0, column=1, sticky="ne") self.menu_button.place(anchor="ne", rely=0, relx=1) def clear(self): self.clear_error() self.invalidate_cache() self.path_bar.direct_delete("1.0", "end") self.tree.set_children("") self.current_focus = None def path_exists(self, path: str) -> Optional[bool]: return None def request_focus_into(self, path): return self.focus_into(path) def focus_into(self, path): self.clear_error() self.invalidate_cache() # clear self.tree.set_children(ROOT_NODE_ID) self.tree.set(ROOT_NODE_ID, "path", path) self.building_breadcrumbs = True self.path_bar.direct_delete("1.0", "end") self.path_bar.direct_insert("1.0", self.get_root_text(), ("dir",)) if path and path != "/": self.path_bar.direct_insert("end", "\n") def create_spacer(): return ttk.Frame(self.path_bar, height=1, width=4, style="ViewToolbar.TFrame") parts = self.split_path(path) for i, part in enumerate(parts): if i > 0: if parts[i - 1] != "": self.path_bar.window_create("end", window=create_spacer()) self.path_bar.direct_insert("end", self.get_dir_separator()) self.path_bar.window_create("end", window=create_spacer()) self.path_bar.direct_insert("end", part, tags=("dir",)) self.building_breadcrumbs = False self.resize_path_bar() self.render_children_from_cache() self.scroll_to_top() self.current_focus = path def scroll_to_top(self): children = self.tree.get_children() if children: self.tree.see(children[0]) def split_path(self, path): return path.split(self.get_dir_separator()) def get_root_text(self): return get_local_files_root_text() def on_open_node(self, event): node_id = self.get_selected_node() if self.get_selected_kind() == "file": # can happen in Windows when pressing ENTER on file return "break" path = self.tree.set(node_id, "path") if path: # and path not in self._cached_child_data: self.render_children_from_cache(node_id) # self.request_dirs_child_data(node_id, [path]) # else: def resize_path_bar(self, event=None): if self.building_breadcrumbs: return height = self.tk.call((self.path_bar, "count", "-update", "-displaylines", "1.0", "end")) self.path_bar.configure(height=height) def _cleaned_selection(self): # In some cases (eg. Python 3.6.9 and Tk 8.6.8 in Ubuntu when selecting a range with shift), # nodes may contain collapsed children. # In most cases this does no harm, because the command would apply to children as well, # but dummy dir marker nodes may cause confusion nodes = self.tree.selection() return [node for node in nodes if self.tree.item(node, "text") != _dummy_node_text] def get_selected_node(self): """Returns single node (or nothing)""" nodes = self._cleaned_selection() if len(nodes) == 1: return nodes[0] elif len(nodes) > 1: return self.tree.focus() or None else: return None def get_selected_nodes(self, notify_if_empty=False): """Can return several nodes""" result = self._cleaned_selection() if not result and notify_if_empty: self.notify_missing_selection() return result def get_selection_info(self, notify_if_empty=False): nodes = self.get_selected_nodes(notify_if_empty) if not nodes: return None elif len(nodes) == 1: description = "'" + self.tree.set(nodes[0], "name") + "'" else: description = tr("%d items") % len(nodes) paths = [self.tree.set(node, "path") for node in nodes] kinds = [self.tree.set(node, "kind") for node in nodes] return {"description": description, "nodes": nodes, "paths": paths, "kinds": kinds} def get_selected_path(self): return self.get_selected_value("path") def get_selected_kind(self): return self.get_selected_value("kind") def get_selected_name(self): return self.get_selected_value("name") def get_extension_from_name(self, name): if name is None: return None if "." in name: return "." + name.split(".")[-1].lower() else: return name.lower() def get_selected_value(self, key): node_id = self.get_selected_node() if node_id: return self.tree.set(node_id, key) else: return None def get_active_directory(self): path = self.tree.set(ROOT_NODE_ID, "path") return path def request_dirs_child_data(self, node_id, paths): raise NotImplementedError() def show_fs_info(self): path = self.get_selected_path() if path is None: path = self.current_focus self.request_fs_info(path) def request_fs_info(self, path): raise NotImplementedError() def present_fs_info(self, info): total_str = "?" if info["total"] is None else sizeof_fmt(info["total"]) used_str = "?" if info["used"] is None else sizeof_fmt(info["used"]) free_str = "?" if info["free"] is None else sizeof_fmt(info["free"]) text = tr("Storage space on this drive or filesystem") + ":\n\n" " %s: %s\n" % ( tr("total space"), total_str, ) + " %s: %s\n" % (tr("used space"), used_str) + " %s: %s\n" % ( tr("free space"), free_str, ) if info.get("comment"): text += "\n" + info["comment"] messagebox.showinfo(tr("Storage info"), text, master=self) def cache_dirs_child_data(self, data): from copy import deepcopy data = deepcopy(data) for parent_path in data: children_data = data[parent_path] if isinstance(children_data, dict): for child_name in children_data: child_data = children_data[child_name] assert isinstance(child_data, dict) if "label" not in child_data: child_data["label"] = child_name if "isdir" not in child_data: child_data["isdir"] = child_data.get("size", 0) is None else: assert children_data is None self._cached_child_data.update(data) def file_exists_in_cache(self, path): for parent_path in self._cached_child_data: # hard to split because it may not be in this system format name = path[len(parent_path) :] if name[0:1] in ["/", "\\"]: name = name[1:] if name in self._cached_child_data[parent_path]: return True return False def select_path_if_visible(self, path, node_id=""): for child_id in self.tree.get_children(node_id): if self.tree.set(child_id, "path") == path: self.tree.selection_set(child_id) return if self._is_open_dir_node(child_id): self.select_path_if_visible(path, child_id) def _is_open_dir_node(self, node_id) -> bool: # In Windows a node may get open=True simply by pressing ENTER on it return self.tree.item(node_id, "open") and self.tree.set(node_id, "kind") != "file" def get_open_paths(self, node_id=ROOT_NODE_ID): if self.tree.set(node_id, "kind") == "file": return set() elif node_id == ROOT_NODE_ID or self._is_open_dir_node(node_id): result = {self.tree.set(node_id, "path")} for child_id in self.tree.get_children(node_id): result.update(self.get_open_paths(child_id)) return result else: return set() def invalidate_cache(self, paths=None): if paths is None: self._cached_child_data.clear() else: for path in paths: if path in self._cached_child_data: del self._cached_child_data[path] def render_children_from_cache(self, node_id=""): """This node is supposed to be a directory and its contents needs to be shown and/or refreshed""" path = self.tree.set(node_id, "path") kind = self.tree.set(node_id, "kind") if kind == "file": logger.warning("File %r is treated as dir", path) return logger.debug("Rendering %r from cache", path) if path not in self._cached_child_data: self.request_dirs_child_data(node_id, self.get_open_paths() | {path}) # leave it as is for now, it will be updated later return children_data = self._cached_child_data[path] if children_data in ["file", "missing"]: # path used to be a dir but is now a file or does not exist # if browser is focused into this path if node_id == "": self.show_error("Directory " + path + " does not exist anymore", node_id) elif children_data == "missing": self.tree.delete(node_id) else: assert children_data == "file" self.tree.set_children(node_id) # clear the list of children self.tree.item(node_id, open=False) elif children_data is None: raise RuntimeError("None data for %s" % path) else: fs_children_names = children_data.keys() tree_children_ids = self.tree.get_children(node_id) # recollect children children = {} # first the ones, which are present already in tree for child_id in tree_children_ids: name = self.tree.set(child_id, "name") if name in fs_children_names: children[name] = child_id self.update_node_data(child_id, name, children_data[name]) # add missing children for name in fs_children_names: if name not in children: child_id = self.tree.insert(node_id, "end") children[name] = child_id self.tree.set(children[name], "path", self.join(path, name)) self.update_node_data(child_id, name, children_data[name]) def file_order(name): # items in a folder should be ordered so that # folders come first and names are ordered case insensitively return ( not children_data[name]["isdir"], # prefer directories not ":" in name, # prefer drives name.upper(), name, ) # update tree ids_sorted_by_name = list( map(lambda key: children[key], sorted(children.keys(), key=file_order)) ) self.tree.set_children(node_id, *ids_sorted_by_name) # recursively update open children for child_id in ids_sorted_by_name: if self._is_open_dir_node(child_id): self.render_children_from_cache(child_id) def show_error(self, msg, node_id=""): if not node_id: # clear tree self.tree.set_children("") err_id = self.tree.insert(node_id, "end") self.tree.item(err_id, text=msg) self.tree.set_children(node_id, err_id) def clear_error(self): "TODO:" def update_node_data(self, node_id, name, data): assert node_id != "" path = self.tree.set(node_id, "path") if data.get("modified"): try: # modification time is Unix epoch time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(data["modified"]))) except Exception: time_str = "" else: time_str = "" self.tree.set(node_id, "modified", time_str) if data["isdir"]: self.tree.set(node_id, "kind", "dir") self.tree.set(node_id, "size", "") # Ensure that expand button is visible # unless we know it doesn't have children children_ids = self.tree.get_children(node_id) if ( self.show_expand_buttons and len(children_ids) == 0 and (path not in self._cached_child_data or self._cached_child_data[path]) ): self.tree.insert(node_id, "end", text=_dummy_node_text) if path.endswith(":") or path.endswith(":\\"): img = self.hard_drive_icon else: img = self.folder_icon else: self.tree.set(node_id, "kind", "file") self.tree.set(node_id, "size", data["size"]) # Make sure it doesn't have children self.tree.set_children(node_id) if ( path.lower().endswith(".py") or path.lower().endswith(".pyw") or path.lower().endswith(".pyi") ): img = self.python_file_icon elif self.should_open_name_in_thonny(name): img = self.text_file_icon else: img = self.generic_file_icon self.tree.set(node_id, "name", name) self.tree.item(node_id, text=" " + data["label"], image=img) def join(self, parent, child): if parent == "": if self.get_dir_separator() == "/": return "/" + child else: return child if parent.endswith(self.get_dir_separator()): return parent + child else: return parent + self.get_dir_separator() + child def get_dir_separator(self): return os.path.sep def on_double_click(self, event): # TODO: don't act when the click happens below last item path = self.get_selected_path() kind = self.get_selected_kind() name = self.get_selected_name() if kind == "file": if self.should_open_name_in_thonny(name): self.open_file(path) else: self.open_path_with_system_app(path) elif kind == "dir": self.request_focus_into(path) return "break" def open_file(self, path): pass def open_path_with_system_app(self, path): pass def on_secondary_click(self, event): node_id = self.tree.identify_row(event.y) if node_id: if node_id not in self.tree.selection(): # replace current selection self.tree.selection_set(node_id) self.tree.focus(node_id) else: self.tree.selection_set() self.path_bar.focus_set() self.tree.update() self.refresh_menu(context="item") self.menu.tk_popup(event.x_root, event.y_root) def post_button_menu(self): self.refresh_menu(context="button") self.menu.tk_popup( self.menu_button.winfo_rootx(), self.menu_button.winfo_rooty() + self.menu_button.winfo_height(), ) def refresh_menu(self, context): self.menu.delete(0, "end") self.add_first_menu_items(context) self.menu.add_separator() self.add_middle_menu_items(context) self.menu.add_separator() self.add_last_menu_items(context) def is_active_browser(self): return False def add_first_menu_items(self, context): if context == "item": selected_path = self.get_selected_path() selected_kind = self.get_selected_kind() else: selected_path = self.get_active_directory() selected_kind = "dir" if context == "button": self.menu.add_command(label=tr("Refresh"), command=self.cmd_refresh_tree) self.menu.add_command( label=tr("Open in system file manager"), command=lambda: self.open_path_with_system_app(selected_path), ) else: if selected_kind == "dir": self.menu.add_command( label=tr("Focus into"), command=lambda: self.request_focus_into(selected_path) ) else: self.menu.add_command( label=tr("Open in Thonny"), command=lambda: self.open_file(selected_path) ) if self.is_active_browser(): self.menu.add_command( label=tr("Open in default external app"), command=lambda: self.open_path_with_system_app(selected_path), ) if selected_kind == "file": ext = self.get_extension_from_name(self.get_selected_name()) self.menu.add_command( label=tr("Configure %s files") % ext + "...", command=lambda: self.open_extension_dialog(ext), ) hidden_files_label = ( tr("Hide hidden files") if show_hidden_files() else tr("Show hidden files") ) self.menu.add_command(label=hidden_files_label, command=self.toggle_hidden_files) def toggle_hidden_files(self): get_workbench().set_option( HIDDEN_FILES_OPTION, not get_workbench().get_option(HIDDEN_FILES_OPTION) ) self.refresh_tree() def cmd_refresh_tree(self): self.refresh_tree() def open_extension_dialog(self, extension: str) -> None: system_choice = tr("Open in system default app") thonny_choice = tr("Open in Thonny's text editor") current_index = ( 1 if get_workbench().get_option(get_file_handler_conf_key(extension)) == "thonny" else 0 ) choice = ask_one_from_choices( title=tr("Configure %s files") % extension, question=tr( "What to do with a %s file when you double-click it in Thonny's file browser?" ) % extension, choices=[system_choice, thonny_choice], initial_choice_index=current_index, master=self.winfo_toplevel(), ) if not choice: return get_workbench().set_option( get_file_handler_conf_key(extension), "system" if choice == system_choice else "thonny", ) # update icons self.refresh_tree() def add_middle_menu_items(self, context): if self.supports_new_file(): self.menu.add_command(label=tr("New file") + "...", command=self.create_new_file) if self.supports_directories(): self.menu.add_command(label=tr("New directory") + "...", command=self.mkdir) if self.supports_copypaste(): self.menu.add_command(label=tr("Cut"), command=self.cut_files) self.menu.add_command(label=tr("Copy"), command=self.copy_files) target = self.get_selected_file() self.menu.add_command(label=tr("Paste"), command=self.paste_files) if ( target is None or not self.copypaste.has_selection() or self.copypaste.conflicts(target) ): self.menu.entryconfig(tr("Paste"), state="disabled") if self.supports_rename(): self.menu.add_command(label=tr("Rename"), command=self.rename_file) if self.supports_trash(): trash_label = tr("Move to Trash") self.menu.add_command(label=trash_label, command=self.move_to_trash) else: self.menu.add_command(label=tr("Delete"), command=self.delete) def add_last_menu_items(self, context): self.menu.add_command(label=tr("Properties"), command=self.show_properties) if context == "button": self.menu.add_command(label=tr("Storage space"), command=self.show_fs_info) def show_properties(self): node_id = self.get_selected_node() if node_id is None: self.notify_missing_selection() return values = self.tree.set(node_id) text = tr("Path") + ":\n " + values["path"] + "\n\n" if values["kind"] == "dir": title = tr("Directory properties") else: title = tr("File properties") size_fmt_str = sizeof_fmt(int(values["size"])) bytes_str = str(values["size"]) + " " + tr("bytes") text += ( tr("Size") + ":\n " + ( bytes_str if size_fmt_str.endswith(" B") else size_fmt_str + " (" + bytes_str + ")" ) + "\n\n" ) if values["modified"].strip(): text += tr("Modified") + ":\n " + values["modified"] + "\n\n" messagebox.showinfo(title, text.strip(), master=self) def refresh_tree(self, paths_to_invalidate=None): self.invalidate_cache(paths_to_invalidate) if self.winfo_ismapped(): self.render_children_from_cache("") if self.path_to_highlight: self.select_path_if_visible(self.path_to_highlight) self.path_to_highlight = None def create_new_file(self): selected_node_id = self.get_selected_node() if selected_node_id: selected_path = self.tree.set(selected_node_id, "path") selected_kind = self.tree.set(selected_node_id, "kind") if selected_kind == "dir": parent_path = selected_path else: parent_id = self.tree.parent(selected_node_id) parent_path = self.tree.set(parent_id, "path") else: parent_path = self.current_focus name = ask_string( "File name", "Provide filename", initial_value="", master=self.winfo_toplevel() ) if not name: return None path = self.join(parent_path, name) if self.path_exists(path): messagebox.showerror("Error", "The file '" + path + "' already exists", master=self) return self.create_new_file() else: self.create_new_file_editor(path) return path def create_new_file_editor(self, path): raise NotImplementedError() def delete(self): selection = self.get_selection_info(True) if not selection: return confirmation = "Are you sure want to delete %s?" % selection["description"] confirmation += "\n\nNB! Trash bin won't be used (no way to undelete)!" if "dir" in selection["kinds"]: confirmation += "\n" + "Directories will be deleted with content." if not messagebox.askyesno("Are you sure?", confirmation, master=self): return self.perform_delete(selection["paths"], tr("Deleting %s") % selection["description"]) self.refresh_tree() def move_to_trash(self): assert self.supports_trash() selection = self.get_selection_info(True) if not selection: return if not messagebox.askokcancel( tr("Moving to Trash"), tr("Move %s to Trash?") % selection["description"], icon="info", master=self, ): return self.perform_move_to_trash( selection["paths"], tr("Moving %s to Trash") % (selection["description"]) ) self.refresh_tree() def supports_trash(self): return False def mkdir(self): parent = self.get_selected_path() if parent is None: parent = self.current_focus else: if self.get_selected_kind() == "file": # dirname does the right thing even if parent is Linux path and running on Windows parent = os.path.dirname(parent) name = ask_string( tr("New directory"), tr("Enter name for new directory under\n%s") % parent, master=self.winfo_toplevel(), ) if not name or not name.strip(): return self.perform_mkdir(parent, name.strip()) self.refresh_tree() def perform_delete(self, paths, description): raise NotImplementedError() def perform_move_to_trash(self, paths, description): raise NotImplementedError() def supports_directories(self): return True def perform_mkdir(self, parent_dir, name): raise NotImplementedError() def notify_missing_selection(self): messagebox.showerror( tr("Nothing selected"), tr("Select an item and try again!"), master=self ) def should_open_name_in_thonny(self, name): ext = self.get_extension_from_name(name) return get_workbench().get_option(get_file_handler_conf_key(ext), "system") == "thonny" def supports_new_file(self): return False def get_selected_file(self): selection = self.get_selection_info(False) if not selection or len(selection["paths"]) > 1: return return selection["paths"][0] def supports_rename(self): return False def rename_file(self): old_name = self.get_selected_file() if old_name is None: return file_name = os.path.basename(old_name) new_name = simpledialog.askstring( tr("Rename '%s'") % file_name, tr("Enter new name"), initialvalue=file_name, parent=self ) if new_name: self.perform_rename(old_name, new_name) self.refresh_tree() def perform_rename(self, old_name, new_name): raise Exception("overload this in subclass") def supports_copypaste(self): return self.copypaste def cut_files(self): assert self.copypaste self.copypaste.cut() def copy_files(self): assert self.copypaste self.copypaste.copy() def paste_files(self): assert self.copypaste target = self.get_selected_file() assert target if os.path.isfile(target): target = os.path.dirname(target) self.copypaste.paste(target) class CopyPaste(object): def __init__(self, filebrowser): self.fb = filebrowser self.reset() def reset(self): self.mode = None self.paths = [] def get_selection_paths(self): selection = self.fb.get_selection_info(True) if selection: return selection["paths"] return [] def has_selection(self): return len(self.paths) > 0 def dirname(self, path): if os.path.isfile(path): path = os.path.dirname(path) return path def _conflicts(self, target): target = self.dirname(target) + os.sep folder = set(map(lambda x: self.dirname(x) + os.sep, self.paths)) if target in folder: return True for p in self.paths: p_isdir = os.path.isdir(p) if p_isdir: if target.startswith(p + os.sep): return True if p.startswith(target): _conf = p.find(os.sep, len(target)) < 0 if _conf: return True return False def conflicts(self, target): conf = self._conflicts(target) return conf def cut(self): self.paths = self.get_selection_paths() self.mode = "X" def copy(self): self.paths = self.get_selection_paths() self.mode = "C" def paste(self, target): # https://docs.python.org/3/library/shutil.html#shutil.move # depends on os.rename semantics try: if self.conflicts(target): messagebox.showerror( tr("Paste failed"), tr("There are conflicting folders"), parent=self ) return for f in self.paths: isfile = os.path.isfile(f) if self.mode == "C": if isfile: shutil.copy2(f, target) else: folder_target = os.path.join(target, os.path.basename(f)) shutil.copytree(f, folder_target, dirs_exist_ok=True) elif self.mode == "X": dest = shutil.move(f, target) else: raise Exception("unsupported mode") finally: self.reset() class BaseLocalFileBrowser(BaseFileBrowser): def __init__(self, master, show_expand_buttons=True): super().__init__(master, show_expand_buttons=show_expand_buttons) get_workbench().bind("WindowFocusIn", self.on_window_focus_in, True) get_workbench().bind("LocalFileOperation", self.on_local_file_operation, True) self.copypaste = CopyPaste(self) def destroy(self): super().destroy() get_workbench().unbind("WindowFocusIn", self.on_window_focus_in) get_workbench().unbind("LocalFileOperation", self.on_local_file_operation) def path_exists(self, path: str) -> Optional[bool]: return os.path.exists(path) def create_new_file_editor(self, path): get_workbench().get_editor_notebook().open_new_file(path) def request_dirs_child_data(self, node_id, paths): self.cache_dirs_child_data(get_dirs_children_info(paths, show_hidden_files())) self.render_children_from_cache(node_id) def split_path(self, path): parts = super().split_path(path) if running_on_windows() and path.startswith("\\\\"): # Don't split a network name! sep = self.get_dir_separator() for i in reversed(range(len(parts))): prefix = sep.join(parts[: i + 1]) if os.path.ismount(prefix): return [prefix] + parts[i + 1 :] # Could not find the prefix corresponding to mount return [path] else: return parts def open_file(self, path): get_workbench().get_editor_notebook().show_file(path) def open_path_with_system_app(self, path): try: open_with_default_app(path) except Exception as e: logger.error("Could not open %r in external. app", path, exc_info=e) messagebox.showerror( "Error", "Could not open '%s' in external app\nError: %s" % (path, e), parent=self.winfo_toplevel(), ) def on_window_focus_in(self, event=None): self.refresh_tree() def on_local_file_operation(self, event): if event["operation"] in ["save", "delete"]: self.refresh_tree() self.select_path_if_visible(event["path"]) def request_fs_info(self, path): if path == "": self.notify_missing_selection() else: if not os.path.isdir(path): path = os.path.dirname(path) import shutil self.present_fs_info(shutil.disk_usage(path)._asdict()) def perform_delete(self, paths, description): # Deprecated. moving to trash should be used instead raise NotImplementedError() def perform_move_to_trash(self, paths, description): # TODO: do it with subprocess dialog import send2trash for path in paths: send2trash.send2trash(path) def perform_mkdir(self, parent_dir, name): os.mkdir(os.path.join(parent_dir, name), mode=0o700) def supports_trash(self): try: import send2trash # @UnusedImport return True except ImportError: return False def supports_new_file(self): return True def supports_rename(self): return self.get_selected_file() def perform_rename(self, old_name, new_name): basepath = os.path.dirname(old_name) full_path = os.path.join(basepath, new_name) logger.debug("rename %s to %s" % (old_name, full_path)) if old_name == full_path: return if os.path.exists(full_path): raise UserError(tr("File already exists")) os.rename(old_name, full_path) class BaseRemoteFileBrowser(BaseFileBrowser): def __init__(self, master, show_expand_buttons=True): super().__init__(master, show_expand_buttons=show_expand_buttons) self.dir_separator = "/" get_workbench().bind("get_dirs_children_info_response", self.update_dir_data, True) get_workbench().bind("get_fs_info_response", self.present_fs_info, True) get_workbench().bind("RemoteFileOperation", self.on_remote_file_operation, True) def destroy(self): super().destroy() get_workbench().unbind("get_dirs_children_info_response", self.update_dir_data) get_workbench().unbind("get_fs_info_response", self.present_fs_info) get_workbench().unbind("RemoteFileOperation", self.on_remote_file_operation) def get_root_text(self): runner = get_runner() if runner: return runner.get_node_label() return "Back-end" def create_new_file_editor(self, path): get_workbench().get_editor_notebook().open_new_file(path, remote=True) def request_dirs_child_data(self, node_id, paths): if get_runner(): get_runner().send_command( InlineCommand( "get_dirs_children_info", node_id=node_id, paths=paths, include_hidden=show_hidden_files(), ) ) def request_fs_info(self, path): if get_runner(): get_runner().send_command(InlineCommand("get_fs_info", path=path)) def get_dir_separator(self): return self.dir_separator def update_dir_data(self, msg): if msg.get("error"): self.show_error(msg["error"]) else: self.dir_separator = msg["dir_separator"] self.cache_dirs_child_data(msg["data"]) self.render_children_from_cache(msg["node_id"]) if self.path_to_highlight: self.select_path_if_visible(self.path_to_highlight) self.path_to_highlight = None def open_file(self, path): get_workbench().get_editor_notebook().show_remote_file(path) def open_path_with_system_app(self, path): messagebox.showinfo( tr("Not supported"), tr("Opening remote files in external app is not supported.") + "\n\n" + tr( "If it is a text file, then you can configure it to open in Thonny " "by right-clicking it and selecting 'Configure ... files'." ) + "\n\n" + tr( "If the file needs to be opened in external app, then download it to a local " "directory and open it from there!" ), master=self, ) def supports_directories(self): runner = get_runner() if not runner: return False proxy = runner.get_backend_proxy() if not proxy: return False return proxy.supports_remote_directories() def on_remote_file_operation(self, event): path = event["path"] exists_in_cache = self.file_exists_in_cache(path) if ( event["operation"] == "save" and exists_in_cache or event["operation"] == "delete" and not exists_in_cache ): # No need to refresh return if "/" in path: parent = path[: path.rfind("/")] if not parent: parent = "/" else: parent = "" self.refresh_tree([parent]) self.path_to_highlight = path def perform_delete(self, paths, description): get_runner().send_command_and_wait( InlineCommand("delete", paths=paths, description=description), dialog_title=tr("Deleting"), ) def perform_mkdir(self, parent_dir, name): path = (parent_dir + self.get_dir_separator() + name).replace("//", "/") get_runner().send_command_and_wait( InlineCommand("mkdir", path=path), dialog_title=tr("Creating directory"), ) def supports_trash(self): return get_runner().get_backend_proxy().supports_trash() def request_focus_into(self, path): if not get_runner().ready_for_remote_file_operations(show_message=True): return False # super().request_focus_into(path) if not get_runner().supports_remote_directories(): assert path == "" self.focus_into(path) elif self.current_focus == path: # refreshes self.focus_into(path) else: self.request_new_focus(path) return True def request_new_focus(self, path): # Overridden in active browser self.focus_into(path) def cmd_refresh_tree(self): if not get_runner().ready_for_remote_file_operations(show_message=True): return super().cmd_refresh_tree() def perform_rename(self, old_name, new_name): # TODO: raise NotImplementedError() class DialogRemoteFileBrowser(BaseRemoteFileBrowser): def __init__(self, master, dialog): super().__init__(master, show_expand_buttons=False) self.dialog = dialog self.tree["show"] = ("tree", "headings") self.tree.configure(displaycolumns=(5,)) self.tree.configure(height=10) def open_file(self, path): self.dialog.double_click_file(path) def should_open_name_in_thonny(self, name): # In dialog, all file types are to be opened in Thonny return True class BackendFileDialog(CommonDialog): def __init__(self, master, kind, initial_dir): super().__init__(master=master) self.result = None self.updating_selection = False self.kind = kind if kind == "open": self.title(tr("Open from %s") % get_runner().get_node_label()) else: assert kind == "save" self.title(tr("Save to %s") % get_runner().get_node_label()) background = ttk.Frame(self) background.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.browser = DialogRemoteFileBrowser(background, self) self.browser.grid( row=0, column=0, columnspan=4, sticky="nsew", pady=self.get_large_padding(), padx=self.get_large_padding(), ) self.browser.configure(borderwidth=1, relief="groove") self.browser.tree.configure(selectmode="browse") self.name_label = ttk.Label(background, text=tr("File name:")) self.name_label.grid( row=1, column=0, pady=(0, self.get_large_padding()), padx=self.get_large_padding(), sticky="w", ) self.name_var = create_string_var("") self.name_entry = ttk.Entry( background, textvariable=self.name_var, state="normal" if kind == "save" else "disabled" ) self.name_entry.grid( row=1, column=1, pady=(0, self.get_large_padding()), padx=(0, self.get_large_padding()), sticky="we", ) self.name_entry.bind("", self.on_name_edit, True) self.ok_button = ttk.Button(background, text=tr("OK"), command=self.on_ok) self.ok_button.grid( row=1, column=2, pady=(0, self.get_large_padding()), padx=(0, self.get_large_padding()), sticky="e", ) self.cancel_button = ttk.Button(background, text=tr("Cancel"), command=self.on_cancel) self.cancel_button.grid( row=1, column=3, pady=(0, self.get_large_padding()), padx=(0, self.get_large_padding()), sticky="e", ) background.rowconfigure(0, weight=1) background.columnconfigure(1, weight=1) self.bind("", self.on_cancel, True) self.bind("", self.on_ok, True) self.protocol("WM_DELETE_WINDOW", self.on_cancel) self.tree_select_handler_id = self.browser.tree.bind( "<>", self.on_tree_select, True ) self.browser.request_focus_into(initial_dir) self.name_entry.focus_set() def on_ok(self, event=None): tree = self.browser.tree name = self.name_var.get() if not name: messagebox.showerror(tr("Error"), tr("You need to select a file!"), master=self) return for node_id in tree.get_children(""): if name and name == tree.set(node_id, "name"): break else: node_id = None if node_id is not None: node_kind = tree.set(node_id, "kind") if node_kind != "file": messagebox.showerror(tr("Error"), tr("You need to select a file!"), master=self) return elif self.kind == "save": if not messagebox.askyesno( tr("Overwrite?"), tr("Do you want to overwrite '%s' ?") % name, master=self ): return parent_path = tree.set("", "path") if parent_path == "" or parent_path.endswith("/"): self.result = parent_path + name else: self.result = parent_path + "/" + name self.destroy() def on_cancel(self, event=None): self.result = None self.destroy() def on_tree_select(self, event=None): if self.updating_selection: return if self.browser.get_selected_kind() == "file": name = self.browser.get_selected_name() if name: self.name_var.set(name) def on_name_edit(self, event=None): self.updating_selection = True tree = self.browser.tree if self.tree_select_handler_id: tree.unbind("<>", self.tree_select_handler_id) self.tree_select_handler_id = None name = self.name_var.get() for node_id in tree.get_children(""): if name == tree.set(node_id, "name"): tree.selection_add(node_id) else: tree.selection_remove(node_id) self.updating_selection = False self.tree_select_handler_id = tree.bind("<>", self.on_tree_select, True) def double_click_file(self, path): assert path.endswith(self.name_var.get()) self.on_ok() def set_initial_focus(self, node=None) -> bool: self.name_entry.focus_set() return True class NodeChoiceDialog(CommonDialog): def __init__(self, master, prompt): super().__init__(master=master) self.result = None self.title(prompt) background = ttk.Frame(self) background.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) local_caption = get_local_files_root_text() remote_caption = get_runner().get_node_label() button_width = max(len(local_caption), len(remote_caption)) + 10 self.local_button = ttk.Button( background, text=" \n" + local_caption + "\n ", width=button_width, command=self.on_local, ) self.local_button.grid(row=0, column=0, pady=20, padx=20) self.remote_button = ttk.Button( background, text=" \n" + remote_caption + "\n ", width=button_width, command=self.on_remote, ) self.remote_button.grid(row=1, column=0, pady=(0, 20), padx=20) self.local_button.focus_set() self.bind("", self.on_cancel, True) self.bind("", self.on_return, True) self.bind("", self.on_down, True) self.bind("", self.on_up, True) self.protocol("WM_DELETE_WINDOW", self.on_cancel) def on_local(self, event=None): self.result = "local" self.destroy() def on_remote(self, event=None): self.result = "remote" self.destroy() def on_return(self, event=None): if self.focus_get() == self.local_button: self.on_local(event) elif self.focus_get() == self.remote_button: self.on_remote(event) def on_down(self, event=None): if self.focus_get() == self.local_button: self.remote_button.focus_set() def on_up(self, event=None): if self.focus_get() == self.remote_button: self.local_button.focus_set() def on_cancel(self, event=None): self.result = None self.destroy() def ask_backend_path(master, dialog_kind): proxy = get_runner().get_backend_proxy() if not proxy: return None assert proxy.supports_remote_files() dlg = BackendFileDialog(master, dialog_kind, proxy.get_cwd()) show_dialog(dlg, master) return dlg.result def choose_node_for_file_operations(master, prompt): if get_runner().supports_remote_files(): dlg = NodeChoiceDialog(master, prompt) show_dialog(dlg, master) if dlg.result == "remote" and not get_runner().ready_for_remote_file_operations( show_message=True ): return None return dlg.result else: return "local" def get_local_files_root_text(): global _LOCAL_FILES_ROOT_TEXT if not _LOCAL_FILES_ROOT_TEXT: # translation can't be done in module load time _LOCAL_FILES_ROOT_TEXT = tr("This computer") return _LOCAL_FILES_ROOT_TEXT def open_with_default_app(path): if running_on_windows(): os.startfile(path) elif running_on_mac_os(): subprocess.run(["open", path]) else: subprocess.run(["xdg-open", path]) def get_file_handler_conf_key(extension): return "file_default_handlers.%s" % extension def show_hidden_files(): return get_workbench().get_option(HIDDEN_FILES_OPTION) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/codeview.py0000664000175000017500000005252714276461532016372 0ustar00annamaaannamaa# -*- coding: utf-8 -*- import codecs import io import os import re import sys import time import tkinter as tk from logging import getLogger from tkinter import messagebox from typing import Dict, Union # @UnusedImport from thonny import get_workbench, roughparse, tktextext, ui_utils from thonny.common import TextRange from thonny.tktextext import EnhancedText from thonny.ui_utils import EnhancedTextWithLogging, ask_string, scrollbar_style _syntax_options = {} # type: Dict[str, Union[str, int]] # BREAKPOINT_SYMBOL = "•" # Bullet # BREAKPOINT_SYMBOL = "○" # White circle BREAKPOINT_SYMBOL = "●" # Black circle OLD_MAC_LINEBREAK = re.compile("\r(?!\n)") UNIX_LINEBREAK = re.compile("(?", self._start_toggle_breakpoint, True) self._gutter.bind("", self._consider_toggle_breakpoint, True) # self.text.tag_configure("breakpoint_line", background="pink") self._gutter.tag_configure("breakpoint", foreground="crimson") editor_font = tk.font.nametofont("EditorFont") spacer_font = editor_font.copy() spacer_font.configure(size=editor_font.cget("size") // 4) self._gutter.tag_configure("spacer", font=spacer_font) self._gutter.tag_configure("active", font="BoldEditorFont") self._gutter.tag_raise("spacer") def get_content(self): return self.text.get("1.0", "end-1c") # -1c because Text always adds a newline itself def detect_encoding(self, data): enc = self.detect_encoding_without_check(data) try: codecs.lookup(enc) return enc except LookupError: messagebox.showerror( "Error", "Unknown encoding '%s'. Using utf-8 instead" % enc, master=self ) return "utf-8" def detect_encoding_without_check(self, data): if self.text.is_python_text(): import tokenize encoding, _ = tokenize.detect_encoding(io.BytesIO(data).readline) return encoding else: ENCODING_MARKER = re.compile( rb"(charset|coding)[\t ]*[=: ][\t ]*[\"\']?([a-z][0-9a-z-_ ]*[0-9a-z])[\"\'\n\r\t ]?", re.IGNORECASE, ) for line in data[:1024].splitlines(): match = ENCODING_MARKER.search(line) if match and len(match.group(2)) > 2: return match.group(2).decode("ascii", errors="replace") return "UTF-8" def set_file_type(self, file_type): self.text.set_file_type(file_type) def get_content_as_bytes(self): content = self.get_content() for callback in get_workbench().iter_save_hooks(): content = callback(self, content=content) # convert all linebreaks to original format content = OLD_MAC_LINEBREAK.sub(self._original_newlines, content) content = WINDOWS_LINEBREAK.sub(self._original_newlines, content) content = UNIX_LINEBREAK.sub(self._original_newlines, content) return content.encode(self.detect_encoding(content.encode("ascii", errors="replace"))) def set_content_as_bytes(self, data, keep_undo=False): encoding = self.detect_encoding(data) logger.debug("Detected encoding %s", encoding) while True: try: chars = data.decode(encoding) if self.looks_like_text(chars): self.set_content(chars, keep_undo) return True except UnicodeDecodeError: pass encoding = ask_string( "Bad encoding", "Could not read as %s text.\nYou could try another encoding" % encoding, initial_value=encoding, options=get_proposed_encodings(), master=self.winfo_toplevel(), ) if not encoding: return False def looks_like_text(self, chars): if not chars: return True non_text_char_count = 0 for ch in chars: if ch in NON_TEXT_CHARS: non_text_char_count += 1 return non_text_char_count / len(chars) < 0.01 def set_content(self, content, keep_undo=False): content, self._original_newlines = tweak_newlines(content) for callback in get_workbench().iter_load_hooks(): content = callback(self, content=content) self.text.direct_delete("1.0", tk.END) self.text.direct_insert("1.0", content) if not keep_undo: self.text.edit_reset() def _start_toggle_breakpoint(self, event): self._start_toggle_breakpoint_index = "@%d,%d" % (event.x, event.y) def _consider_toggle_breakpoint(self, event): if time.time() - self._last_toggle_breakpoint_time < 0.3: # it was probably a double-click. Don't want to double-toggle in this case. return index = "@%d,%d" % (event.x, event.y) if index != self._start_toggle_breakpoint_index: # it was probably a drag return start_index = index + " linestart" end_index = index + " lineend" if self.text.tag_nextrange("breakpoint_line", start_index, end_index): self.text.tag_remove("breakpoint_line", start_index, end_index) else: line_content = self.text.get(start_index, end_index).strip() if line_content and line_content[0] != "#": self.text.tag_add("breakpoint_line", start_index, end_index) self.update_gutter(clean=True) self._last_toggle_breakpoint_time = time.time() def _clean_selection(self): self.text.tag_remove("sel", "1.0", "end") self._gutter.tag_remove("sel", "1.0", "end") def _text_changed(self, event): self.update_gutter( clean=self.text._last_event_changed_line_count and self.text.tag_ranges("breakpoint_line") ) def compute_gutter_line(self, lineno, plain=False): if plain: yield str(lineno) + " ", () else: visual_line_number = self._first_line_number + lineno - 1 linestart = str(visual_line_number) + ".0" yield str(lineno), () if self.text.tag_nextrange("breakpoint_line", linestart, linestart + " lineend"): yield BREAKPOINT_SYMBOL, ("breakpoint",) else: yield " ", () def select_range(self, text_range): self.text.tag_remove("sel", "1.0", tk.END) if text_range: if isinstance(text_range, int): # it's line number start = str(text_range - self._first_line_number + 1) + ".0" end = str(text_range - self._first_line_number + 1) + ".end" elif isinstance(text_range, TextRange): start = "%s.%s" % ( text_range.lineno - self._first_line_number + 1, text_range.col_offset, ) end = "%s.%s" % ( text_range.end_lineno - self._first_line_number + 1, text_range.end_col_offset, ) else: assert isinstance(text_range, tuple) start, end = text_range self.text.tag_add("sel", start, end) if isinstance(text_range, int): self.text.mark_set("insert", end) self.text.see("%s -1 lines" % start) def get_breakpoint_line_numbers(self): result = set() for num_line in self._gutter.get("1.0", "end").splitlines(): if BREAKPOINT_SYMBOL in num_line: result.add(int(num_line.replace(BREAKPOINT_SYMBOL, ""))) return result def get_selected_range(self): if self.text.has_selection(): lineno, col_offset = map(int, self.text.index(tk.SEL_FIRST).split(".")) end_lineno, end_col_offset = map(int, self.text.index(tk.SEL_LAST).split(".")) else: lineno, col_offset = map(int, self.text.index(tk.INSERT).split(".")) end_lineno, end_col_offset = lineno, col_offset return TextRange(lineno, col_offset, end_lineno, end_col_offset) def destroy(self): super().destroy() get_workbench().unbind("SyntaxThemeChanged", self._reload_theme_options) def _reload_gutter_theme_options(self, event=None): # super()._reload_gutter_theme_options(event) if "GUTTER" in _syntax_options: opts = _syntax_options["GUTTER"].copy() if "background" in opts and "selectbackground" not in opts: opts["selectbackground"] = opts["background"] opts["inactiveselectbackground"] = opts["background"] if "foreground" in opts and "selectforeground" not in opts: opts["selectforeground"] = opts["foreground"] self._gutter.configure(opts) if "background" in opts: background = opts["background"] self._margin_line.configure(background=background) self._gutter.tag_configure("sel", background=background) if "breakpoint" in _syntax_options: self._gutter.tag_configure("breakpoint", _syntax_options["breakpoint"]) def set_syntax_options(syntax_options): global _syntax_options _syntax_options = syntax_options get_workbench().event_generate("SyntaxThemeChanged") def get_syntax_options_for_tag(tag, **base_options): global _syntax_options if tag in _syntax_options: base_options.update(_syntax_options[tag]) return base_options def tweak_newlines(content): cr_count = len(OLD_MAC_LINEBREAK.findall(content)) lf_count = len(UNIX_LINEBREAK.findall(content)) crlf_count = len(WINDOWS_LINEBREAK.findall(content)) if cr_count > 0 and lf_count == 0 and crlf_count == 0: original_newlines = "\r" elif crlf_count > 0 and lf_count == 0 and cr_count == 0: original_newlines = "\r\n" elif lf_count > 0 and crlf_count == 0 and cr_count == 0: original_newlines = "\n" else: original_newlines = os.linesep content = OLD_MAC_LINEBREAK.sub("\n", content) content = WINDOWS_LINEBREAK.sub("\n", content) return content, original_newlines def perform_python_return(text: EnhancedText, event): # copied from idlelib.EditorWindow (Python 3.4.2) # slightly modified # pylint: disable=lost-exception assert text is event.widget assert isinstance(text, EnhancedText) try: # delete selection first, last = text.get_selection_indices() if first and last: text.delete(first, last) text.mark_set("insert", first) # Strip whitespace after insert point # (ie. don't carry whitespace from the right of the cursor over to the new line) while text.get("insert") in [" ", "\t"]: text.delete("insert") left_part = text.get("insert linestart", "insert") # locate first non-white character i = 0 n = len(left_part) while i < n and left_part[i] in " \t": i = i + 1 # is it only whitespace? if i == n: # start the new line with the same whitespace text.insert("insert", "\n" + left_part) return "break" # Turned out the left part contains visible chars # Remember the indent indent = left_part[:i] # Strip whitespace before insert point # (ie. after inserting the linebreak this line doesn't have trailing whitespace) while text.get("insert-1c", "insert") in [" ", "\t"]: text.delete("insert-1c", "insert") # start new line text.insert("insert", "\n") # adjust indentation for continuations and block # open/close first need to find the last stmt lno = tktextext.index2line(text.index("insert")) y = roughparse.RoughParser(text.indent_width, text.tabwidth) for context in roughparse.NUM_CONTEXT_LINES: startat = max(lno - context, 1) startatindex = repr(startat) + ".0" rawtext = text.get(startatindex, "insert") y.set_str(rawtext) bod = y.find_good_parse_start( False, roughparse._build_char_in_string_func(startatindex) ) if bod is not None or startat == 1: break y.set_lo(bod or 0) c = y.get_continuation_type() if c != roughparse.C_NONE: # The current stmt hasn't ended yet. if c == roughparse.C_STRING_FIRST_LINE: # after the first line of a string; do not indent at all pass elif c == roughparse.C_STRING_NEXT_LINES: # inside a string which started before this line; # just mimic the current indent text.insert("insert", indent) elif c == roughparse.C_BRACKET: # line up with the first (if any) element of the # last open bracket structure; else indent one # level beyond the indent of the line with the # last open bracket text._reindent_to(y.compute_bracket_indent()) elif c == roughparse.C_BACKSLASH: # if more than one line in this stmt already, just # mimic the current indent; else if initial line # has a start on an assignment stmt, indent to # beyond leftmost =; else to beyond first chunk of # non-whitespace on initial line if y.get_num_lines_in_stmt() > 1: text.insert("insert", indent) else: text._reindent_to(y.compute_backslash_indent()) else: assert 0, "bogus continuation type %r" % (c,) return "break" # This line starts a brand new stmt; indent relative to # indentation of initial line of closest preceding # interesting stmt. indent = y.get_base_indent_string() text.insert("insert", indent) if y.is_block_opener(): text.perform_smart_tab(event) elif indent and y.is_block_closer(): text.perform_smart_backspace(event) return "break" finally: text.see("insert") text.event_generate("<>") return "break" def perform_simple_return(text: EnhancedText, event): assert text is event.widget assert isinstance(text, EnhancedText) text._log_keypress_for_undo(event) try: # delete selection first, last = text.get_selection_indices() if first and last: text.delete(first, last) text.mark_set("insert", first) # Strip whitespace after insert point # (ie. don't carry whitespace from the right of the cursor over to the new line) while text.get("insert") in [" ", "\t"]: text.delete("insert") left_part = text.get("insert linestart", "insert") # locate first non-white character i = 0 n = len(left_part) while i < n and left_part[i] in " \t": i = i + 1 # start the new line with the same whitespace text.insert("insert", "\n" + left_part[:i]) return "break" finally: text.see("insert") text.event_generate("<>") return "break" class BinaryFileException(RuntimeError): pass def get_proposed_encodings(): # https://w3techs.com/technologies/overview/character_encoding result = [ "UTF-8", "ISO-8859-1", "Windows-1251", "Windows-1252", "GB2312", "Shift JIS", "GBK", "EUC-KR", "ISO-8859-9", "Windows-1254", "EUC-JP", "Big5", "ISO-8859-2 ", "Windows-1250", "Windows-874", "Windows-1256", "ISO-8859-15", "US-ASCII", "Windows-1255", "TIS-620", "ISO-8859-7", "Windows-1253", "UTF-16", "KOI8-R", "GB18030", "Windows-1257", "KS C 5601", "UTF-7", "ISO-8859-8", "Windows-31J", "ISO-8859-5", "ISO-8859-6", "ISO-8859-4", "ANSI_X3.110-1983", "ISO-8859-3", "KOI8-U", "Big5 HKSCS", "ISO-2022-JP", "Windows-1258", "ISO-8859-13", "ISO-8859-14", "Windows-949", "ISO-8859-10", "ISO-8859-11", "ISO-8859-16", ] sys_enc = sys.getdefaultencoding() for item in result[:]: if item.lower() == sys_enc.lower(): result.remove(item) sys_enc = item result.insert(0, sys_enc) return result ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662833745.0 thonny-4.0.1/thonny/common.py0000664000175000017500000005554414307152121016041 0ustar00annamaaannamaa# -*- coding: utf-8 -*- """ Classes used both by front-end and back-end """ import os.path import site import sys from collections import namedtuple from dataclasses import dataclass from logging import getLogger from typing import Any, Callable, Dict, List, Optional, Tuple # @UnusedImport logger = getLogger(__name__) STRING_PSEUDO_FILENAME = "" REPL_PSEUDO_FILENAME = "" MESSAGE_MARKER = "\x02" OBJECT_LINK_START = "[object_link_for_thonny=%d]" OBJECT_LINK_END = "[/object_link_for_thonny]" IGNORED_FILES_AND_DIRS = [ "System Volume Information", "._.Trashes", ".Trashes", "__MACOSX", ".DS_Store", ] ValueInfo = namedtuple("ValueInfo", ["id", "repr"]) FrameInfo = namedtuple( "FrameInfo", [ "id", "filename", "module_name", "code_name", "source", "lineno", "firstlineno", "in_library", "locals", "globals", "freevars", "event", "focus", "node_tags", "current_statement", "current_root_expression", "current_evaluations", ], ) TextRange = namedtuple("TextRange", ["lineno", "col_offset", "end_lineno", "end_col_offset"]) @dataclass(frozen=True) class DistInfo: key: str project_name: str version: str location: str class Record: def __init__(self, **kw): self.__dict__.update(kw) def update(self, e, **kw): self.__dict__.update(e, **kw) def setdefault(self, **kw): "updates those fields that are not yet present (similar to dict.setdefault)" for key in kw: if not hasattr(self, key): setattr(self, key, kw[key]) def get(self, key, default=None): return self.__dict__.get(key, default) def __getitem__(self, key): return self.__dict__[key] def __delitem__(self, key): self.__dict__.__delitem__(key) def __setitem__(self, key, value): self.__dict__[key] = value def __contains__(self, key): return key in self.__dict__ def __repr__(self): keys = self.__dict__.keys() items = ("{}={}".format(k, repr(self.__dict__[k])) for k in keys) return "{}({})".format(self.__class__.__name__, ", ".join(items)) def __str__(self): keys = sorted(self.__dict__.keys()) items = ("{}={}".format(k, repr(self.__dict__[k])) for k in keys) return "{}({})".format(self.__class__.__name__, ", ".join(items)) def __eq__(self, other): # pylint: disable=unidiomatic-typecheck if type(self) != type(other): return False if len(self.__dict__) != len(other.__dict__): return False for key in self.__dict__: if not hasattr(other, key): return False self_value = getattr(self, key) other_value = getattr(other, key) if type(self_value) != type(other_value) or self_value != other_value: return False return True def __ne__(self, other): return not self.__eq__(other) def __hash__(self): return hash(repr(self)) def range_contains_smaller(one: TextRange, other: TextRange) -> bool: this_start = (one.lineno, one.col_offset) this_end = (one.end_lineno, one.end_col_offset) other_start = (other.lineno, other.col_offset) other_end = (other.end_lineno, other.end_col_offset) return ( this_start < other_start and this_end > other_end or this_start == other_start and this_end > other_end or this_start < other_start and this_end == other_end ) def range_contains_smaller_or_equal(one: TextRange, other: TextRange) -> bool: return range_contains_smaller(one, other) or one == other class InputSubmission(Record): """For sending data to backend's stdin""" def __init__(self, data: str, **kw) -> None: super().__init__(**kw) self.data = data class CommandToBackend(Record): """Command meant for the back-end""" def __init__(self, name: str, **kw) -> None: super().__init__(**kw) self.name = name class ImmediateCommand(CommandToBackend): pass class EOFCommand(CommandToBackend): def __init__(self, **kw) -> None: if "name" in kw: del kw["name"] super().__init__("eof", **kw) class ToplevelCommand(CommandToBackend): def __init__(self, name: str, argv: List[str] = [], **kw) -> None: super().__init__(name, **kw) self.argv = argv class DebuggerCommand(CommandToBackend): pass class InlineCommand(CommandToBackend): """ Can be used both during debugging and in waiting_toplevel_command state (eg. for sending variable and heap info requests) """ pass class MessageFromBackend(Record): def __init__(self, **kw) -> None: self.event_type = type(self).__name__ # allow event_type to be overridden by kw super().__init__(**kw) if not hasattr(self, "sequence"): self.sequence = self.event_type class ToplevelResponse(MessageFromBackend): pass class DebuggerResponse(MessageFromBackend): pass class BackendEvent(MessageFromBackend): def __init__(self, event_type: str, **kw) -> None: super().__init__(**kw) self.event_type = event_type class OscEvent(BackendEvent): def __init__(self, text: str): self.text = text super().__init__("OscEvent") def __repr__(self): return f"OscEvent({self.text!r})" class InlineResponse(MessageFromBackend): def __init__(self, command_name: str, **kw) -> None: super().__init__(**kw) self.command_name = command_name self.event_type = self.command_name + "_response" def serialize_message(msg: Record, max_line_length=65536) -> str: # I want to transfer only ASCII chars because encodings are not reliable # (eg. can't find a way to specify PYTHONIOENCODING for cx_freeze'd program) # The possibility for splitting message into several lines is required because of # default (safe) window size in Paramiko (https://github.com/thonny/thonny/issues/1680) msg_str = ascii(msg) lines = [] for i in range(0, len(msg_str), max_line_length): lines.append(msg_str[i : i + max_line_length]) return MESSAGE_MARKER + str(len(lines)) + " " + "\n".join(lines) def parse_message(msg_string: str) -> Record: # DataFrames may have nan # pylint: disable=unused-variable nan = float("nan") # @UnusedVariable assert msg_string[0] == MESSAGE_MARKER assert msg_string.strip().endswith(")") msg_start = msg_string.index(" ") line_count = int(msg_string[1:msg_start]) assert line_count == msg_string.strip().count("\n") + 1 return eval(msg_string[msg_start:].replace("\n", "")) def normpath_with_actual_case(name: str) -> str: """In Windows return the path with the case it is stored in the filesystem""" if not os.path.exists(name): return os.path.normpath(name) if os.name == "nt": try: # https://stackoverflow.com/questions/2113822/python-getting-filename-case-as-stored-in-windows/2114975 norm_name = os.path.normpath(name) from ctypes import create_unicode_buffer, windll buf = create_unicode_buffer(512) # GetLongPathNameW alone doesn't fix filename part windll.kernel32.GetShortPathNameW(norm_name, buf, 512) # @UndefinedVariable windll.kernel32.GetLongPathNameW(buf.value, buf, 512) # @UndefinedVariable result = buf.value if result.casefold() != norm_name.casefold(): # Sometimes GetShortPathNameW + GetLongPathNameW doesn't work # see eg. https://github.com/thonny/thonny/issues/925 windll.kernel32.GetLongPathNameW(norm_name, buf, 512) # @UndefinedVariable result = buf.value if result.casefold() != norm_name.casefold(): result = norm_name if result[1] == ":": # ensure drive letter is capital return result[0].upper() + result[1:] else: return result except Exception: logger.warning( "Could not compute normpath_with_actual_case for %r", name, exc_info=True ) return os.path.normpath(name) else: # easy on Linux # too difficult on mac # https://stackoverflow.com/questions/14515073/in-python-on-osx-with-hfs-how-can-i-get-the-correct-case-of-an-existing-filenam # Hopefully only correct case comes into Thonny (eg. via open dialog) return os.path.normpath(name) def is_same_path(name1: str, name2: str) -> bool: return os.path.normpath(os.path.normcase(name1)) == os.path.normpath(os.path.normcase(name2)) def path_startswith(child_name: str, dir_name: str) -> bool: normchild = os.path.normpath(os.path.normcase(child_name)) normdir = os.path.normpath(os.path.normcase(dir_name)) return normdir == normchild or normchild.startswith(normdir.rstrip(os.path.sep) + os.path.sep) def read_source(filename): import tokenize with tokenize.open(filename) as fp: return fp.read() def get_exe_dirs(): result = [] if site.ENABLE_USER_SITE: if sys.platform == "win32": if site.getusersitepackages(): result.append(site.getusersitepackages().replace("site-packages", "Scripts")) else: if site.getuserbase(): result.append(site.getuserbase() + "/bin") main_scripts = os.path.join(sys.prefix, "Scripts") if os.path.isdir(main_scripts) and main_scripts not in result: result.append(main_scripts) if os.path.dirname(sys.executable) not in result: result.append(os.path.dirname(sys.executable)) # These entries are used by Anaconda for part in [ "Library/mingw-w64/bin", "Library/usr/bin", "Library/bin", "Scripts", "bin", "condabin", ]: dirpath = os.path.join(sys.prefix, part.replace("/", os.sep)) if os.path.isdir(dirpath) and dirpath not in result: result.append(dirpath) if sys.platform != "win32" and "/usr/local/bin" not in result: # May be missing on macOS, when started as bundle # (yes, more may be missing, but this one is most useful) result.append("/usr/local/bin") return result def get_site_dir(symbolic_name, executable=None): if not executable or executable == sys.executable: result = getattr(site, symbolic_name, "") else: import subprocess result = ( subprocess.check_output( [executable, "-m", "site", "--" + symbolic_name.lower().replace("_", "-")], universal_newlines=True, ) .decode() .strip() ) return result if result else None def get_base_executable(): if sys.exec_prefix == sys.base_exec_prefix: return sys.executable if sys.platform == "win32": guess = sys.base_exec_prefix + "\\" + os.path.basename(sys.executable) if os.path.isfile(guess): return normpath_with_actual_case(guess) if os.path.islink(sys.executable): return os.path.realpath(sys.executable) raise RuntimeError("Don't know how to locate base executable") def get_augmented_system_path(extra_dirs): path_items = os.environ.get("PATH", "").split(os.pathsep) for d in reversed(extra_dirs): if d not in path_items: path_items.insert(0, d) return os.pathsep.join(path_items) def update_system_path(env, value): # in Windows, env keys are not case sensitive # this is important if env is a dict (not os.environ) if sys.platform == "win32": found = False for key in env: if key.upper() == "PATH": found = True env[key] = value if not found: env["PATH"] = value else: env["PATH"] = value @dataclass class SignatureParameter: kind: str name: str annotation: Optional[str] default: Optional[str] @dataclass class SignatureInfo: name: str params: List[SignatureParameter] return_type: Optional[str] current_param_index: Optional[int] = None call_bracket_start: Optional[Tuple[int, int]] = None @dataclass class CompletionInfo: name: str name_with_symbols: str full_name: str type: str prefix_length: int # the number of chars to be deleted before inserting name signatures: Optional[List[SignatureInfo]] docstring: Optional[str] @dataclass class NameReference: module_name: str module_path: str row: int column: int length: int class UserError(RuntimeError): """Errors of this class are meant to be presented without stacktrace""" pass def is_hidden_or_system_file(path: str) -> bool: if os.path.basename(path).startswith("."): return True elif sys.platform == "win32": from ctypes import windll FILE_ATTRIBUTE_HIDDEN = 0x2 FILE_ATTRIBUTE_SYSTEM = 0x4 return bool( windll.kernel32.GetFileAttributesW(path) # @UndefinedVariable & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM) ) else: return False def get_dirs_children_info( paths: List[str], include_hidden: bool = False ) -> Dict[str, Optional[Dict[str, Dict]]]: return {path: get_single_dir_child_data(path, include_hidden) for path in paths} def get_single_dir_child_data(path: str, include_hidden: bool = False) -> Optional[Dict[str, Dict]]: if path == "": if sys.platform == "win32": return {**get_windows_volumes_info(), **get_windows_network_locations()} else: return get_single_dir_child_data("/", include_hidden) elif os.path.isdir(path) or os.path.ismount(path): result = {} try: for child in os.listdir(path): full_child_path = os.path.join(path, child) if not os.path.exists(full_child_path): # must be broken link continue full_child_path = normpath_with_actual_case(full_child_path) hidden = is_hidden_or_system_file(full_child_path) if not hidden or include_hidden: name = os.path.basename(full_child_path) st = os.stat(full_child_path, dir_fd=None, follow_symlinks=True) result[name] = { "size": None if os.path.isdir(full_child_path) else st.st_size, "modified": st.st_mtime, "hidden": hidden, } except PermissionError: result[""] = { "kind": "error", "size": -1, "modified": None, "hidden": None, } return result else: return None def get_windows_volumes_info(): # http://stackoverflow.com/a/2288225/261181 # http://msdn.microsoft.com/en-us/library/windows/desktop/aa364939%28v=vs.85%29.aspx import string from ctypes import windll all_drive_types = [ "DRIVE_UNKNOWN", "DRIVE_NO_ROOT_DIR", "DRIVE_REMOVABLE", "DRIVE_FIXED", "DRIVE_REMOTE", "DRIVE_CDROM", "DRIVE_RAMDISK", ] required_drive_types = ["DRIVE_REMOVABLE", "DRIVE_FIXED", "DRIVE_REMOTE", "DRIVE_RAMDISK"] result = {} bitmask = windll.kernel32.GetLogicalDrives() # @UndefinedVariable for letter in string.ascii_uppercase: if not bitmask & 1: pass else: drive_type = all_drive_types[ windll.kernel32.GetDriveTypeW("%s:\\" % letter) ] # @UndefinedVariable # NB! Drive A can be present in bitmask but actually missing. # In this case querying information about it would freeze the UI # for several seconds. # One solution is to uninstall the device in device manager, # but OS may restore the drive later. # Therefore it is safest to skip A drive (user can access it via Open dialog) if drive_type in required_drive_types and ( letter != "A" or drive_type != "DRIVE_REMOVABLE" ): drive = letter + ":" path = drive + "\\" try: st = os.stat(path) volume_name = get_windows_volume_name(path) if not volume_name: volume_name = "Disk" label = volume_name + " (" + drive + ")" result[path] = { "label": label, "size": None, "modified": max(st.st_mtime, st.st_ctime), } except OSError as e: logger.warning("Could not get information for %s", path, exc_info=e) bitmask >>= 1 return result def get_windows_volume_name(path): # https://stackoverflow.com/a/12056414/261181 import ctypes kernel32 = ctypes.windll.kernel32 volume_name_buffer = ctypes.create_unicode_buffer(1024) file_system_name_buffer = ctypes.create_unicode_buffer(1024) serial_number = None max_component_length = None file_system_flags = None result = kernel32.GetVolumeInformationW( ctypes.c_wchar_p(path), volume_name_buffer, ctypes.sizeof(volume_name_buffer), serial_number, max_component_length, file_system_flags, file_system_name_buffer, ctypes.sizeof(file_system_name_buffer), ) if result: return volume_name_buffer.value else: return None def get_windows_network_locations(): import ctypes.wintypes CSIDL_NETHOOD = 0x13 SHGFP_TYPE_CURRENT = 0 buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) ctypes.windll.shell32.SHGetFolderPathW(0, CSIDL_NETHOOD, 0, SHGFP_TYPE_CURRENT, buf) shortcuts_dir = buf.value if not buf.value: logger.warning("Could not determine windows shortcuts directory") return {} result = {} for entry in os.scandir(shortcuts_dir): # full_path = normpath_with_actual_case(entry.path) lnk_path = os.path.join(entry.path, "target.lnk") if os.path.exists(lnk_path): try: target = get_windows_lnk_target(lnk_path) result[target] = { "label": entry.name + " (" + target + ")", "size": None, "modified": None, } except Exception: logger.error("Can't get target from %s", lnk_path, exc_info=True) return result def get_windows_lnk_target(lnk_file_path): import subprocess import thonny script_path = os.path.join(os.path.dirname(thonny.__file__), "res", "PrintLnkTarget.vbs") cmd = ["cscript", "/NoLogo", script_path, lnk_file_path] result = subprocess.check_output(cmd, universal_newlines=True, timeout=3) return result.strip() def execute_system_command(cmd, cwd=None, disconnect_stdin=False): import subprocess logger.debug("execute_system_command, cmd=%r, cwd=%s", cmd, cwd) env = dict(os.environ).copy() encoding = "utf-8" env["PYTHONIOENCODING"] = encoding # Make sure this python interpreter and its scripts are available # in PATH update_system_path(env, get_augmented_system_path(get_exe_dirs())) popen_kw = dict( env=env, universal_newlines=True, bufsize=0, ) if cwd and os.path.isdir(cwd): popen_kw["cwd"] = cwd if disconnect_stdin: popen_kw["stdin"] = subprocess.DEVNULL if sys.version_info >= (3, 6): popen_kw["errors"] = "replace" popen_kw["encoding"] = encoding if isinstance(cmd.cmd_line, str) and cmd.cmd_line.startswith("!"): cmd_line = cmd.cmd_line[1:] popen_kw["shell"] = True else: assert isinstance(cmd.cmd_line, list) cmd_line = cmd.cmd_line logger.debug("Popen(%r, ...)", cmd_line) proc = subprocess.Popen(cmd_line, **popen_kw) proc.communicate() return proc.wait() def universal_dirname(path: str) -> str: if "/" in path: sep = "/" elif "\\" in path: sep = "\\" else: # micro:bit return "" path = path.rstrip(sep) result = path[: path.rindex(sep)] if not result: return sep else: return result def universal_relpath(path: str, context: str) -> str: """Tries to give relative path""" if "/" in path: import pathlib p = pathlib.PurePosixPath(path) try: return str(p.relative_to(context)) except ValueError: return path else: return os.path.relpath(path, context) def get_python_version_string(version_info: Optional[Tuple] = None, maxsize=None): result = ".".join(map(str, sys.version_info[:3])) if sys.version_info[3] != "final": result += "-" + sys.version_info[3] if maxsize is not None: result += " (" + ("64" if sys.maxsize > 2**32 else "32") + " bit)" return result def execute_with_frontend_sys_path(function: Callable) -> Any: import ast try: frontend_sys_path = ast.literal_eval(os.environ["THONNY_FRONTEND_SYS_PATH"]) assert isinstance(frontend_sys_path, list) logger.info("Using THONNY_FRONTEND_SYS_PATH %s", frontend_sys_path) except Exception as e: logger.debug("Could not get THONNY_FRONTEND_SYS_PATH", exc_info=e) frontend_sys_path = [] extra_items = [item for item in frontend_sys_path if item not in sys.path] sys.path = sys.path + extra_items try: return function() finally: for item in extra_items: if item in sys.path: sys.path.remove(item) def try_load_modules_with_frontend_sys_path(module_names): def load(): from importlib import import_module for name in module_names: try: import_module(name) except ImportError: pass execute_with_frontend_sys_path(load) def read_one_incoming_message_str(line_reader): msg_str = line_reader() if msg_str == "": return "" if not msg_str.startswith(MESSAGE_MARKER): return msg_str line_count = int(msg_str[1:].split(maxsplit=1)[0]) read_lines = 1 while read_lines < line_count: msg_str += line_reader() read_lines += 1 return msg_str def is_virtual_executable(executable): exe_dir = os.path.dirname(executable) return os.path.exists(os.path.join(exe_dir, "activate")) or os.path.exists( os.path.join(exe_dir, "activate.bat") ) def is_private_python(executable): result = os.path.exists(os.path.join(os.path.dirname(executable), "thonny_python.ini")) logger.debug("is_private_python(%r) == %r", executable, result) return result ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662833745.0 thonny-4.0.1/thonny/config.py0000664000175000017500000001442714307152121016011 0ustar00annamaaannamaa# -*- coding: utf-8 -*- import ast import configparser import datetime import os.path import sys import tkinter as tk from configparser import ConfigParser from logging import exception, getLogger from thonny import THONNY_USER_DIR logger = getLogger(__name__) _manager_cache = {} def try_load_configuration(filename): if filename in _manager_cache: return _manager_cache[filename] try: # use cache so Workbench doesn't create duplicate manager # when FirstRunWindow already created one mgr = ConfigurationManager(filename) except configparser.Error as e: new_path = filename + ".corrupt" os.replace(filename, new_path) mgr = ConfigurationManager(filename, error_reading_existing_file=e) _manager_cache[filename] = mgr return mgr class ConfigurationManager: def __init__(self, filename, error_reading_existing_file=None): self._ini = ConfigParser(interpolation=None) self.error_reading_existing_file = error_reading_existing_file self._filename = filename self._defaults = {} self._defaults_overrides_str = {} self._variables = {} # Tk variables if os.path.exists(self._filename): with open(self._filename, "r", encoding="UTF-8") as fp: self._ini.read_file(fp) if not self.get_option("general.configuration_creation_timestamp"): self.set_option( "general.configuration_creation_timestamp", datetime.datetime.now().isoformat() ) # print(prefs_filename, self.sections()) self._init_default_overrides() def _init_default_overrides(self): overrides_path = os.path.join(os.path.dirname(__file__), "defaults.ini") if not os.path.isfile(overrides_path): return defparser = configparser.ConfigParser() defparser.read(overrides_path, "utf-8") for section in defparser.sections(): for key in defparser[section]: # leave parsing until base default value is known self._defaults_overrides_str[section + "." + key] = defparser[section][key] def get_option(self, name, secondary_default=None): section, option = self._parse_name(name) name = section + "." + option # variable may have more recent value if name in self._variables: return self._variables[name].get() try: val = self._ini.get(section, option) # if option's data type is str (inferred from the default value) # then don't try to parse anything (unless it's None) if val == "None": return None elif isinstance(self._defaults.get(name), str): return val else: return self._parse_value(val) except Exception: if name in self._defaults: return self._defaults[name] else: return secondary_default def has_option(self, name): return name in self._defaults def set_option(self, name, value): section, option = self._parse_name(name) name = section + "." + option if not self._ini.has_section(section): self._ini.add_section(section) if isinstance(value, str): self._ini.set(section, option, value) else: self._ini.set(section, option, repr(value)) # update variable if name in self._variables: self._variables[name].set(value) def set_default(self, name, primary_default_value): # normalize name section, option = self._parse_name(name) name = section + "." + option self._defaults[name] = primary_default_value if name in self._defaults_overrides_str: if isinstance(primary_default_value, str): value = self._defaults_overrides_str[name] else: value = self._parse_value(self._defaults_overrides_str[name]) else: value = primary_default_value self._defaults[name] = value def get_variable(self, name: str) -> tk.Variable: section, option = self._parse_name(name) name = section + "." + option if name in self._variables: return self._variables[name] else: value = self.get_option(name) if isinstance(value, bool): var = tk.BooleanVar(value=value) # type: tk.Variable elif isinstance(value, int): var = tk.IntVar(value=value) elif isinstance(value, str): var = tk.StringVar(value=value) elif isinstance(value, float): var = tk.StringVar(value=value) else: raise KeyError( "Can't create Tk Variable for " + name + ". Type is " + str(type(value)) ) self._variables[name] = var return var def save(self): # save all tk variables for name in self._variables: self.set_option(name, self._variables[name].get()) # store if not os.path.exists(self._filename): os.makedirs(os.path.dirname(self._filename), mode=0o700, exist_ok=True) # Normal saving occasionally creates corrupted file: # https://bitbucket.org/plas/thonny/issues/167/configuration-file-occasionally-gets # Now I'm saving the configuration to a temp file # and if the save is successful, I replace configuration file with it temp_filename = self._filename + ".temp" with open(temp_filename, "w", encoding="UTF-8") as fp: self._ini.write(fp) try: ConfigurationManager(temp_filename) # temp file was created successfully os.chmod(temp_filename, 0o600) os.replace(temp_filename, self._filename) os.chmod(self._filename, 0o600) except Exception: exception("Could not save configuration file. Reverting to previous file.") def _parse_name(self, name): if "." in name: return name.split(".", 1) else: return "general", name def _parse_value(self, value): try: return ast.literal_eval(value) except Exception: return value ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/config_ui.py0000664000175000017500000001310414276461532016513 0ustar00annamaaannamaaimport tkinter as tk from logging import getLogger from tkinter import ttk from typing import Optional from thonny import get_workbench, ui_utils from thonny.languages import tr from thonny.ui_utils import CommonDialog logger = getLogger(__name__) class ConfigurationDialog(CommonDialog): last_shown_tab_index = 0 def __init__(self, master, page_records_with_order): super().__init__(master) self.title(tr("Thonny options")) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.backend_restart_required = False self.gui_restart_required = False main_frame = ttk.Frame(self) # otherwise there is wrong color background with clam main_frame.grid(row=0, column=0, sticky=tk.NSEW) main_frame.columnconfigure(0, weight=1) main_frame.rowconfigure(0, weight=1) self._notebook = ttk.Notebook(main_frame) self._notebook.grid( row=0, column=0, columnspan=3, sticky=tk.NSEW, padx=self.get_medium_padding(), pady=(self.get_medium_padding(), 0), ) self._ok_button = ttk.Button(main_frame, text=tr("OK"), command=self._ok, default="active") self._cancel_button = ttk.Button(main_frame, text=tr("Cancel"), command=self._cancel) self._ok_button.grid( row=1, column=1, padx=(0, self.get_medium_padding()), pady=(self.get_medium_padding(), self.get_medium_padding()), ) self._cancel_button.grid( row=1, column=2, padx=(0, self.get_medium_padding()), pady=(self.get_medium_padding(), self.get_medium_padding()), ) self._page_records = [] for key, title, page_class, _ in sorted( page_records_with_order, key=lambda r: (r[3], r[0]) ): try: spacer = ttk.Frame(self) spacer.rowconfigure(0, weight=1) spacer.columnconfigure(0, weight=1) page = page_class(spacer) page.key = key page.dialog = self self._page_records.append((key, title, page)) page.grid(sticky=tk.NSEW, pady=(15, 10), padx=15) self._notebook.add(spacer, text=title) except Exception as e: logger.exception("Could not create configuration page %s", key, exc_info=e) self.bind("", self._ok, True) self.bind("", self._cancel, True) self._notebook.select(self._notebook.tabs()[ConfigurationDialog.last_shown_tab_index]) def select_page(self, key): for i, tab in enumerate(self._notebook.tabs()): if self._page_records[i][0] == key: self._notebook.select(tab) def _ok(self, event=None): for _, title, page in self._page_records: try: if page.apply() is False: return except Exception: get_workbench().report_exception("Error when applying options in " + title) self.destroy() def _cancel(self, event=None): for _, title, page in self._page_records: try: page.cancel() except Exception: get_workbench().report_exception("Error when cancelling options in " + title) self.destroy() def destroy(self): ConfigurationDialog.last_shown_tab_index = self._notebook.index(self._notebook.select()) super().destroy() class ConfigurationPage(ttk.Frame): """This is an example dummy implementation of a configuration page. It's not required that configuration pages inherit from this class (can be any widget), but the class must have constructor with single parameter for getting the master.""" def __init__(self, master): ttk.Frame.__init__(self, master) self.dialog = None # type: Optional[ConfigurationDialog] def add_checkbox( self, flag_name, description, row=None, column=0, padx=0, pady=0, columnspan=1, tooltip=None ): variable = get_workbench().get_variable(flag_name) checkbox = ttk.Checkbutton(self, text=description, variable=variable) checkbox.grid( row=row, column=column, sticky=tk.W, padx=padx, pady=pady, columnspan=columnspan ) if tooltip is not None: ui_utils.create_tooltip(checkbox, tooltip) def add_combobox( self, variable, values, row=None, column=0, padx=0, pady=0, columnspan=1, width=None ): if isinstance(variable, str): variable = get_workbench().get_variable(variable) combobox = ttk.Combobox( self, exportselection=False, textvariable=variable, state="readonly", height=15, width=width, values=values, ) combobox.grid( row=row, column=column, sticky=tk.W, pady=pady, padx=padx, columnspan=columnspan ) return variable def add_entry(self, option_name, row=None, column=0, pady=0, padx=0, columnspan=1, **kw): variable = get_workbench().get_variable(option_name) entry = ttk.Entry(self, textvariable=variable, **kw) entry.grid(row=row, column=column, sticky=tk.W, pady=pady, columnspan=columnspan, padx=padx) def apply(self): """Apply method should return False, when page contains invalid input and configuration dialog should not be closed.""" pass def cancel(self): """Called when dialog gets cancelled""" pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/defaults.ini0000664000175000017500000000051714276461532016513 0ustar00annamaaannamaa; This file can be used by 3rd party packagers for specifying custom default values for options. ; Use the same sections and keys as configuration.ini ; Priorities of the values specified in different locations: ; 1. explicit values in configuration.ini ; 2. overridden defaults in this file ; 3. base defaults given in Thonny's code ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660757841.0 thonny-4.0.1/thonny/editor_helpers.py0000664000175000017500000003070614277223521017563 0ustar00annamaaannamaaimport tkinter as tk import traceback from logging import getLogger from typing import List, Optional, Tuple from thonny import get_workbench from thonny.codeview import CodeViewText, SyntaxText, get_syntax_options_for_tag from thonny.common import SignatureInfo, SignatureParameter from thonny.editors import Editor from thonny.misc_utils import running_on_mac_os from thonny.shell import ShellText from thonny.tktextext import TextFrame from thonny.ui_utils import get_tk_version_info all_boxes = [] a_box_is_appearing = False logger = getLogger(__name__) class EditorInfoBox(tk.Toplevel): def __init__(self): super().__init__(master=get_workbench()) self._has_shown_on_screen: bool = False all_boxes.append(self) self._target_text_widget: Optional[SyntaxText] = None get_workbench().bind("", self._workbench_focus_out, True) # If the box has received focus, then it may lose it by a messagebox # or mouse click on the main window self.bind("", self._workbench_focus_out, True) get_workbench().bind("", self.hide, True) self.bind("", self.hide, True) get_workbench().bind_class("EditorCodeViewText", "<1>", self.hide, True) get_workbench().bind_class("ShellText", "<1>", self.hide, True) get_workbench().bind("SyntaxThemeChanged", self._update_theme, True) def _set_window_attributes(self): if running_on_mac_os(): try: # Must be the first thing to do after creating window # https://wiki.tcl-lang.org/page/MacWindowStyle self.tk.call( "::tk::unsupported::MacWindowStyle", "style", self._w, "help", "noActivates" ) if get_tk_version_info() >= (8, 6, 10) and running_on_mac_os(): self.wm_overrideredirect(1) except tk.TclError: pass else: self.wm_overrideredirect(1) self.wm_transient(get_workbench()) # From IDLE # TODO: self.update_idletasks() # Need for tk8.6.8 on macOS: #40128. self.lift() def _update_theme(self, event=None): pass def _check_bind_for_keypress(self, text: tk.Text): tag_prefix = "pb_" + type(self).__name__.replace(".", "_") if getattr(text, tag_prefix, False): return False # Need to know about certain keypresses while the completer is active # Other plugins (eg. auto indenter) may eat up returns, therefore I need to # raise the priority of this binding tag = tag_prefix + "_" + str(text.winfo_id()) text.bindtags((tag,) + text.bindtags()) text.bind_class(tag, "", self._on_text_keypress, True) setattr(text, tag_prefix, True) def _on_text_keypress(self, event=None): pass def _workbench_focus_out(self, event=None) -> None: if not self.is_visible(): return # if a_box_is_appearing: # making a box appear may mess up FocusOut events # return # Need to close when another app or a Thonny's dialog appears # (othewise the box will float above this, at least in Linux). # Don't do anything if another EditorInfoBox appears for box in all_boxes: try: # need to try because asking for focus via wrong window may give exception if box.focus_get(): # it's alright return except: pass self.hide() def _get_related_box(self) -> Optional["EditorInfoBox"]: return None def _show_on_target_text( self, index: str, expected_box_height: int, preferred_position: str, y_offset: int = 0, ) -> None: text = self._target_text_widget bbox = text.bbox(index) if not bbox: logger.warning("Could not compute bbox") return text_box_x, text_box_y, _, text_box_height = bbox cursor_root_x = text.winfo_rootx() + text_box_x cursor_root_y = text.winfo_rooty() + text_box_y if ( preferred_position == "below" and cursor_root_y + text_box_height + expected_box_height > text.winfo_screenheight() ): position = "above" else: position = preferred_position if position == "above": # negative value signifies pixels between window bottom and screen bottom y = cursor_root_y - text.winfo_screenheight() else: y = cursor_root_y + text_box_height # TODO reduce x if the box wouldn't fit by width x = cursor_root_x self._show_on_screen(x, y + y_offset) def _show_on_screen(self, x: int, y: int) -> None: global a_box_is_appearing if a_box_is_appearing: logger.debug("Box already appearing, skipping _show_on_screen") return try: a_box_is_appearing = True if y < 0: self.geometry("+%d-%d" % (x, -y)) else: self.geometry("+%d+%d" % (x, y)) if not self.winfo_ismapped(): self._set_window_attributes() self._check_update_size() self.deiconify() if not self._has_shown_on_screen: self.tweak_first_appearance() else: self._check_update_size() finally: a_box_is_appearing = False self._has_shown_on_screen = True def _check_update_size(self) -> None: if hasattr(self, "_update_size"): # It looks it's not worth trying to move the window away from the viewport # for calculations. At least in Ubuntu it doesn't give any advantages and # may produce glitches # self.geometry("+10000+5000") # move away from visible screen # self.withdraw() self.update() # gives proper data for size calculations self._update_size() self.update() # applies updated size def hide(self, event: Optional[tk.Event] = None) -> None: if self.winfo_ismapped(): self.withdraw() related_box = self._get_related_box() if related_box and related_box.is_visible(): related_box.hide(event) # Following looks like a good idea, but in at least in Ubuntu, it would fix # entry cursor to the given text and it can't be moved to another text anymore # if self._target_text_widget: # self._target_text_widget.focus_set() # in case the user has clicked on the box def is_visible(self) -> bool: return self.winfo_ismapped() def tweak_first_appearance(self): pass class DocuBoxBase(EditorInfoBox): def __init__(self, show_vertical_scrollbar: bool): super().__init__() self.text_frame = TextFrame( master=self, horizontal_scrollbar=False, vertical_scrollbar=show_vertical_scrollbar, read_only=True, height=7, width=40, font="TkDefaultFont", wrap="word", ) self.text_frame.grid() self.text = self.text_frame.text self._update_theme() def _update_theme(self, event=None): super()._update_theme(event) comment_opts = get_syntax_options_for_tag("comment") gutter_opts = get_syntax_options_for_tag("GUTTER") text_opts = get_syntax_options_for_tag("TEXT") self.text["background"] = gutter_opts["background"] self.text["foreground"] = text_opts["foreground"] self.text.tag_configure("prose", font="TkDefaultFont") self.text.tag_configure("active", font="BoldTkDefaultFont") self.text.tag_configure("annotation", **comment_opts) self.text.tag_configure("default", **comment_opts) self.text.tag_configure("marker", **comment_opts) def _append_chars(self, chars, tags=()): self.text.direct_insert("end", chars, tags=tuple(tags)) def render_signatures(self, signatures: List[SignatureInfo], only_params=False) -> None: for i, sig in enumerate(signatures): if i > 0: self._append_chars("\n") self.render_signature(sig, only_params) def render_signature(self, sig: SignatureInfo, only_params) -> None: if not only_params: self._append_chars(sig.name) self._append_chars("(") is_positional = False is_kw_only = False for i, param in enumerate(sig.params): if i > 0: self._append_chars(", ") if len(sig.params) > 20: self._append_chars("\n ") is_positional |= param.kind == "POSITIONAL_ONLY" if is_positional and param.kind != "POSITIONAL_ONLY": self._append_chars("/, ", ["marker"]) is_positional = False if param.kind == "VAR_POSITIONAL": is_kw_only = True elif param.kind == "KEYWORD_ONLY" and not is_kw_only: self._append_chars("*, ", ["marker"]) is_kw_only = True is_active_parameter = sig.current_param_index == i self.render_parameter(param, is_active_parameter) if is_positional: self._append_chars(", /", ["marker"]) self._append_chars(")") if sig.return_type and not only_params: self._append_chars(" -> ", ["marker"]) self._append_chars(sig.return_type, ["annotation"]) def render_parameter(self, param: SignatureParameter, active: bool) -> None: if active: base_tags = ["active"] else: base_tags = [] if param.kind == "VAR_POSITIONAL": self._append_chars("*", base_tags) elif param.kind == "VAR_KEYWORD": self._append_chars("**", base_tags) self._append_chars(param.name, base_tags) if param.annotation: self._append_chars(":\u00A0" + param.annotation, base_tags + ["annotation"]) if param.default: self._append_chars("=" + param.default, base_tags + ["default"]) def format_signature(self, s: str) -> str: s = s.replace(": ", ":\u00A0") if len(s) > self.text["width"] * 1.8 and s.count("(") and s.count(")"): args_index = s.index("(") + 1 suffix_index = s.rindex(")") prefix = s[:args_index] args = s[args_index:suffix_index].split(", ") suffix = s[suffix_index:] s = prefix + "\n " + ",\n ".join(args) + "\n" + suffix # don't keep / and * alone on a line s = ( s.replace("\n /,", " /,") .replace("\n *,", " *,") .replace("\n /\n)", " /\n)") .replace("\n *\n)", " *\n)") ) return s else: return s class DocuBox(DocuBoxBase): def __init__(self): super().__init__(show_vertical_scrollbar=True) def set_content(self, name, item_type, signatures, docstring): self.text.direct_delete("1.0", "end") # self._append_chars(item_type + "\n") if signatures: self.render_signatures(signatures) if signatures and docstring: self._append_chars("\n\n") if docstring: self._append_chars(docstring, ["prose"]) def get_active_text_widget() -> Optional[SyntaxText]: widget = get_workbench().focus_get() if isinstance(widget, (CodeViewText, ShellText)): return widget return None def get_cursor_position(text: SyntaxText) -> Tuple[int, int]: parts = text.index("insert").split(".") return int(parts[0]), int(parts[1]) def get_text_filename(text: SyntaxText) -> Optional[str]: if isinstance(text, ShellText): return "" elif isinstance(text, CodeViewText): editor = getattr(text.master, "home_widget") if isinstance(editor, Editor): return editor.get_filename() return None def get_relevant_source_and_cursor_position(text: SyntaxText) -> Tuple[str, int, int]: if isinstance(text, ShellText): source = text.get("input_start", "insert") lines = source.splitlines() if not lines: return source, 1, 0 else: return source, len(lines), len(lines[-1]) else: row, col = get_cursor_position(text) return text.get("1.0", "end-1c"), row, col ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662717807.0 thonny-4.0.1/thonny/editors.py0000664000175000017500000012336114306607557016234 0ustar00annamaaannamaa# -*- coding: utf-8 -*- import os.path import re import sys import tkinter as tk import traceback from logging import exception, getLogger from tkinter import messagebox, simpledialog, ttk from typing import Optional from _tkinter import TclError from thonny import get_runner, get_workbench, ui_utils from thonny.base_file_browser import ask_backend_path, choose_node_for_file_operations from thonny.codeview import BinaryFileException, CodeView, CodeViewText from thonny.common import ( InlineCommand, TextRange, ToplevelResponse, is_same_path, normpath_with_actual_case, universal_dirname, ) from thonny.languages import tr from thonny.misc_utils import running_on_mac_os, running_on_windows from thonny.tktextext import rebind_control_a from thonny.ui_utils import ( askopenfilename, asksaveasfilename, get_beam_cursor, select_sequence, windows_known_extensions_are_hidden, ) PYTHON_FILES_STR = tr("Python files") _dialog_filetypes = [(PYTHON_FILES_STR, ".py .pyw .pyi"), (tr("all files"), ".*")] REMOTE_PATH_MARKER = " :: " PYTHON_EXTENSIONS = {"py", "pyw", "pyi"} PYTHONLIKE_EXTENSIONS = set() logger = getLogger(__name__) class EditorCodeViewText(CodeViewText): """Allows separate class binding for CodeViewTexts which are inside editors""" def __init__(self, master=None, cnf={}, **kw): super().__init__( master=master, cnf=cnf, **kw, ) self.bindtags(self.bindtags() + ("EditorCodeViewText",)) class Editor(ttk.Frame): def __init__(self, master): ttk.Frame.__init__(self, master) assert isinstance(master, EditorNotebook) self.notebook = master # type: EditorNotebook # parent of codeview will be workbench so that it can be maximized self._code_view = CodeView( get_workbench(), propose_remove_line_numbers=True, font="EditorFont", text_class=EditorCodeViewText, cursor=get_beam_cursor(), ) get_workbench().event_generate( "EditorTextCreated", editor=self, text_widget=self.get_text_widget() ) self._code_view.grid(row=0, column=0, sticky=tk.NSEW, in_=self) self._code_view.home_widget = self # don't forget home self.maximizable_widget = self._code_view self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self._filename = None self._last_known_mtime = None self._code_view.text.bind("<>", self._on_text_modified, True) self._code_view.text.bind("<>", self._on_text_change, True) self._code_view.text.bind("", self._control_tab, True) get_workbench().bind("DebuggerResponse", self._listen_debugger_progress, True) get_workbench().bind("ToplevelResponse", self._listen_for_toplevel_response, True) self.update_appearance() def get_text_widget(self): return self._code_view.text def get_code_view(self): # TODO: try to get rid of this return self._code_view def get_content(self) -> str: return self._code_view.get_content() def set_filename(self, path): self._filename = path def get_filename(self, try_hard=False): if self._filename is None and try_hard: self.save_file() return self._filename def get_identifier(self): if self._filename: return self._filename else: return str(self.winfo_id()) def get_title(self): if self.get_filename() is None: result = tr("") elif is_remote_path(self.get_filename()): path = extract_target_path(self.get_filename()) name = path.split("/")[-1] result = "[ " + name + " ]" else: result = os.path.basename(self.get_filename()) if self.is_modified(): result += " *" return result def check_for_external_changes(self): if self._filename is None: return if is_remote_path(self._filename): return if self._last_known_mtime is None: return elif not os.path.exists(self._filename): self.master.select(self) if messagebox.askyesno( tr("File is gone"), tr("Looks like '%s' was deleted or moved.") % self._filename + "\n\n" + tr("Do you want to also close the editor?"), master=self, ): self.master.close_editor(self) else: self.get_text_widget().edit_modified(True) self._last_known_mtime = None elif os.path.getmtime(self._filename) != self._last_known_mtime: skip_confirmation = not self.is_modified() and get_workbench().get_option( "edit.auto_refresh_saved_files" ) if not skip_confirmation: self.master.select(self) if skip_confirmation or messagebox.askyesno( tr("External modification"), tr("Looks like '%s' was modified outside of the editor.") % self._filename + "\n\n" + tr( "Do you want to discard current editor content and reload the file from disk?" ), master=self, ): prev_location = self.get_text_widget().index("insert") self._load_file(self._filename, keep_undo=True) try: self.get_text_widget().mark_set("insert", prev_location) self.see_line(int(prev_location.split(".")[0])) except Exception: logger.exception("Could not restore previous location") self._last_known_mtime = os.path.getmtime(self._filename) def get_long_description(self): if self._filename is None: result = tr("") else: result = self._filename try: index = self._code_view.text.index("insert") if index and "." in index: line, col = index.split(".") result += " @ {} : {}".format(line, int(col) + 1) except Exception: exception("Finding cursor location") return result def _load_file(self, filename, keep_undo=False): try: if is_remote_path(filename): result = self._load_remote_file(filename) else: result = self._load_local_file(filename, keep_undo) if not result: return False except BinaryFileException: messagebox.showerror( "Problem", "%s doesn't look like a text file" % filename, master=self ) return False except SyntaxError as e: assert "encoding" in str(e).lower() messagebox.showerror( "Problem loading file", "This file seems to have problems with encoding.\n\n" + "Make sure it is in UTF-8 or contains proper encoding hint.", master=self, ) return False self.update_appearance() return True def _load_local_file(self, filename, keep_undo=False): with open(filename, "rb") as fp: source = fp.read() # Make sure Windows filenames have proper format filename = normpath_with_actual_case(filename) self._filename = filename self.update_file_type() self._last_known_mtime = os.path.getmtime(self._filename) get_workbench().event_generate("Open", editor=self, filename=filename) if not self._code_view.set_content_as_bytes(source, keep_undo): return False self.get_text_widget().edit_modified(False) self._code_view.focus_set() self.master.remember_recent_file(filename) return True def _load_remote_file(self, filename): self._filename = filename self.update_file_type() self._code_view.set_content("") self._code_view.text.set_read_only(True) target_filename = extract_target_path(self._filename) self.update_title() response = get_runner().send_command_and_wait( InlineCommand( "read_file", path=target_filename, description=tr("Loading %s") % target_filename ), dialog_title=tr("Loading"), ) if response.get("error"): # TODO: make it softer raise RuntimeError(response["error"]) content = response["content_bytes"] self._code_view.text.set_read_only(False) if not self._code_view.set_content_as_bytes(content): return False self.get_text_widget().edit_modified(False) self.update_title() return True def is_modified(self): return bool(self._code_view.text.edit_modified()) def save_file_enabled(self): return self.is_modified() or not self.get_filename() def save_file(self, ask_filename=False, save_copy=False, node=None) -> Optional[str]: if self._filename is not None and not ask_filename: save_filename = self._filename get_workbench().event_generate("Save", editor=self, filename=save_filename) else: save_filename = self.ask_new_path(node) if not save_filename: return None if self.notebook.get_editor(save_filename) is not None: messagebox.showerror( "File is open", "This file is already open in Thonny.\n\n" "If you want to save with this name,\n" "close the existing editor first!", master=get_workbench(), ) return None get_workbench().event_generate( "SaveAs", editor=self, filename=save_filename, save_copy=save_copy ) content_bytes = self._code_view.get_content_as_bytes() if is_remote_path(save_filename): result = self.write_remote_file(save_filename, content_bytes, save_copy) else: result = self.write_local_file(save_filename, content_bytes, save_copy) if not result: return None if not save_copy: self._filename = save_filename self.update_file_type() self.update_title() return save_filename def write_local_file(self, save_filename, content_bytes, save_copy): process_shebang = content_bytes.startswith(b"#!/") and get_workbench().get_option( "file.make_saved_shebang_scripts_executable" ) if process_shebang: content_bytes = content_bytes.replace(b"\r\n", b"\n") try: f = open(save_filename, mode="wb") f.write(content_bytes) f.flush() # Force writes on disk, see https://learn.adafruit.com/adafruit-circuit-playground-express/creating-and-editing-code#1-use-an-editor-that-writes-out-the-file-completely-when-you-save-it os.fsync(f) f.close() if process_shebang: os.chmod(save_filename, 0o755) if not save_copy or save_filename == self._filename: self._last_known_mtime = os.path.getmtime(save_filename) get_workbench().event_generate( "LocalFileOperation", path=save_filename, operation="save" ) except PermissionError: messagebox.showerror( "Permission Error", "Looks like this file or folder is not writable.", master=self ) return False if not save_copy or save_filename == self._filename: self.master.remember_recent_file(save_filename) if not save_copy or save_filename == self._filename: self._code_view.text.edit_modified(False) return True def update_file_type(self): if self._filename is None: self._code_view.set_file_type(None) else: ext = self._filename.split(".")[-1].lower() if ext in PYTHON_EXTENSIONS: file_type = "python" elif ext in PYTHONLIKE_EXTENSIONS: file_type = "pythonlike" else: file_type = None self._code_view.set_file_type(file_type) self.update_appearance() def write_remote_file(self, save_filename, content_bytes, save_copy): if get_runner().ready_for_remote_file_operations(show_message=True): target_filename = extract_target_path(save_filename) result = get_runner().send_command_and_wait( InlineCommand( "write_file", path=target_filename, content_bytes=content_bytes, editor_id=id(self), blocking=True, description=tr("Saving to %s") % target_filename, make_shebang_scripts_executable=get_workbench().get_option( "file.make_saved_shebang_scripts_executable" ), ), dialog_title=tr("Saving"), ) if "error" in result: messagebox.showerror(tr("Could not save"), str(result["error"])) return False if not save_copy: self._code_view.text.edit_modified(False) self.update_title() # NB! edit_modified is not falsed yet! get_workbench().event_generate( "RemoteFileOperation", path=target_filename, operation="save" ) get_workbench().event_generate("RemoteFilesChanged") return True else: messagebox.showerror(tr("Could not save"), "Back-end is not ready") return False def ask_new_path(self, node=None): if node is None: node = choose_node_for_file_operations(self.winfo_toplevel(), "Where to save to?") if not node: return None if node == "local": return self.ask_new_local_path() else: assert node == "remote" return self.ask_new_remote_path() def ask_new_remote_path(self): target_path = ask_backend_path(self.winfo_toplevel(), "save") if target_path: target_path = self._check_add_py_extension(target_path) return make_remote_path(target_path) else: return None def ask_new_local_path(self): if self._filename is None: initialdir = get_workbench().get_local_cwd() initialfile = None else: initialdir = os.path.dirname(self._filename) initialfile = os.path.basename(self._filename) # https://tcl.tk/man/tcl8.6/TkCmd/getOpenFile.htm type_var = tk.StringVar(value="") new_filename = asksaveasfilename( filetypes=_dialog_filetypes, defaultextension=None, initialdir=initialdir, initialfile=initialfile, parent=get_workbench(), typevariable=type_var, ) logger.info("Save dialog returned %r with typevariable %r", new_filename, type_var.get()) # Different tkinter versions may return different values if new_filename in ["", (), None]: return None if running_on_windows(): # may have /-s instead of \-s and wrong case new_filename = os.path.join( normpath_with_actual_case(os.path.dirname(new_filename)), os.path.basename(new_filename), ) if type_var.get() == PYTHON_FILES_STR or type_var.get() == "": new_filename = self._check_add_py_extension( new_filename, without_asking=type_var.get() == PYTHON_FILES_STR ) if new_filename.endswith(".py"): base = os.path.basename(new_filename) mod_name = base[:-3].lower() if running_on_windows(): mod_name = mod_name.lower() if mod_name in [ "math", "turtle", "random", "statistics", "pygame", "matplotlib", "numpy", ]: # More proper name analysis will be performed by ProgramNamingAnalyzer if not tk.messagebox.askyesno( "Potential problem", "If you name your script '%s', " % base + "you won't be able to import the library module named '%s'" % mod_name + ".\n\n" + "Do you still want to use this name for your script?", master=self, ): return self.ask_new_local_path() return new_filename def show(self): self.master.select(self) def update_appearance(self): self._code_view.set_gutter_visibility( get_workbench().get_option("view.show_line_numbers") or get_workbench().in_simple_mode() ) self._code_view.set_line_length_margin( get_workbench().get_option("view.recommended_line_length") ) self._code_view.text.update_tabs() self._code_view.text.event_generate("<>") self._code_view.grid_main_widgets() def _listen_debugger_progress(self, event): # Go read-only # TODO: check whether this module is active? self._code_view.text.set_read_only(True) def _listen_for_toplevel_response(self, event: ToplevelResponse) -> None: self._code_view.text.set_read_only(False) def _control_tab(self, event): if event.state & 1: # shift was pressed direction = -1 else: direction = 1 self.master.select_next_prev_editor(direction) return "break" def _shift_control_tab(self, event): self.master.select_next_prev_editor(-1) return "break" def select_range(self, text_range): self._code_view.select_range(text_range) def select_line(self, lineno, col_offset=None): self._code_view.select_range(TextRange(lineno, 0, lineno + 1, 0)) self.see_line(lineno) if col_offset is None: col_offset = 0 self.get_text_widget().mark_set("insert", "%d.%d" % (lineno, col_offset)) def see_line(self, lineno): # first see an earlier line in order to push target line downwards self._code_view.text.see("%d.0" % max(lineno - 4, 1)) self._code_view.text.see("%d.0" % lineno) def focus_set(self): self._code_view.focus_set() def is_focused(self): return self.focus_displayof() == self._code_view.text def _on_text_modified(self, event): self.update_title() def update_title(self): try: self.master.update_editor_title(self) except Exception as e: logger.exception("Could not update editor title", exc_info=e) def _on_text_change(self, event): self.update_title() def destroy(self): get_workbench().unbind("DebuggerResponse", self._listen_debugger_progress) get_workbench().unbind("ToplevelResponse", self._listen_for_toplevel_response) ttk.Frame.destroy(self) get_workbench().event_generate( "EditorTextDestroyed", editor=self, text_widget=self.get_text_widget() ) def _check_add_py_extension(self, path: str, without_asking: bool = False) -> str: assert path parts = re.split(r"[/\\]", path) name = parts[-1] if "." not in name: if without_asking or messagebox.askyesno( title=tr("Confirmation"), message=tr("Python files usually have .py extension.") + "\n\n" + tr("Did you mean '%s'?" % (name + ".py")), parent=self.winfo_toplevel(), ): return path + ".py" else: return path return path class EditorNotebook(ui_utils.ClosableNotebook): """ Manages opened files / modules """ def __init__(self, master): super().__init__(master, padding=0) get_workbench().set_default("file.reopen_all_files", False) get_workbench().set_default("file.open_files", []) get_workbench().set_default("file.current_file", None) get_workbench().set_default("file.recent_files", []) get_workbench().set_default("view.highlight_current_line", False) get_workbench().set_default("view.show_line_numbers", True) get_workbench().set_default("view.recommended_line_length", 0) get_workbench().set_default("edit.indent_with_tabs", False) get_workbench().set_default("edit.auto_refresh_saved_files", True) get_workbench().set_default("file.make_saved_shebang_scripts_executable", True) self._recent_menu = tk.Menu( get_workbench().get_menu("file"), postcommand=self._update_recent_menu ) self._init_commands() self.enable_traversal() # open files from last session """ TODO: they should go only to recent files for filename in prefs["open_files"].split(";"): if os.path.exists(filename): self._open_file(filename) """ # should be in the end, so that it can be detected when # constructor hasn't completed yet self.preferred_size_in_pw = None self._checking_external_changes = False get_workbench().bind("WindowFocusIn", self.check_for_external_changes, True) get_workbench().bind("ToplevelResponse", self.check_for_external_changes, True) self.bind("<>", self.on_tab_changed, True) def on_tab_changed(self, *args): if sys.platform == "darwin": # Since Tk 8.6.11, after closing an editor, the previous editor re-appeared with # widgets disappeared, at least on Aivar's machine. child = self.get_current_child() if child: assert isinstance(child, Editor) child.get_code_view().grid_main_widgets() def _init_commands(self): # TODO: do these commands have to be in EditorNotebook ?? # Create a module level function install_editor_notebook ?? # Maybe add them separately, when notebook has been installed ?? get_workbench().add_command( "new_file", "file", tr("New"), self._cmd_new_file, caption=tr("New"), default_sequence=select_sequence("", ""), extra_sequences=[""], group=10, image="new-file", include_in_toolbar=True, ) get_workbench().add_command( "open_file", "file", tr("Open..."), self._cmd_open_file, caption=tr("Load"), default_sequence=select_sequence("", ""), extra_sequences=[""], group=10, image="open-file", include_in_toolbar=True, ) get_workbench().add_command( "recents", "file", tr("Recent files"), group=10, submenu=self._recent_menu ) # http://stackoverflow.com/questions/22907200/remap-default-keybinding-in-tkinter get_workbench().bind_class("Text", "", self._control_o) get_workbench().bind_class("Text", "", self._control_o) rebind_control_a(get_workbench()) get_workbench().add_command( "close_file", "file", tr("Close"), self._cmd_close_file, default_sequence=select_sequence("", ""), extra_sequences=[""], tester=lambda: self.get_current_editor() is not None, group=10, ) get_workbench().add_command( "close_files", "file", tr("Close all"), self.close_tabs, tester=lambda: self.get_current_editor() is not None, default_sequence=select_sequence("", ""), group=10, ) get_workbench().add_command( "save_file", "file", tr("Save"), self._cmd_save_file, caption=tr("Save"), default_sequence=select_sequence("", ""), extra_sequences=[""], tester=self._cmd_save_file_enabled, group=10, image="save-file", include_in_toolbar=True, ) get_workbench().add_command( "save_all_files", "file", tr("Save All files"), self._cmd_save_all_files, caption=tr("Save All files"), default_sequence=select_sequence("", ""), tester=self._cmd_save_all_files_enabled, group=10, ) get_workbench().add_command( "save_file_as", "file", tr("Save as..."), self._cmd_save_file_as, default_sequence=select_sequence("", ""), extra_sequences=[""], tester=lambda: self.get_current_editor() is not None, group=10, ) get_workbench().add_command( "save_copy", "file", tr("Save copy..."), self._cmd_save_copy, tester=lambda: self.get_current_editor() is not None, group=10, ) get_workbench().add_command( "move_rename_file", "file", tr("Move / rename..."), self._cmd_move_rename_file, tester=self._cmd_move_rename_file_enabled, group=10, ) get_workbench().add_command( "goto_source_line", "edit", tr("Go to line..."), self._cmd_goto_source_line, default_sequence=select_sequence("", ""), # tester=, # no global switch, or cross plugin switch? # todo use same as find and replace -> plugins/find_replace.py group=60, ) get_workbench().createcommand("::tk::mac::OpenDocument", self._mac_open_document) def load_startup_files(self): """If no filename was sent from command line then load previous files (if setting allows)""" cmd_line_filenames = [ os.path.abspath(name) for name in sys.argv[1:] if os.path.exists(name) ] if len(cmd_line_filenames) > 0: filenames = cmd_line_filenames elif get_workbench().get_option("file.reopen_all_files"): filenames = get_workbench().get_option("file.open_files") elif get_workbench().get_option("file.current_file"): filenames = [get_workbench().get_option("file.current_file")] else: filenames = [] if len(filenames) > 0: for filename in filenames: if os.path.exists(filename): self.show_file(filename) cur_file = get_workbench().get_option("file.current_file") # choose correct active file if len(cmd_line_filenames) > 0: self.show_file(cmd_line_filenames[0]) elif cur_file and os.path.exists(cur_file): self.show_file(cur_file) else: self._cmd_new_file() else: self._cmd_new_file() def save_all_named_editors(self): all_saved = True for editor in self.winfo_children(): if editor.get_filename() and editor.is_modified(): success = editor.save_file() all_saved = all_saved and success return all_saved def remember_recent_file(self, filename): recents = get_workbench().get_option("file.recent_files") if filename in recents: recents.remove(filename) recents.insert(0, filename) relevant_recents = [name for name in recents if os.path.exists(name)][:15] get_workbench().set_option("file.recent_files", relevant_recents) self._update_recent_menu() def _update_recent_menu(self): recents = get_workbench().get_option("file.recent_files") relevant_recents = [ path for path in recents if os.path.exists(path) and not self.file_is_opened(path) ] self._recent_menu.delete(0, "end") for path in relevant_recents: def load(path=path): self.show_file(path) self._recent_menu.insert_command("end", label=path, command=load) def remember_open_files(self): if ( self.get_current_editor() is not None and self.get_current_editor().get_filename() is not None ): current_file = self.get_current_editor().get_filename() else: current_file = None get_workbench().set_option("file.current_file", current_file) open_files = [ editor.get_filename() for editor in self.winfo_children() if editor.get_filename() ] get_workbench().set_option("file.open_files", open_files) def _cmd_new_file(self): self.open_new_file() def open_new_file(self, path=None, remote=False): new_editor = Editor(self) get_workbench().event_generate("NewFile", editor=new_editor) if path: if remote: new_editor.set_filename(make_remote_path(path)) else: new_editor.set_filename(path) self.add(new_editor, text=new_editor.get_title()) self.select(new_editor) new_editor.focus_set() def _cmd_open_file(self): node = choose_node_for_file_operations(self.winfo_toplevel(), "Where to open from?") if not node: return if node == "local": initialdir = get_workbench().get_local_cwd() if ( self.get_current_editor() is not None and self.get_current_editor().get_filename() is not None ): initialdir = os.path.dirname(self.get_current_editor().get_filename()) path = askopenfilename( filetypes=_dialog_filetypes, initialdir=initialdir, parent=get_workbench() ) else: assert node == "remote" target_path = ask_backend_path(self.winfo_toplevel(), "open") if not target_path: return path = make_remote_path(target_path) if path: # self.close_single_untitled_unmodified_editor() self.show_file(path, propose_dialog=False) def _control_o(self, event): # http://stackoverflow.com/questions/22907200/remap-default-keybinding-in-tkinter self._cmd_open_file() return "break" def _close_files(self, except_index=None): for tab_index in reversed(range(len(self.winfo_children()))): if except_index is not None and tab_index == except_index: continue else: editor = self.get_child_by_index(tab_index) if self.check_allow_closing(editor): self.forget(editor) editor.destroy() def _cmd_close_file(self): self.close_tab(self.index(self.select())) def close_tab(self, index): editor = self.get_child_by_index(index) if editor: self.close_editor(editor) def close_editor(self, editor, force=False): if not force and not self.check_allow_closing(editor): return self.forget(editor) editor.destroy() def _cmd_save_file(self): if self.get_current_editor(): self.get_current_editor().save_file() self.update_editor_title(self.get_current_editor()) def _cmd_save_file_enabled(self): return self.get_current_editor() and self.get_current_editor().save_file_enabled() def _cmd_save_all_files(self): for editor in self.get_all_editors(): if editor.save_file_enabled() == True: editor.save_file() self.update_editor_title(editor) def _cmd_save_all_files_enabled(self): for editor in self.get_all_editors(): if editor.save_file_enabled() == True: return True return False def _cmd_save_file_as(self, node=None): if not self.get_current_editor(): return self.get_current_editor().save_file(ask_filename=True, node=node) self.update_editor_title(self.get_current_editor()) get_workbench().update_title() def _cmd_save_copy(self): if not self.get_current_editor(): return self.get_current_editor().save_file(ask_filename=True, save_copy=True) self.update_editor_title(self.get_current_editor()) def _cmd_save_file_as_enabled(self): return self.get_current_editor() is not None def _cmd_move_rename_file(self): editor = self.get_current_editor() old_filename = editor.get_filename() assert old_filename is not None if is_remote_path(old_filename): node = "remote" else: node = "local" self._cmd_save_file_as(node=node) if editor.get_filename() != old_filename: if is_remote_path(old_filename): remote_path = extract_target_path(old_filename) get_runner().send_command_and_wait( InlineCommand( "delete", paths=[remote_path], description=tr("Deleting" + remote_path) ), dialog_title=tr("Deleting"), ) get_workbench().event_generate( "RemoteFileOperation", path=remote_path, operation="delete" ) else: os.remove(old_filename) get_workbench().event_generate( "LocalFileOperation", path=old_filename, operation="delete" ) def _cmd_move_rename_file_enabled(self): return self.get_current_editor() and self.get_current_editor().get_filename() is not None def close_single_untitled_unmodified_editor(self): editors = self.winfo_children() if len(editors) == 1 and not editors[0].is_modified() and not editors[0].get_filename(): self._cmd_close_file() def _cmd_goto_source_line(self): editor = self.get_current_editor() if editor: line_no = simpledialog.askinteger(tr("Go to line"), tr("Line number")) if line_no: editor.select_line(line_no) def _mac_open_document(self, *args): for arg in args: if isinstance(arg, str) and os.path.exists(arg): self.show_file(arg) get_workbench().become_active_window() def get_current_editor(self) -> Optional[Editor]: return self.get_current_child() def get_current_editor_content(self): editor = self.get_current_editor() if editor is None: return None else: return editor.get_content() def get_all_editors(self): # When workspace is closing, self.winfo_children() # may return an unexplainable tkinter.Frame return [child for child in self.winfo_children() if isinstance(child, Editor)] def select_next_prev_editor(self, direction): cur_index = self.index(self.select()) next_index = (cur_index + direction) % len(self.tabs()) self.select(self.get_child_by_index(next_index)) def file_is_opened(self, path): for editor in self.get_all_editors(): if editor.get_filename() and is_same_path(path, editor.get_filename()): return True return False def show_file(self, filename, text_range=None, set_focus=True, propose_dialog=True): # self.close_single_untitled_unmodified_editor() try: editor = self.get_editor(filename, True) except PermissionError: logger.exception("Loading " + filename) msg = "Got permission error when trying to load\n" + filename if running_on_mac_os() and propose_dialog: msg += "\n\nTry opening it with File => Open." messagebox.showerror("Permission error", msg, master=self) return None if editor is None: return self.select(editor) if set_focus: editor.focus_set() if text_range is not None: editor.select_range(text_range) return editor def show_remote_file(self, target_filename): if not get_runner().ready_for_remote_file_operations(show_message=True): return None else: return self.show_file(make_remote_path(target_filename)) def show_file_at_line(self, filename, lineno, col_offset=None): editor = self.show_file(filename) editor.select_line(lineno, col_offset) def update_appearance(self): for editor in self.winfo_children(): editor.update_appearance() def update_editor_title(self, editor, title=None): if title is None: title = editor.get_title() try: self.tab(editor, text=title) except TclError: pass try: self.indicate_modification() except Exception: logger.exception("Could not update modification indication") def indicate_modification(self): if not running_on_mac_os(): return atts = self.winfo_toplevel().wm_attributes() if "-modified" in atts: i = atts.index("-modified") mod = atts[i : i + 2] rest = atts[:i] + atts[i + 2 :] else: mod = () rest = atts for editor in self.get_all_editors(): if editor.is_modified(): if mod != ("-modified", 1): self.winfo_toplevel().wm_attributes(*(rest + ("-modified", 1))) break else: if mod == ("-modified", 1): self.winfo_toplevel().wm_attributes(*(rest + ("-modified", 0))) def _open_file(self, filename): editor = Editor(self) if editor._load_file(filename): self.add(editor, text=editor.get_title()) return editor else: editor.destroy() return None def get_editor(self, filename_or_id, open_when_necessary=False): if os.path.isfile(filename_or_id): filename_or_id = normpath_with_actual_case(os.path.abspath(filename_or_id)) for child in self.winfo_children(): assert isinstance(child, Editor) child_identifier = child.get_identifier() if child_identifier == filename_or_id: return child if open_when_necessary: return self._open_file(filename_or_id) else: return None def check_allow_closing(self, editor=None): if not editor: modified_editors = [e for e in self.winfo_children() if e.is_modified()] else: if not editor.is_modified(): return True else: modified_editors = [editor] if len(modified_editors) == 0: return True message = tr("Do you want to save files before closing?") if editor: message = tr("Do you want to save file before closing?") confirm = messagebox.askyesnocancel( title=tr("Save On Close"), message=message, default=messagebox.YES, master=self ) if confirm: for editor_ in modified_editors: assert isinstance(editor_, Editor) if editor_.get_filename(True): if not editor_.save_file(): return False else: return False return True elif confirm is None: return False else: return True def check_for_external_changes(self, event=None): if self._checking_external_changes: # otherwise the method will be re-entered when focus # changes because of a confirmation message box return self._checking_external_changes = True try: for editor in self.get_all_editors(): editor.check_for_external_changes() finally: self._checking_external_changes = False def get_current_breakpoints(): result = {} for editor in get_workbench().get_editor_notebook().get_all_editors(): filename = editor.get_filename() if filename: linenos = editor.get_code_view().get_breakpoint_line_numbers() if linenos: result[filename] = linenos return result def get_saved_current_script_filename(force=True): editor = get_workbench().get_editor_notebook().get_current_editor() if not editor: return None filename = editor.get_filename(force) if not filename: return None if editor.is_modified(): filename = editor.save_file() return filename def is_remote_path(s): return REMOTE_PATH_MARKER in s def is_local_path(s): return not is_remote_path(s) def get_target_dirname_from_editor_filename(s): if is_local_path(s): return os.path.dirname(s) else: return universal_dirname(extract_target_path(s)) def extract_target_path(s): assert is_remote_path(s) return s[s.find(REMOTE_PATH_MARKER) + len(REMOTE_PATH_MARKER) :] def make_remote_path(target_path): return get_runner().get_node_label() + REMOTE_PATH_MARKER + target_path ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/export.py0000664000175000017500000000302214276461532016070 0ustar00annamaaannamaaimport tkinter as tk from tkinter import ttk from thonny.languages import tr from thonny.ui_utils import CommonDialog page_specs = [] class ExportDialog(CommonDialog): def __init__(self, master): super().__init__(master=master) self.title("Export file") self.protocol("WM_DELETE_WINDOW", self.on_cancel) mainframe = ttk.Frame(self) mainframe.grid(row=0, column=0, sticky="nsew") self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.notebook = ttk.Notebook(mainframe) self.notebook.grid(row=3, column=0, columnspan=3, padx=20, pady=(20, 0), sticky="nsew") self.ok_button = ttk.Button(mainframe, text=tr("OK"), command=self.on_ok) self.ok_button.grid(row=4, column=1, sticky="e", padx=(20, 10), pady=(10, 20)) self.cancel_button = ttk.Button(mainframe, text=tr("Cancel"), command=self.on_cancel) self.cancel_button.grid(row=4, column=2, sticky="e", padx=(0, 20), pady=(10, 20)) mainframe.columnconfigure(0, weight=1) mainframe.rowconfigure(3, weight=1) for title, page_class in page_specs: page = page_class(self.notebook) self.notebook.add(page, text=title) def on_ok(self): print("OK") def on_cancel(self): print("Cancel") self.destroy() class LocalFilesExportPage(ttk.Frame): def __init__(self, master): super().__init__(master=master) def add_export_page(title, page_class): page_specs.append((title, page_class)) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/first_run.py0000664000175000017500000000665714276461532016603 0ustar00annamaaannamaaimport os.path import tkinter as tk from tkinter import ttk from thonny import is_portable, languages, ui_utils STD_MODE_TEXT = "Standard" RPI_MODE_TEXT = "Raspberry Pi" class FirstRunWindow(tk.Tk): def __init__(self, configuration_manager): super().__init__(className="Thonny") ttk.Style().theme_use(ui_utils.get_default_basic_theme()) self.title("Welcome to Thonny!" + " [portable]" if is_portable() else "") self.protocol("WM_DELETE_WINDOW", self.destroy) self.ok = False self.conf = configuration_manager self.main_frame = ttk.Frame(self) self.main_frame.grid(row=1, column=1, sticky="nsew") self.columnconfigure(1, weight=1) self.rowconfigure(1, weight=1) self.main_frame.rowconfigure(1, weight=1) logo_file = os.path.join(os.path.dirname(__file__), "res", "thonny.png") self.logo = tk.PhotoImage(file=logo_file) logo_label = ttk.Label(self.main_frame, image=self.logo) logo_label.grid(row=1, rowspan=3, column=1, sticky="nsew") self.padx = 50 self.pady = 50 self.language_variable = ui_utils.create_string_var( languages.BASE_LANGUAGE_NAME, self.on_change_language ) self.add_combo( 1, "Language:", self.language_variable, list(languages.LANGUAGES_DICT.values()) ) self.mode_variable = tk.StringVar(value=STD_MODE_TEXT) self.add_combo(2, "Initial settings:", self.mode_variable, [STD_MODE_TEXT, RPI_MODE_TEXT]) ok_button = ttk.Button(self.main_frame, text="Let's go!", command=self.on_ok) ok_button.grid( row=3, column=3, padx=(0, self.padx), pady=(self.pady * 0.7, self.pady), sticky="se" ) self.center() def on_change_language(self): print(self.language_variable.get()) def add_combo(self, row, label_text, variable, values): pady = 7 label = ttk.Label(self.main_frame, text=label_text) label.grid(row=row, column=2, sticky="sw", pady=(pady, 0)) assert isinstance(variable, tk.Variable) combobox = ttk.Combobox( self.main_frame, exportselection=False, textvariable=variable, state="readonly", height=15, width=20, values=values, ) combobox.grid(row=row, column=3, padx=(10, self.padx), sticky="sw", pady=(pady, 0)) def center(self): width = max(self.winfo_reqwidth(), 640) height = max(self.winfo_reqheight(), 300) screen_width = self.winfo_screenwidth() screen_height = self.winfo_screenheight() if screen_width > screen_height * 2: # probably dual monitors screen_width //= 2 left = max(int(screen_width / 2 - width / 2), 0) top = max(int(screen_height / 2 - height / 2), 0) # Positions the window in the center of the page. self.geometry("+{}+{}".format(left, top)) def on_ok(self): if self.mode_variable.get() == RPI_MODE_TEXT: self.conf.set_option("debugger.preferred_debugger", "faster") self.conf.set_option("view.ui_theme", "Raspberry Pi") self.conf.set_option("general.ui_mode", "simple") self.conf.set_option( "general.language", languages.get_language_code_by_name(self.language_variable.get()) ) self.conf.save() self.ok = True self.destroy() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/gridtable.py0000664000175000017500000002230714276461532016513 0ustar00annamaaannamaaimport math import tkinter as tk from tkinter import ttk from thonny import get_workbench class GridTable(tk.Frame): def __init__(self, master, header_rows, data_row_count, footer_row_count, frozen_column_count): super().__init__(master) self.header_widgets = {} self.data_widgets = {} self.bind("", self.on_configure, True) self.screen_row_height = 22 # TODO: self.first_visible_data_row_no = 0 self.visible_data_row_count = 0 self.header_rows = header_rows self.data_rows = {} self.screen_row_count = 0 self.data_row_count = data_row_count self.column_count = len(self.header_rows[-1]) self.header_row_count = len(header_rows) self.footer_row_count = footer_row_count self.frozen_column_count = frozen_column_count self.update_header_rows() def set_data(self, data_rows): # self.data_rows.update(data_rows) # dict version self.data_rows = data_rows self.data_row_count = len(data_rows) self.update_screen_data() def update_header_rows(self): for row_no in range(self.header_row_count): for col_no in range(self.column_count): w = self.get_header_widget(self.screen_row_count, col_no) w.grid(row=row_no, column=col_no, sticky="nsew", pady=(0, 1), padx=(0, 1)) w.configure(text=self.get_header_value(row_no, col_no)) self.screen_row_count = self.header_row_count def get_data_widget(self, screen_row_no, col_no): if (screen_row_no, col_no) not in self.data_widgets: self.data_widgets[(screen_row_no, col_no)] = self.create_data_widget(col_no) return self.data_widgets[(screen_row_no, col_no)] def get_header_widget(self, row_no, col_no): if (row_no, col_no) not in self.header_widgets: self.header_widgets[(row_no, col_no)] = self.create_header_widget(col_no) return self.header_widgets[(row_no, col_no)] def create_data_widget(self, col_no): if col_no < self.frozen_column_count: background = None else: background = "white" return tk.Label(self, background=background, anchor="e", padx=7, text="") def create_header_widget(self, col_no): return tk.Label(self, anchor="e", padx=7, text="") def set_first_visible_data_row_no(self, n): self.first_visible_data_row_no = max(min(n, self.data_row_count), 0) self.update_screen_data() def _clear_screen_row(self, row_no): for widget in self.grid_slaves(row=row_no): widget.grid_remove() def update_screen_widgets(self, available_screen_height): max_screen_rows = available_screen_height // self.screen_row_height target_screen_row_count = max( min( max_screen_rows, self.header_row_count + self.data_row_count + self.footer_row_count - self.first_visible_data_row_no, ), self.header_row_count + 1 + self.footer_row_count, ) # target_screen_row_count = 30 # remove cells not required anymore ... while self.screen_row_count > target_screen_row_count: # print("removing") self._clear_screen_row(self.screen_row_count - 1) self.screen_row_count -= 1 # ... or add cells that can be shown while self.screen_row_count < target_screen_row_count: # print("adding") for col in range(self.column_count): w = self.get_data_widget(self.screen_row_count, col) w.grid( row=self.screen_row_count, column=col, sticky="nsew", pady=(0, 1), padx=(0, 1) ) self.screen_row_count += 1 self.visible_data_row_count = ( self.screen_row_count - self.header_row_count - self.footer_row_count ) def update_screen_data(self): self.update_screen_widgets(self.winfo_height()) for screen_row_no in range(self.header_row_count, self.screen_row_count): data_row_no = self.first_visible_data_row_no + screen_row_no - self.header_row_count if data_row_no == self.data_row_count: break for col_no in range(self.column_count): w = self.get_data_widget(screen_row_no, col_no) value = self.get_data_value(data_row_no, col_no) if value is None: w.configure(text="") else: w.configure(text=str(value)) def get_data_value(self, row_no, col_no): """lazy dict version: assert 0 <= row_no < self.data_row_count if row_no in self.data_rows: return self.data_rows[row_no][col_no] else: return "" """ return self.data_rows[row_no][col_no] def get_header_value(self, row_no, col_no): return self.header_rows[row_no][col_no] def on_configure(self, event): # query row height _, _, _, height = self.grid_bbox(row=1) if height > 10 and height < 100: "self.screen_row_height = height + 2" # screen_available_height = self.winfo_height() # print("HE", self.winfo_height(), event.height, self.screen_row_height) self.update_screen_widgets(event.height) self.update_screen_data() class ScrollableGridTable(ttk.Frame): def __init__(self, master, header_rows, data_row_count, footer_row_count, frozen_column_count): ttk.Frame.__init__(self, master) # set up scrolling with canvas hscrollbar = ttk.Scrollbar(self, orient=tk.HORIZONTAL) self.canvas = tk.Canvas(self, bd=0, highlightthickness=0, xscrollcommand=hscrollbar.set) get_workbench().bind_all("", self.debug) self.create_infopanel(data_row_count) hscrollbar.config(command=self.canvas.xview) self.canvas.xview_moveto(0) self.canvas.yview_moveto(0) self.canvas.grid(row=0, column=0, columnspan=2, sticky=tk.NSEW) self.infopanel.grid(row=1, column=0, sticky=tk.NSEW) hscrollbar.grid(row=1, column=1, sticky=tk.NSEW) # vertical scrollbar performs virtual scrolling self.vscrollbar = ttk.Scrollbar( self, orient=tk.VERTICAL, command=self._handle_vertical_scroll ) self.vscrollbar.grid(row=0, column=2, sticky=tk.NSEW) self.columnconfigure(1, weight=1) self.rowconfigure(0, weight=1) self.interior = ttk.Frame(self.canvas) self.interior.columnconfigure(0, weight=1) self.interior.rowconfigure(0, weight=1) self.interior_id = self.canvas.create_window(0, 0, window=self.interior, anchor=tk.NW) self.bind("", self._configure_interior, True) self.bind("", self._on_expose, True) self.grid_table = GridTable( self.interior, header_rows, data_row_count, footer_row_count, frozen_column_count ) self.grid_table.grid(row=0, column=0, sticky=tk.NSEW) self._update_vertical_scrollbar() def debug(self, event=None): print("DE", self.vscrollbar.get()) def create_infopanel(self, data_row_count): self.infopanel = ttk.Frame(self) self.size_label = ttk.Label(self.infopanel, text=str(data_row_count) + " rows") self.size_label.grid(row=0, column=0, padx=5) def _update_vertical_scrollbar(self): first = self.grid_table.first_visible_data_row_no / self.grid_table.data_row_count last = first + self.grid_table.visible_data_row_count / self.grid_table.data_row_count # print(first, last, self.grid_table.visible_data_row_count) self.vscrollbar.set(first, last) def _handle_vertical_scroll(self, *args): # print("vscroll", args, self.vscrollbar.get()) if len(args) == 3 and args[0] == "scroll": amount = int(args[1]) unit = args[2] if unit == "pages": amount *= self.grid_table.visible_data_row_count self.grid_table.set_first_visible_data_row_no( self.grid_table.first_visible_data_row_no + amount ) else: assert args[0] == "moveto" pos = max(min(float(args[1]), 1.0), 0.0) top_row = math.floor( (self.grid_table.data_row_count - self.grid_table.visible_data_row_count + 1) * pos ) self.grid_table.set_first_visible_data_row_no(top_row) self._update_vertical_scrollbar() def _on_expose(self, event): self.update_idletasks() self._configure_interior(event) def _configure_interior(self, event): # update the scrollbars to match the size of the inner frame size = (self.interior.winfo_reqwidth(), self.canvas.winfo_height()) self.canvas.config(scrollregion="0 0 %s %s" % size) if ( self.interior.winfo_reqheight() != self.canvas.winfo_height() and self.canvas.winfo_height() > 10 ): # update the interior's height to fit canvas self.canvas.itemconfigure(self.interior_id, height=self.canvas.winfo_height()) self._update_vertical_scrollbar() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660796533.0 thonny-4.0.1/thonny/jedi_utils.py0000664000175000017500000002325314277337165016717 0ustar00annamaaannamaa""" Utils to handle different jedi versions """ from logging import getLogger from typing import Dict, List, Optional import jedi.api.classes from jedi.api.classes import BaseSignature, ParamName from thonny.common import CompletionInfo, NameReference, SignatureInfo, SignatureParameter logger = getLogger(__name__) _last_jedi_completions: Optional[List[jedi.api.classes.Completion]] = None def get_script_completions( source: str, row: int, column: int, filename: str, sys_path=None ) -> List[CompletionInfo]: _check_patch_jedi_typesheds(sys_path) global _last_jedi_completions try: script = _create_script(source, filename, sys_path) completions = script.complete(line=row, column=column, fuzzy=False) except Exception: logger.exception("Jedi error") completions = [] completions = _filter_completions(completions, sys_path) _last_jedi_completions = completions return _export_completions(completions) def get_interpreter_completions( source: str, namespaces: List[Dict], sys_path=None ) -> List[CompletionInfo]: _check_patch_jedi_typesheds(sys_path) global _last_jedi_completions try: interpreter = _create_interpreter(source, namespaces, sys_path) # assuming cursor is at the end of the source completions = interpreter.complete() except Exception: logger.exception("Jedi error") completions = [] completions = _filter_completions(completions, sys_path) _last_jedi_completions = completions return _export_completions(completions) def get_completion_details(full_name: str) -> Optional[CompletionInfo]: if not _last_jedi_completions: return None # assuming this name can be found in the list of last completions try: for completion in _last_jedi_completions: if completion.type in {"function", "class"}: signatures = [_export_signature(s) for s in completion.get_signatures()] raw_docstring = True else: signatures = None raw_docstring = False if completion.full_name == full_name: return CompletionInfo( name=completion.name, name_with_symbols=_get_completion_name_with_symbols(completion, signatures), full_name=completion.full_name, type=completion.type, prefix_length=completion.get_completion_prefix_length(), signatures=signatures, docstring=completion.docstring(raw=raw_docstring), ) except Exception: logger.exception("Jedi error") return None def get_script_signatures( source: str, row: int, column: int, filename: str, sys_path=None ) -> List[SignatureInfo]: _check_patch_jedi_typesheds(sys_path) try: script = _create_script(source, filename, sys_path) sigs = script.get_signatures(line=row, column=column) except Exception: sigs = [] return [_export_signature(sig) for sig in sigs] def get_interpreter_signatures( source: str, namespaces: List[Dict], sys_path=None ) -> List[SignatureInfo]: _check_patch_jedi_typesheds(sys_path) try: # assuming cursor is at the end of the source interpreter = _create_interpreter(source, namespaces, sys_path) sigs = interpreter.get_signatures() except Exception: logger.exception("Jedi error") sigs = [] return [_export_signature(sig) for sig in sigs] def get_definitions( source: str, row: int, column: int, filename: str, sys_path: List[str] = None ) -> List[NameReference]: _check_patch_jedi_typesheds(sys_path) try: script = _create_script(source, filename, sys_path) defs = script.goto(line=row, column=column, follow_imports=True) except Exception: logger.exception("Jedi error") defs = [] return [_export_reference(d) for d in defs] def get_references( source: str, row: int, column: int, filename: str, scope: str, sys_path: Optional[List[str]] = None, ) -> List[NameReference]: _check_patch_jedi_typesheds(sys_path) try: script = _create_script(source + ")", filename, sys_path) references = script.get_references(row, column, include_builtins=False, scope=scope) except Exception: logger.exception("Jedi error") return [] # some refs (e.g. in Jedi 0.16) may lack line and column references = [ref for ref in references if ref.line is not None and ref.column is not None] return [_export_reference(ref) for ref in references] def _create_script(source: str, filename: str, sys_path: List[str]) -> jedi.api.Script: if sys_path: project = jedi.Project(path=sys_path[0], sys_path=sys_path, smart_sys_path=False) else: project = None return jedi.Script( code=source, path=filename, project=project, ) def _create_interpreter( source: str, namespaces: List[Dict], sys_path: Optional[List[str]] ) -> jedi.api.Interpreter: if sys_path: project = jedi.Project(path=sys_path[0], sys_path=sys_path, smart_sys_path=False) else: project = None return jedi.Interpreter(source, namespaces, project=project) def _export_completions(completions: List[jedi.api.classes.Completion]) -> List[CompletionInfo]: return [_export_completion(comp) for comp in completions] def _filter_completions( completions: List[jedi.api.classes.Completion], sys_path: Optional[List[str]] ) -> List[jedi.api.classes.Completion]: if sys_path is None: return completions result = [] for completion in completions: if completion.name.startswith("__"): continue result.append(completion) return result def _export_completion(completion: jedi.api.classes.Completion) -> CompletionInfo: # In jedi before 0.16, the name attribute did not contain trailing '=' for argument completions, # since 0.16 it does. Need to ensure similar result for all supported versions. return CompletionInfo( name=completion.name and completion.name.strip("="), name_with_symbols=_get_completion_name_with_symbols(completion), full_name=completion.full_name and completion.full_name.strip("="), type=completion.type, prefix_length=completion.get_completion_prefix_length(), signatures=None, # must be queried separately docstring=None, # must be queried separately ) def _export_signature(sig: BaseSignature) -> SignatureInfo: as_string = sig.to_string() if "->" in as_string: # No documented API for getting the return type in 0.18 return_type = as_string.split("->")[-1].strip() else: return_type = None current_param_index = None call_bracket_start = None if hasattr(sig, "index"): # only in subclass (Signature or CallSignature) current_param_index = sig.index if hasattr(sig, "bracket_start"): # only in subclass (Signature or CallSignature) call_bracket_start = sig.bracket_start return SignatureInfo( name=sig.name, params=[_export_param(p) for p in sig.params], return_type=return_type, current_param_index=current_param_index, call_bracket_start=call_bracket_start, ) def _export_param(param: ParamName) -> SignatureParameter: # No documented API for getting separate annotation and default, need to parse s = param.to_string() if s.count("=") == 1: without_default, default = s.split("=") else: without_default = (s,) default = None if without_default.count(":") == 1: annotation = without_default.split(":")[-1].strip() else: annotation = None return SignatureParameter( kind=str(param.kind), name=param.name, annotation=annotation, default=default ) def _export_reference(ref) -> NameReference: return NameReference( module_name=ref.module_name, module_path=None if not ref.module_path else str(ref.module_path), row=ref.line, column=ref.column, length=len(ref.name), ) def _get_completion_name_with_symbols( completion: jedi.api.classes.Completion, signatures: Optional[List[BaseSignature]] = None, ) -> str: if completion.type == "param": # Older jedi versions may give trailing "=" also for actual arguments. # NB! Not all params are names of the params! return completion.name_with_symbols elif completion.type == "function": if not signatures: # signatures not found or haven't been computed yet return completion.name + "(" else: # logger.info("name: %s, type: %s, sigs: %s", completion.name, completion.type, signatures) # assuming type=instance can also have signature # if it can only be called with 0 params, then add closing paren as well different_param_counts = {len(sig.params) for sig in signatures} if different_param_counts == {0}: return completion.name + "()" else: return completion.name + "(" elif completion.type == "keyword" and completion.name != "pass": return completion.name + " " return completion.name_with_symbols def _check_patch_jedi_typesheds(sys_path: Optional[List[str]]) -> None: if sys_path is None: return from jedi.inference.gradual import typeshed def _patched_get_typeshed_directories(version_info): for path in sys_path: if "api_stubs" in path: yield typeshed.PathInfo(path, False) typeshed._get_typeshed_directories = _patched_get_typeshed_directories ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/languages.py0000664000175000017500000000450014276461532016517 0ustar00annamaaannamaaimport gettext import os from logging import getLogger logger = getLogger(__name__) BASE_LANGUAGE_CODE = "en_US" BASE_LANGUAGE_NAME = "English" # https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes LANGUAGES_DICT = { "cs_CZ": "Čeština [BETA]", "de_DE": "Deutsch", "et_EE": "Eesti", BASE_LANGUAGE_CODE: BASE_LANGUAGE_NAME, "es_ES": "Español", "fr_FR": "Français", "it_IT": "Italiano", "lt_LT": "Lietuvių", "hu_HU": "Magyar [BETA]", "nb_NO": "Norsk (Bokmål)", "nn_NO": "Norsk (Nynorsk)", "nl_NL": "Nederlands", "pl_PL": "Polski", "pt_PT": "Português (PT)", "pt_BR": "Português (BR)", "ro_RO": "Român", "ru_RU": "Русский", "sl_SI": "Slovène", "sk_SK": "Slovenčina [BETA]", "fi_FI": "Suomi [BETA]", "sv_SE": "Svenska [BETA]", "sq_AL": "Shqip [ALPHA]", "tr_TR": "Türkçe [BETA]", "uk_UA": "Українська", "zh_TW": "繁體中文-TW", "zh_CN": "简体中文 ", "ja_JP": "日本語 [ALPHA]", "hy_AM": "Հայերէն [BETA]", "fa_IR": "[BETA] فارسی", "el_GR": "Ελληνικά", "ko_KR": "한국어 [韓國語] [ALPHA]", "ar_AR": "[BETA] عربي", "ta_IN": "தமிழ் [BETA]", "th_TH": "ภาษาไทย [BETA]", } # how many spaces to add to button caption in order to make whole text visible BUTTON_PADDING_SIZES = {"zh_TW": 4, "zh_CN": 4, "ja_JP": 4} _translation = gettext.NullTranslations() def get_button_padding(): from thonny import get_workbench code = get_workbench().get_option("general.language") if code in BUTTON_PADDING_SIZES: return BUTTON_PADDING_SIZES[code] * " " else: return "" def get_language_code_by_name(name): for code in LANGUAGES_DICT: if LANGUAGES_DICT[code] == name: return code raise RuntimeError("Unknown language name '%s'" % name) def tr(message: str) -> str: return _translation.gettext(message) def set_language(language_code: str) -> None: global _translation try: path = os.path.join(os.path.dirname(__file__), "locale") _translation = gettext.translation("thonny", path, [language_code]) except Exception as e: logger.exception("Could not set language to '%s", language_code, exc_info=e) _translation = gettext.NullTranslations() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6861067 thonny-4.0.1/thonny/locale/0000775000175000017500000000000014307363733015436 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/thonny/locale/ar_AR/0000775000175000017500000000000014307363733016422 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6861067 thonny-4.0.1/thonny/locale/ar_AR/LC_MESSAGES/0000775000175000017500000000000014307363733020207 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/ar_AR/LC_MESSAGES/thonny.mo0000664000175000017500000011052114276461532022064 0ustar00annamaaannamaaL ||}]$) *3^ m&z+-! D.7s&      1x?  &5< P[j;{    , GD I [ c <x % * !%!8!U!Y!^!d!y!!!3!""1"8"H" Q"]"m"u"|""!" """ #B#\#b#g#v### ##%##/#'$.B$q$ w$$$ $$ $$$$ $$$$$ %"%(% 1% >% I%U%g%,&/2&=b& &&&&&0&' ''6,'c'}'''''''''L(FM((C\)))7)***!*9*X* s** ** ***3*+ ++&+/+E+T+Y+ a+l+|+ +++~,z1-;---. %.13. e......../ /"/n2//,v000<01-1U1c)222 2n2!3 53 A3 O3 ]3k3q333?3C3454'S4){4 444445&5;5TC5 5555 555H5O'65w66666667 $707:87s7x77&777777 8 8 8*8;8M8a8f8 x8B888 88 8&9)9 19=9 V9 d9q99 999 9 999 9"9: : /: :: G: U:`: g:t:z:: :: : ::2:/;8O;;:;; ;< <0!<R<d<v< {< <<<-<< < <= === 0= ==)K=u=}= ====== =>=n=>0>!> > ? ? @b@@ATA/fAA@PBBB"BBB B CC#C0,C ]CgC lCvCCCCCCC CC2D%7D]DcD lDvDDDLDDD5E EEEECF#YF}F F FF FF1F%F G%GV7GIG GG GGH&H HH9IHI/J 2J @JXNJJcJc%K5KK=EL@LL LL L!LM'M->MlMMIN\NvN#NJN;N 9ODO `O"kOOqO Pr `rjrrs s $s1sKs js\wsds;9tuttt tt6t*u2uPuZ_uuuu;u /v{:G{{{6{G{K)|pu||d|/_}E} }}V}(O~x~ ~~~~~4~09MV _ l1wM/-8f&|& ʀրcuA 6MDp<Qa:-ȇ 7"S/v"hɈ2 LWq" %ډ!W5T (6_zfiK !2-#`L2 )A Q^~;18qJÐߐ! 7%d items(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)(restart Thonny after changing this)(used when clicking Debug toolbar button)A special virtual environment (deprecated)About BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow code completion with Tab-key in ShellAllow code completion with Tab-key in editorsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Alternative Python 3 interpreter or virtual environmentAre you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeBackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancel the process?CancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear shellClickClick CloseClose allClose othersComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Create new virtual environmentCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDelete selectedDeletingDeleting %sDesired versionDetailsDeviceDirectory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to overwrite '%s' ?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.Done!DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExpand in ShellExport usage logs...FileFile name:File propertiesFilesFindFind & ReplaceFind package from PyPIFind:FirmwareFocus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.For uninstalling delete corresponding files.For upgrading simply install the package again.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf last command raised an exception then this view will show the stacktrace.If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDKnown interpretersLanguageLatest stable versionLatest versionLoadLoadingLoading %sLocal variablesLocationLocation: Log program usage eventsLooks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Looks like you are trying to install an outdated Thonny plug-in (it doesn't specify required Thonny version). If you still want it, then please install it from the command line.Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedModuleMove to Recycle BinMove to TrashMoving %s to %sNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python 3.5 and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NB! micropython.org has published version %s of this package and this will be installed by default.NameNewNew directoryNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package is not available at micropython.org. Version at PyPI will be installed.Package manager is not available for this interpreterPackages' directoryPasswordPastePathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...Program argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)Rename...Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:ResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect existing or create a new empty directorySelect if the file dialogs end up behind the main windowSelect interpreterSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShadowed items (not importable):ShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySwitch to regular modeSyntax themeTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe process is still running. Are you sure you want to cancel?The representation above is an approximate value of this float. The exact stored value is %s which is about %sThe same interpreter which runs Thonny (default)The specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThis virtual environment is automatically maintained by Thonny. Thonny optionsThonny plug-insThonny plugin without requirementsToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUploading %s to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityValueValue IDVariablesVersion historyVersion to be installedViewWhat to do with a %s file when you double-click it in Thonny's file browser?Which interpreter or device should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Working...Wrap text (may be slow)You need to enterYou need to select a file!You need to stop your program before launching the package manager.Your interpreter isn't in the list?Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentMIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: POEditor.com Project-Id-Version: Thonny Language: ar %d عنصر(في هذه الحالة ، تستخدم الواجهة الخلفية لثوني نفس المفسر، لذا فإن كلا الحوارات يديران نفس الحزم.)(إعادة تشغيل ثوني بعد تعديل هذه)(يستخدم عند النقر زر شريط أدوات التنقيح)بيئة افتراضية خاصة (مهملة)Birdseye عنعن ثونيالتثبيت المتقدم / التحديث / الرجوع إلى إصدار أقدمخيارات متقدمةTab السماح بالتكملة التلقائية في الصدفة باستخدام مفتاحTab السماح بالتكملة التلقائية في المحرر باستخدام مفتاحالسماح بسخة واحدة فقط من ثونيالسماح بالدخول إلى المكتبات (على سبيل المثال ، خارج دليل السكربت الرئيسي)مفسر بايثون بديل أو بيئة افتراضيةهل أنت متأكد أنك تريد إلغاء تثبيته؟المساعدخصائصالمصادقةالمؤلفالتكملة التلقائيةعودةالعودة إلى %sالعودة إلى الإطار الحاليمجلد غير صالحBirdseye عبارة عن منقح للغة بايثون والذي يتطلب تثبيته بشكل منفصل. هل ترغب بفتح صفحة المساعدة لمزيد من التفاصيل؟Birdseye منفذاستعراض الحزمتعقب الاخطاءلا يمكن الإغلاق بعدلا يمكن العثور على اسم الحزمة من القائمة:لا يمكن العثور على القرص المناسبالغاءالغاء العملية؟إلغاءحساسية حالة الأحرفتغيير حجم الخطتغيير دليل العمل الحالي إلى دليل السكربت على التشغيل / التنقيحسيركت بايثون (عام)CircuitPython جهاز مسحمسح الصدفةإضغطإضغط على إغلاقإغلاق الكلإغلاق نوافذ التبويب الاخرىتحويل إلى تعليقتم تحديث الإعدادات. أعد تشغيل ثوني لبدء العمل في الوضع العادي. (راجع "أدوات ← خيارات ← عام" إذا غيرت رأيك لاحقًا.)إعداد ملفات %sإعداد المفسرتأكيدConnect your device to the computer and select corresponding port belowنسخالنسخ إلى الحافظةينسخينسخ %s إلى %sلم نتمكن من إيجاد القرص '%s'. هل ترغب بتحديده بنفسك؟تعذر العثور على الحزمة من PyPI.PyPI تعذر العثور على معلومات الحزمة منإنشاء بيئة افتراضية جديدةإنشاء دليلقيد إنشاء بيئة افتراضيةقصبياناتالتنقيحتنقيح السكربت الحاليتنقيح السكربت الحالي (birdseye)تنقيح السكربت الحالي (أسرع)تنقيح السكربت الحالي (الطف)وضع التنقيح (يوفر سجلات تشخيص أكثر تفصيلاً)تقليص حجم الخطإزالة مسافة بادئة للأسطر المحددةحذفحذف المحددحذفحذف %sالإصدار المطلوبالتفاصيلجهازخصائص الدليلتعطيل صوت التنبيهتعطيل الفحوصات (معرف واحد فقط لكل سطر)قطع الاتصالهل ترغب باستبدال الملف '%s'?إرساء نوافذ المستخدمالتوثيقلا تنس أن main.py يعمل فقط بدون السكربت الرئيسي المضمن.انتهى!لأسفلالتنزيل إلى %sتنزيل %s إلى %sتحريرالمحررخط المحررإدخل عدد صحيحأدخل اسم لدليل الجديد تحت %sأكتب النص المراد استبداله.أدخل عبارة مرور مفتاحك الخاص لـ {}أدخل كلمة المرور الخاصة بك لـ {}متغيرات البيئة (المفتاح=القيمة لكل سطر)خطأرمز الخطأ:خطأ:الأحداثاستثناءخروجإغلاق ثونيتوسع في الصدفةتصدير سجلات الاستخدامملفاسم الملف:خصائص الملفالملفاتابحثالبحث والاستبدالالبحث عن حزمة في PyPIالبحث:برنامج ثابتتنشيط المحررركز علىتنشيط الصدفةوضع تحجيم الخطلأسباب تتعلق بالأداء ، تتجنب الصدفة عرض الأسطر الطويلة جدًا بالكامل (راجع الأدوات => الخيارات => الصدفة). هنا يمكنك التفاعل مع جزء النص الأصلي.لإلغاء التثبيت، احذف الملفات المتطابقة.للتحديث، قم بتثبيت الحزمة مرة أخرى.تم العثور على عدة أقراص '%s'. هل تريد اختيار واحد بنفسك؟الشاشة كاملةالدالةاستدعاء دالة في %sعامالكومةوضع الكومة قيد التشغيل. أغلق عرض الكومة لإيقاف تشغيلهالمساعدةمحتويات المساعدةإخفاء الملفات المخفيةتمييز السطر الحالي (يتطلب إعادة فتح المحرر)تمييز المتغيرات المحليةتمييز الأسماء المتطابقةتمييز الأقواستمييز عناصر التعليمة البرمجيةتمييز أحرف التابالرئيسيةالموقع الرسميالمعرفتثبيتOI خطإذا رمى الأمر الأخير استثناءً ، فسيُظهر هذا العرض تفاصيل الخطأ.إذا لم تتمكن من العثور عليه ، فقد تحتاج إلى تثبيت تعريف USB مناسب أولاً.إذا كنت لا تعرف من أين تحصل على الحزمة، إذا كنت لا تزال تريده ، فيرجى تثبيته من سطر الأوامر.زيادة حجم الخطإضافة مسافة بادئة للأسطر المحددةمسافة بادئة بأحرف جدولة (غير مستحسن لبايثون)فهرستثبيتPyPI التثبيت من خلالالتثبيت من ملف محليالتثبيت من ملف المتطلباتتثبيت أو إزالة البرنامج الثابتمثبت على:الإصدار المثبت:تثبيتتثبيت '%s'المفسرإيقاف التنفيذإلىالبقاء على نافذة الطرفية بعد انتهاء عملية البايثونالمفتاحمعرف المفتاحالمفسرات المعروفةاللغةأحدث اصدار مستقراحدث اصدارتحميلتحميلتحميل %sالمتغيرات المحليةالموقعالموقع: سجل أحداث استخدام البرنامجيبدو أنك تقوم بتثبيت حزمة متعلقة بثوني. إذا كنت تقصد تثبيت مكون إضافي من ثوني، فيجب عليك اختيار "أدوات... > إدارة الإضافات" بدلاً من ذلك. هل أنت متأكد من أنك تريد تثبيت %s بالخلفية؟يبدو أنك تحاول تثبيت إضافة لثوني لإصدار قديم (لم تحدد الإضافة إصدار ثوني المطلوب). إذا كنت لا تزال تريده ، فيرجى تثبيته من سطر الأوامر.صنع في جامعة تارتو ، إستونيا ، بمساعدة كل من مجتمع مفتوح المصدر ، ومؤسسة رسبري باي، وشركة Cybernetica ASتأكد بأن مايكروبايثون مثبت مسبقاً على micro:bit الخاص بكإدارة الحزم لـ %sإدارة الحزم...إدارة الإضافات...تكبير العرضأقصى طول لشظايا الخط قبل الضغطالحد الأقصى لعدد الأسطر للاحتفاظ بها.قد يجعل التنقيح أبطأ.مايكروبايثون (SSH)مايكروبايثون (عام)مايكروبايثون (محلي)جهاز مايكروبايثونتم التعديلالوحدةنقل إلى سلة المحذوفاتنقل إلى سلة المحذوفاتنقل %s إلى %sملاحظة! يجب تفعيل الإغلاق التلقائي في إعدادات الطرفية (ملفات التعريف > الصدفة > عند الخروج من الصدفة)ملاحظة! قد لا يعمل زر اختيار الملف بشكل صحيح عند تحديد الملفات القابلة للتنفيذ من بيئة افتراضية. في هذه الحالة ، اختر تفعيل السكربت بدلاً من المفسر (أو أدخل المسار مباشرة في مربع النص)!ملاحظة! قد تؤدي القيم الكبيرة إلى ضعف الأداء!ملاحظة! أعد تشغيل ثوني بعد تغيير هذه الخيارات!ملاحظة! بعض تنسيق العناصر يتغير فقط بعد إعادة تشغيل ثوني!ملاحظة! قد يكون هناك إصدار آخر متاح متوافق مع إصدار ثوني الحالي. انقر فوق الزر '...' لاختيار الإصدار المراد تثبيته.ملاحظة! ثوني يدعم فقط بايثون 3.5 وأعلىملاحظة! تحتاج إلى إعادة تشغيل ثوني بعد تثبيت / تحديث / إزالة لإضافة.ملاحظة! مايكروباثيون نشرت إصدار %s من هذه الحزمة وسوف تثبت تلقائياً.الاسمجديددليل جديدسيتم أيضًا تثبيت الحزم الجديدة في هذا الدليل. يجب أن تدار المواقع الأخرى بوسائل بديلة.سيتم تثبيت الحزم الجديدة علىالكائن التاليغير متوفرغير متصلغير مدعومملاحظاتلا شيء محددموافقمراقب الكائنافتح المساعد تلقائياً عندما يحتوي الكود الخاص بك على تحذيراتافتح المساعد تلقائيًا عند تعطل البرنامج مع استثناءفتح مجلد بيانات ثوني...فتح مجلد برنامج ثوني...فتح وإغلاق عرض المكدس تلقائياًافتح القيم المقيمة في مراقب الكائناتافتح من %sافتح في ثونيافتح في محرر نصوص ثونيافتح في تطبيق النظام الافتراضيفتح في مدير ملفات النظامفتح إعادة التشغيل ...افتح صدفة النظام...فتح...افتح عرض المكدس عند أول استدعاء وأغلقه عندما يعود البرنامج إلى الإطار الرئيسي.الخيارات...خارجالمخططالتالياستبدال المف؟استبدال السمة '%s'الحزمةالحزمة "{}" مطلوبة لتثبيت وإلغاء تثبيت الحزم الأخرى.PyPI الخزمة غير متوفرة في مايكروبايثون. سيتم تثبت إصدارة مدير الحزم غير متوفر لهذا المفسردليل الحزمكلمة المرورلصقالمسارMyPy تنفيذ فحوصاتPylint تنفيذ الفحوصات المحددة منيرجى التحقق من الإملاء!الرجاء الانتظارالتخطيطيصور المخطط سلسلة من الأرقام المطبوعة إلى الصدفة.منفذWebREPL أو منفذالمنقح المفضلتقديم Python REPL بعد انتهاء البرنامجمعاينةالكائن السابقطباعة...وسائط البرنامجوسائط البرنامج:شجرة البرنامجخصائصPyPI صفحةPygame نمط الصفربايثون قابل للتنفيذمفسرات البايثونالخروجهل تريد إلغاء التثبيت حقًا؟الملفات الحاليةالحد الأقصى لطول السطر الموصى به (اختر صفر لإزالة خط الهامش)تكرارتحديثالوضع العاديRemote Python 3 (SSH)إعادة تسمية...إعادة فتح جميع الملفات من الجلسة السابقةاستبدلاستبدال الكلاستبدال التاب بالمسافاتاستبدل بـ:ابحث+استبدلالإبلاغ عن مشكلةالمتطلباتيتطلب:استأنفتشغيلالتشغيل والتنقيحتشغيل / استأنفتشغيل السكربت الحاليتشغيل السكربت الحالي في موجه الأوامرالتشغيل إلى المؤشرتشغيل السكربت الحالي في الطرفيةحفظحفظ كافة الملفاتحفظ باسم...حفظ نسخة...حفظ كلمة المرورالحفظ في %sحفظالحفظ في %sمجالPyPI البحث في نتائج البحثيبحثراجع المساعدة لمزيد من التفاصيلتحديد الكلتحديد الكلاختر عنصر ومن ثم حاول مرة آخرىحدد مجلد فارغ لبيئة الافتراضية الجديدةاختيار مجلد موجود أو إنشاء مجلد جديد فارغحدد ما إذا كانت مربعات حوار الملفات ظهرت خلف النافذة الرئيسيةحدد المفسرالمجلد المحدد ليس فارغاً. حدد مجلد اخر أو الغاء العمليةإرسال EOF / إعادة تشغيل لينةالعناصر المظللة (غير قابلة للاستيراد):الصدفةعرض التخطيطعرض استدعاءات الدوال (الإطارات) في نوافذ منفصلةإظهار الملفات المخفيةعرض أرقام الأسطرالحجمالحجم (البايت)الكود المصدرينص مضغوط (%d حرف)مكدسابدأ بتحديد الحزمة من اليساريبدأعودة للخلفأدخلأخرجالتاليإيقافإيقاف/إعادة تشغيل بالخليفةمعلومات التخزينمساحة التخزينمساخة التخزين في هذا القرص أو نظام الملفاتموجزالتبديل إلى الوضع العاديسمة الصياغةموقع الجهاز المستهدفطراز الجهاز المستهدفالهدف:الطرفيةمحاكي الطرفيةالجواب هوهذه العملية قيد التشغيل. هل أنت متأكد برغبتك بالالغاء؟التمثيل أعلاه هو قيمة تقريبية لعدد العشري. القيمة الدقيقة المخزنة هي %s وهي حوالي %sنفس المفسر الذي يشغّل ثوني (افتراضي)لم يتم العثور على النص المحدد!السمات والخطوطهذه النافذة مخصصة لكتابة ملاحظاتك -- مثل تعليمات المعلم، مقتطفات أكواد، أي شي. سوف تحفظ وتعرض تلقائياً عندما تفتح برنامج ثوني مرة اخرى. يمكنك حذف هذا النص لتوفير مساحة لملاحئاتك.الكمبيوتر الحاليهذه النافذة مخصصة لإدارة المكونات الإضافية لثوني وتبعياتها. إذا كنت ترغب في تثبيت حزم لبرامجك الخاصة ، فاختر أدوات ← إدارة الحزم ...يسرد مربع الحوار هذا جميع الحزم المتاحة ، ولكنه يسمح بترقية وإلغاء تثبيت الحزم فقط منيسرد مربع الحوار هذا وحدات المستوى الأعلى من الأدلة التالية: هذا تعليقهذه الحزمة تتطلب إصدار آخر لثوني:لا يقدم البرنامج أي ضمان على الإطلاق! إنه برنامج حر،ونرحب بإعادة توزيعه بشروط معينة،لمزيد من التفاصيل راجع https://opensource.org/licenses/MIT تتم صيانة هذه البيئة الافتراضية تلقائياً من قبل ثوني.خيارات ثونيإضافات ثونيإضافة لثوني بدون متطلباتتبديل التعليقأدواتمحاولة اكتشاف المنفذ تلقائياًوضع واجهة المستخدمعامل تحجيم واجهة المستخدمسمة واجهة المستخدمقم بإلغاء تحديد إذا كنت تريد المزيد من التجربة التقليدية.إزالة التعليقتراجعإلغاء التثبيتإزالة '%s'متطلبات غير ملائمةلأعلىتحديثتحديث الاعتماديةتحديث أو إلغاء تثبيتتحديث '%s'رفع إلى %sرفع %s إلى %sاستخدم الأمر "إيقاف" اذا كنت ترغب بإلغاء التنقيحاستخدم مربع حوار الملفات لتي كي بدلاً من زينتيالقيمةمعرف القيمةالمتغيراتتاريخ الإصداراتالإصدار المراد تثبيتهعرضماذا تفعل بملف %s عند النقر فوقه نقرًا مزدوجًا في مستعرض ملفات ثوني؟ما المفسر أو الجهاز ترغب باستخدامه لتشغيل الكود الخاص بك؟مع المفسر الحالي يمكنك فقط استعراض الحزم هنا. استخدم "الأدوات > افتح صدفة النظام..." لتثبيت، أو تحديث، أو الغاء التثبيت.يعمل...التفاف النص (قد يكون بطيئاً)أنت تحتاج إلى إدخاليجب تحديد ملف!تحتاج إلى إيقاف برنامجك لتشغيل مدير الحزممفسرك غير موجود في القائمة؟تكبيركافة الملفاتالخ، الخالبايتالمساحة المتوفرةهناابحث عن اسم جهازك ، "USB Serial" أو "UART"لا يوجد دليل lib مطلق في sys.pathالرجاء الانتظارANSI دعم أنماط والالوان الأساسيةلتحديد موقع ملف الحزمة وتثبيته (عادةً بامتداد .whl أو .tar.gz أو .zip).إذا كنت لا تعرف من أين تحصل على الحزمة ، فغالبًا ما سترغب في البحث في فهرس حزمة البايثون. ابدأ بإدخال اسم الحزمة في مربع البحث أعلاه واضغط على ENTER.المساحة الكليةنص_غير_مغلقالمساحة المستخدمةموقع حزم المستخدمبيئة افتراضية././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/ar_AR/LC_MESSAGES/thonny.po0000664000175000017500000015444214276461532022101 0ustar00annamaaannamaamsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: ar\n" #: thonny/workbench.py:357 msgid "File" msgstr "ملف" #: thonny/workbench.py:358 msgid "Edit" msgstr "تحرير" #: thonny/workbench.py:359 msgid "View" msgstr "عرض" #: thonny/running.py:122 thonny/workbench.py:360 msgid "Run" msgstr "تشغيل" #: thonny/workbench.py:361 msgid "Tools" msgstr "أدوات" #: thonny/plugins/help/__init__.py:74 thonny/workbench.py:362 msgid "Help" msgstr "المساعدة" #: thonny/plugins/cpython/__init__.py:610 msgid "Alternative Python 3 interpreter or virtual environment" msgstr "مفسر بايثون بديل أو بيئة افتراضية" #: thonny/plugins/cpython/__init__.py:618 msgid "A special virtual environment (deprecated)" msgstr "بيئة افتراضية خاصة (مهملة)" #: thonny/workbench.py:582 msgid "Exit" msgstr "خروج" #: thonny/workbench.py:609 msgid "Decrease font size" msgstr "تقليص حجم الخط" #: thonny/workbench.py:621 msgid "Focus editor" msgstr "تنشيط المحرر" #: thonny/workbench.py:630 msgid "Focus shell" msgstr "تنشيط الصدفة" #: thonny/workbench.py:641 msgid "Maximize view" msgstr "تكبير العرض" #: thonny/workbench.py:653 msgid "Full screen" msgstr "الشاشة كاملة" #: thonny/workbench.py:1377 msgid "Program arguments" msgstr "وسائط البرنامج" #: thonny/plugins/about.py:28 thonny/plugins/about.py:163 msgid "About Thonny" msgstr "عن ثوني" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "صنع في جامعة تارتو ، إستونيا ، بمساعدة كل من مجتمع مفتوح المصدر ، ومؤسسة رسبري باي، وشركة\n" "Cybernetica AS" #: thonny/plugins/about.py:107 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "لا يقدم البرنامج أي ضمان على الإطلاق!\n" "إنه برنامج حر،ونرحب بإعادة توزيعه بشروط معينة،لمزيد من التفاصيل راجع\n" "https://opensource.org/licenses/MIT " #: thonny/plugins/about.py:152 msgid "Version history" msgstr "تاريخ الإصدارات" #: thonny/plugins/about.py:159 msgid "Report problems" msgstr "الإبلاغ عن مشكلة" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "افتح المساعد تلقائيًا عند تعطل البرنامج مع استثناء" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "افتح المساعد تلقائياً عندما يحتوي الكود الخاص بك على تحذيرات" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Pylint تنفيذ الفحوصات المحددة من" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "MyPy تنفيذ فحوصات" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "تعطيل الفحوصات (معرف واحد فقط لكل سطر)" #: thonny/assistance.py:968 thonny/plugins/assistant_config_page.py:73 msgid "Assistant" msgstr "المساعد" #: thonny/plugins/autocomplete.py:333 msgid "Auto-complete" msgstr "التكملة التلقائية" #: thonny/plugins/backend_config_page.py:84 msgid "Which interpreter or device should Thonny use for running your code?" msgstr "ما المفسر أو الجهاز ترغب باستخدامه لتشغيل الكود الخاص بك؟" #: thonny/plugins/backend_config_page.py:320 msgid "Interpreter" msgstr "المفسر" #: thonny/plugins/birdseye_frontend.py:54 msgid "About Birdseye" msgstr "Birdseye عن" #: thonny/plugins/birdseye_frontend.py:55 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye\n" "عبارة عن منقح للغة بايثون والذي يتطلب تثبيته بشكل منفصل.\n" "هل ترغب بفتح صفحة المساعدة لمزيد من التفاصيل؟" #: thonny/plugins/birdseye_frontend.py:83 msgid "Debug current script (birdseye)" msgstr "تنقيح السكربت الحالي (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "تبديل التعليق" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "تحويل إلى تعليق" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "إزالة التعليق" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "تراجع" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "تكرار" #: thonny/plugins/common_editing_commands.py:49 thonny/ui_utils.py:2176 msgid "Cut" msgstr "قص" #: thonny/plugins/common_editing_commands.py:61 thonny/ui_utils.py:2177 msgid "Copy" msgstr "نسخ" #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2178 msgid "Paste" msgstr "لصق" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "تحديد الكل" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1398 msgid "Run to cursor" msgstr "التشغيل إلى المؤشر" #: thonny/plugins/debugger.py:980 msgid "Can't close yet" msgstr "لا يمكن الإغلاق بعد" #: thonny/plugins/debugger.py:981 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "استخدم الأمر \"إيقاف\" اذا كنت ترغب بإلغاء التنقيح" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "إرساء نوافذ المستخدم" #: thonny/plugins/editor_config_page.py:15 msgid "Highlight matching names" msgstr "تمييز الأسماء المتطابقة" #: thonny/plugins/editor_config_page.py:21 msgid "Highlight local variables" msgstr "تمييز المتغيرات المحلية" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight parentheses" msgstr "تمييز الأقواس" #: thonny/plugins/editor_config_page.py:27 msgid "Highlight syntax elements" msgstr "تمييز عناصر التعليمة البرمجية" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight current line (requires reopening the editor)" msgstr "تمييز السطر الحالي (يتطلب إعادة فتح المحرر)" #: thonny/plugins/editor_config_page.py:36 msgid "Allow code completion with Tab-key in editors" msgstr "Tab السماح بالتكملة التلقائية في المحرر باستخدام مفتاح" #: thonny/plugins/editor_config_page.py:42 msgid "Allow code completion with Tab-key in Shell" msgstr "Tab السماح بالتكملة التلقائية في الصدفة باستخدام مفتاح" #: thonny/plugins/editor_config_page.py:51 msgid "Show line numbers" msgstr "عرض أرقام الأسطر" #: thonny/plugins/editor_config_page.py:54 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "الحد الأقصى لطول السطر الموصى به\n" "(اختر صفر لإزالة خط الهامش)" #: thonny/plugins/editor_config_page.py:75 msgid "Editor" msgstr "المحرر" #: thonny/plugins/event_logging.py:206 msgid "Export usage logs..." msgstr "تصدير سجلات الاستخدام" #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "الأحداث" #: thonny/plugins/files.py:551 msgid "Files" msgstr "الملفات" #: thonny/plugins/find_replace.py:57 thonny/plugins/find_replace.py:416 msgid "Find & Replace" msgstr "البحث والاستبدال" #: thonny/plugins/find_replace.py:63 msgid "Find:" msgstr "البحث:" #: thonny/plugins/find_replace.py:74 msgid "Replace with:" msgstr "استبدل بـ:" #: thonny/plugins/find_replace.py:92 msgid "Case sensitive" msgstr "حساسية حالة الأحرف" #: thonny/plugins/find_replace.py:99 msgid "Up" msgstr "لأعلى" #: thonny/plugins/find_replace.py:103 msgid "Down" msgstr "لأسفل" #: thonny/plugins/find_replace.py:112 msgid "Find" msgstr "ابحث" #: thonny/plugins/find_replace.py:122 msgid "Replace" msgstr "استبدل" #: thonny/plugins/find_replace.py:130 msgid "Replace+Find" msgstr "ابحث+استبدل" #: thonny/plugins/find_replace.py:140 msgid "Replace all" msgstr "استبدال الكل" #: thonny/plugins/find_replace.py:236 msgid "Enter string to be replaced." msgstr "أكتب النص المراد استبداله." #: thonny/plugins/find_replace.py:320 msgid "The specified text was not found!" msgstr "لم يتم العثور على النص المحدد!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "السماح بسخة واحدة فقط من ثوني" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "إعادة فتح جميع الملفات من الجلسة السابقة" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "تعطيل صوت التنبيه" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "وضع تحجيم الخط" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "وضع الكومة قيد التشغيل.\n" "أغلق عرض الكومة لإيقاف تشغيله" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "الكومة" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "اللغة" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "هذه النافذة مخصصة لكتابة ملاحظاتك -- مثل تعليمات المعلم، مقتطفات أكواد، أي شي.\n" "\n" "سوف تحفظ وتعرض تلقائياً عندما تفتح برنامج ثوني مرة اخرى.\n" "\n" "يمكنك حذف هذا النص لتوفير مساحة لملاحئاتك." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "ملاحظات" #: thonny/plugins/object_inspector.py:111 msgid "Previous object" msgstr "الكائن السابق" #: thonny/plugins/object_inspector.py:114 msgid "Next object" msgstr "الكائن التالي" #: thonny/plugins/object_inspector.py:704 msgid "Object inspector" msgstr "مراقب الكائن" #: thonny/plugins/outline.py:138 msgid "Outline" msgstr "المخطط" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame نمط الصفر" #: thonny/plugins/pip_gui.py:78 msgid "Find package from PyPI" msgstr "البحث عن حزمة في PyPI" #: thonny/plugins/pip_gui.py:76 msgid "Uninstall" msgstr "إلغاء التثبيت" #: thonny/editors.py:587 thonny/plugins/pip_gui.py:228 thonny/ui_utils.py:448 #: thonny/ui_utils.py:1755 thonny/workdlg.py:155 msgid "Close" msgstr "إغلاق" #: thonny/plugins/pip_gui.py:347 msgid "Click " msgstr "إضغط على " #: thonny/plugins/pip_gui.py:348 thonny/plugins/pip_gui.py:382 msgid "here" msgstr "هنا" #: thonny/plugins/pip_gui.py:73 msgid "Upgrade" msgstr "تحديث" #: thonny/plugins/esp/__init__.py:365 #: thonny/plugins/micropython/uf2dialog.py:94 thonny/plugins/pip_gui.py:70 msgid "Install" msgstr "تثبيت" #: thonny/plugins/pip_gui.py:491 msgid "Could not find the package from PyPI." msgstr "تعذر العثور على الحزمة من PyPI." #: thonny/plugins/pip_gui.py:511 msgid "Latest stable version" msgstr "أحدث اصدار مستقر" #: thonny/plugins/pip_gui.py:513 msgid "Latest version" msgstr "احدث اصدار" #: thonny/plugins/pip_gui.py:514 msgid "Summary" msgstr "موجز" #: thonny/plugins/pip_gui.py:515 msgid "Author" msgstr "المؤلف" #: thonny/plugins/pip_gui.py:516 msgid "Homepage" msgstr "الموقع الرسمي" #: thonny/plugins/pip_gui.py:518 msgid "Bugtracker" msgstr "تعقب الاخطاء" #: thonny/plugins/pip_gui.py:520 msgid "Documentation" msgstr "التوثيق" #: thonny/plugins/pip_gui.py:522 msgid "PyPI page" msgstr "PyPI صفحة" #: thonny/plugins/pip_gui.py:526 msgid "Requires" msgstr "المتطلبات" #: thonny/plugins/pip_gui.py:652 msgid "Really uninstall?" msgstr "هل تريد إلغاء التثبيت حقًا؟" #: thonny/plugins/pip_gui.py:657 msgid "Are you sure you want to uninstall it?" msgstr "هل أنت متأكد أنك تريد إلغاء تثبيته؟" #: thonny/plugins/variables.py:19 msgid "Back to\n" "current frame" msgstr "العودة إلى\n" "الإطار الحالي" #: thonny/plugins/variables.py:73 thonny/plugins/variables.py:75 #: thonny/plugins/variables.py:138 msgid "Variables" msgstr "المتغيرات" #: thonny/base_file_browser.py:1313 msgid "This computer" msgstr "الكمبيوتر الحالي" #: thonny/base_file_browser.py:618 msgid "Refresh" msgstr "تحديث" #: thonny/base_file_browser.py:631 msgid "Focus into" msgstr "ركز على" #: thonny/base_file_browser.py:1164 msgid "Error" msgstr "خطأ" #: thonny/base_file_browser.py:1164 msgid "You need to select a file!" msgstr "يجب تحديد ملف!" #: thonny/base_file_browser.py:1168 msgid "Overwrite?" msgstr "استبدال المف؟" #: thonny/base_file_browser.py:1168 msgid "Do you want to overwrite '%s' ?" msgstr "هل ترغب باستبدال الملف '%s'?" #: thonny/editors.py:552 thonny/editors.py:554 msgid "New" msgstr "جديد" #: thonny/editors.py:565 msgid "Open..." msgstr "فتح..." #: thonny/editors.py:567 msgid "Load" msgstr "تحميل" #: thonny/editors.py:576 msgid "Recent files" msgstr "الملفات الحالية" #: thonny/editors.py:598 thonny/ui_utils.py:450 msgid "Close all" msgstr "إغلاق الكل" #: thonny/editors.py:608 thonny/editors.py:610 msgid "Save" msgstr "حفظ" #: thonny/editors.py:633 msgid "Save as..." msgstr "حفظ باسم..." #: thonny/editors.py:644 msgid "Save copy..." msgstr "حفظ نسخة..." #: thonny/editors.py:653 msgid "Rename..." msgstr "إعادة تسمية..." #: thonny/config_ui.py:19 msgid "Thonny options" msgstr "خيارات ثوني" #: thonny/running.py:121 msgid "Run current script" msgstr "تشغيل السكربت الحالي" #: thonny/running.py:152 msgid "Run current script in terminal" msgstr "تشغيل السكربت الحالي في موجه الأوامر" #: thonny/running.py:165 msgid "Stop/Restart backend" msgstr "إيقاف/إعادة تشغيل بالخليفة" #: thonny/running.py:166 msgid "Stop" msgstr "إيقاف" #: thonny/running.py:177 msgid "Interrupt execution" msgstr "إيقاف التنفيذ" #: thonny/running.py:190 msgid "Send EOF / Soft reboot" msgstr "إرسال EOF / إعادة تشغيل لينة" #: thonny/running.py:201 msgid "Disconnect" msgstr "قطع الاتصال" #: thonny/running_config_page.py:23 msgid "Known interpreters" msgstr "المفسرات المعروفة" #: thonny/running_config_page.py:36 msgid "Your interpreter isn't in the list?" msgstr "مفسرك غير موجود في القائمة؟" #: thonny/plugins/cpython/__init__.py:391 msgid "NB! Thonny only supports Python 3.5 and later" msgstr "ملاحظة! ثوني يدعم فقط بايثون 3.5 وأعلى" #: thonny/running_config_page.py:56 msgid "Create new virtual environment" msgstr "إنشاء بيئة افتراضية جديدة" #: thonny/running_config_page.py:59 msgid "Select existing or create a new empty directory" msgstr "اختيار مجلد موجود أو إنشاء مجلد جديد فارغ" #: thonny/plugins/cpython/__init__.py:419 msgid "Python interpreters" msgstr "مفسرات البايثون" #: thonny/plugins/cpython/__init__.py:420 thonny/plugins/pip_gui.py:696 #: thonny/plugins/pip_gui.py:709 msgid "all files" msgstr "كافة الملفات" #: thonny/plugins/cpython/__init__.py:442 msgid "Select empty directory for new virtual environment" msgstr "حدد مجلد فارغ لبيئة الافتراضية الجديدة" #: thonny/plugins/cpython/__init__.py:449 msgid "Bad directory" msgstr "مجلد غير صالح" #: thonny/plugins/cpython/__init__.py:450 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "المجلد المحدد ليس فارغاً.\n" "حدد مجلد اخر أو الغاء العملية" #: thonny/plugins/cpython/__init__.py:467 msgid "Creating virtual environment" msgstr "قيد إنشاء بيئة افتراضية" #: thonny/shell.py:83 msgid "Clear shell" msgstr "مسح الصدفة" #: thonny/shell.py:138 msgid "Plotter" msgstr "التخطيط" #: thonny/shell.py:269 msgid "Clear" msgstr "مسح" #: thonny/shell.py:282 msgid "Show Plotter" msgstr "عرض التخطيط" #: thonny/shell.py:1572 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "لأسباب تتعلق بالأداء ، تتجنب الصدفة عرض الأسطر الطويلة جدًا بالكامل (راجع الأدوات => الخيارات => الصدفة).\n" "هنا يمكنك التفاعل مع جزء النص الأصلي." #: thonny/shell.py:1583 msgid "Wrap text (may be slow)" msgstr "التفاف النص (قد يكون بطيئاً)" #: thonny/ui_utils.py:1750 msgid "Copy to clipboard" msgstr "النسخ إلى الحافظة" #: thonny/shell.py:1431 msgid "Expand in Shell" msgstr "توسع في الصدفة" #: thonny/shell.py:1625 msgid "Squeezed text (%d characters)" msgstr "نص مضغوط (%d حرف)" #: thonny/shell.py:1794 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "يصور المخطط سلسلة من الأرقام المطبوعة إلى الصدفة." #: thonny/shell.py:1796 msgid "See Help for details." msgstr "راجع المساعدة لمزيد من التفاصيل" #: thonny/ui_utils.py:449 msgid "Close others" msgstr "إغلاق نوافذ التبويب الاخرى" #: thonny/ui_utils.py:1606 msgid "Copying" msgstr "ينسخ" #: thonny/ui_utils.py:1609 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "ينسخ\n" "%s\n" "إلى\n" "%s" #: thonny/base_file_browser.py:1133 thonny/config_ui.py:36 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:273 thonny/plugins/pip_gui.py:1146 #: thonny/ui_utils.py:114 thonny/ui_utils.py:1617 thonny/ui_utils.py:1702 #: thonny/workdlg.py:157 thonny/workdlg.py:201 msgid "Cancel" msgstr "الغاء" #: thonny/base_file_browser.py:1130 thonny/config_ui.py:35 thonny/export.py:25 #: thonny/plugins/about.py:120 thonny/plugins/backend_config_page.py:268 #: thonny/ui_utils.py:111 thonny/ui_utils.py:1699 thonny/workdlg.py:198 msgid "OK" msgstr "موافق" #: thonny/ui_utils.py:1783 msgid "Cancel the process?" msgstr "الغاء العملية؟" #: thonny/ui_utils.py:1784 msgid "The process is still running.\n" "Are you sure you want to cancel?" msgstr "هذه العملية قيد التشغيل.\n" "هل أنت متأكد برغبتك بالالغاء؟" #: thonny/ui_utils.py:2182 msgid "Select All" msgstr "تحديد الكل" #: thonny/plugins/shell_config_page.py:73 thonny/workbench.py:158 msgid "Shell" msgstr "الصدفة" #: thonny/plugins/cpython/__init__.py:602 msgid "The same interpreter which runs Thonny (default)" msgstr "نفس المفسر الذي يشغّل ثوني (افتراضي)" #: thonny/plugins/cpython/__init__.py:350 msgid "This virtual environment is automatically maintained by Thonny.\n" "" msgstr "تتم صيانة هذه البيئة الافتراضية تلقائياً من قبل ثوني." #: thonny/plugins/cpython/__init__.py:351 msgid "Location: " msgstr "الموقع: " #: thonny/workbench.py:592 msgid "Options..." msgstr "الخيارات..." #: thonny/workbench.py:599 msgid "Increase font size" msgstr "زيادة حجم الخط" #: thonny/workbench.py:664 msgid "Change font size" msgstr "تغيير حجم الخط" #: thonny/workbench.py:665 msgid "Zoom" msgstr "تكبير" #: thonny/workbench.py:674 msgid "Exit Thonny" msgstr "إغلاق ثوني" #: thonny/workbench.py:677 msgid "Quit" msgstr "الخروج" #: thonny/workbench.py:1181 thonny/workbench.py:1189 msgid "Overwriting theme '%s'" msgstr "استبدال السمة '%s'" #: thonny/workbench.py:1348 msgid "Program arguments:" msgstr "وسائط البرنامج:" #: thonny/workbench.py:1402 msgid "Regular mode" msgstr "الوضع العادي" #: thonny/workbench.py:1403 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "تم تحديث الإعدادات. أعد تشغيل ثوني لبدء العمل في الوضع العادي.\n" "\n" "(راجع \"أدوات ← خيارات ← عام\" إذا غيرت رأيك لاحقًا.)" #: thonny/plugins/ast_view.py:210 msgid "Program tree" msgstr "شجرة البرنامج" #: thonny/plugins/backend_config_page.py:323 msgid "Select interpreter" msgstr "حدد المفسر" #: thonny/plugins/debugger.py:1280 msgid "Resume" msgstr "استأنف" #: thonny/plugins/debugger.py:1296 msgid "Run / resume" msgstr "تشغيل / استأنف" #: thonny/plugins/debugger.py:1311 msgid "Debug current script" msgstr "تنقيح السكربت الحالي" #: thonny/plugins/debugger.py:1313 msgid "Debug" msgstr "التنقيح" #: thonny/plugins/debugger.py:1324 msgid "Debug current script (nicer)" msgstr "تنقيح السكربت الحالي (الطف)" #: thonny/plugins/debugger.py:1336 msgid "Debug current script (faster)" msgstr "تنقيح السكربت الحالي (أسرع)" #: thonny/plugins/debugger.py:1347 msgid "Step over" msgstr "التالي" #: thonny/plugins/debugger.py:1349 msgid "Over" msgstr "التالي" #: thonny/plugins/debugger.py:1360 msgid "Step into" msgstr "أدخل" #: thonny/plugins/debugger.py:1362 msgid "Into" msgstr "إلى" #: thonny/plugins/debugger.py:1373 msgid "Step out" msgstr "أخرج" #: thonny/plugins/debugger.py:1375 msgid "Out" msgstr "خارج" #: thonny/plugins/debugger.py:1410 msgid "Step back" msgstr "عودة للخلف" #: thonny/plugins/debugger.py:1412 msgid "Back" msgstr "عودة" #: thonny/plugins/debugger.py:1418 msgid "Stack" msgstr "مكدس" #: thonny/plugins/debugger.py:1419 msgid "Exception" msgstr "استثناء" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "سجل أحداث استخدام البرنامج" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "وضع التنقيح (يوفر سجلات تشخيص أكثر تفصيلاً)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "وضع واجهة المستخدم" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "عامل تحجيم واجهة المستخدم" #: thonny/plugins/general_config_page.py:108 msgid "NB! Restart Thonny after changing these options!" msgstr "ملاحظة! أعد تشغيل ثوني بعد تغيير هذه الخيارات!" #: thonny/plugins/general_config_page.py:129 msgid "General" msgstr "عام" #: thonny/plugins/pip_gui.py:129 msgid "INSTALL" msgstr "تثبيت" #: thonny/plugins/pip_gui.py:365 msgid "Browse the packages" msgstr "استعراض الحزم" #: thonny/plugins/pip_gui.py:368 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "مع المفسر الحالي يمكنك فقط استعراض الحزم هنا.\n" "استخدم \"الأدوات > افتح صدفة النظام...\" لتثبيت، أو تحديث، أو الغاء التثبيت." #: thonny/plugins/pip_gui.py:376 msgid "Packages' directory" msgstr "دليل الحزم" #: thonny/plugins/pip_gui.py:333 msgid "Install from PyPI" msgstr "PyPI التثبيت من خلال" #: thonny/plugins/pip_gui.py:336 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "إذا كنت لا تعرف من أين تحصل على الحزمة، " #: thonny/plugins/pip_gui.py:352 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "إذا كنت لا تعرف من أين تحصل على الحزمة ، فغالبًا ما سترغب في البحث في فهرس حزمة البايثون. ابدأ بإدخال اسم الحزمة في مربع البحث أعلاه واضغط على ENTER." #: thonny/plugins/pip_gui.py:381 msgid "Click" msgstr "إضغط" #: thonny/plugins/pip_gui.py:386 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "لتحديد موقع ملف الحزمة وتثبيته (عادةً بامتداد .whl أو .tar.gz أو .zip)." #: thonny/plugins/micropython/pip_gui.py:243 thonny/plugins/pip_gui.py:393 msgid "Upgrade or uninstall" msgstr "تحديث أو إلغاء تثبيت" #: thonny/plugins/pip_gui.py:395 msgid "Start by selecting the package from the left." msgstr "ابدأ بتحديد الحزمة من اليسار" #: thonny/plugins/pip_gui.py:399 msgid "Target:" msgstr "الهدف:" #: thonny/plugins/pip_gui.py:401 msgid "virtual environment" msgstr "بيئة افتراضية" #: thonny/plugins/pip_gui.py:403 msgid "user site packages" msgstr "موقع حزم المستخدم" #: thonny/plugins/pip_gui.py:407 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "يسرد مربع الحوار هذا جميع الحزم المتاحة ، ولكنه يسمح بترقية وإلغاء تثبيت الحزم فقط من" #: thonny/plugins/pip_gui.py:417 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "سيتم أيضًا تثبيت الحزم الجديدة في هذا الدليل. يجب أن تدار المواقع الأخرى بوسائل بديلة." #: thonny/plugins/pip_gui.py:441 msgid "Installed version:" msgstr "الإصدار المثبت:" #: thonny/plugins/micropython/pip_gui.py:147 thonny/plugins/pip_gui.py:443 msgid "Installed to:" msgstr "مثبت على:" #: thonny/plugins/pip_gui.py:494 msgid "Please check your spelling!" msgstr "يرجى التحقق من الإملاء!" #: thonny/plugins/pip_gui.py:512 msgid "You need to enter" msgstr "أنت تحتاج إلى إدخال" #: thonny/plugins/pip_gui.py:498 msgid "Could not find the package info from PyPI." msgstr "PyPI تعذر العثور على معلومات الحزمة من" #: thonny/plugins/pip_gui.py:500 thonny/plugins/pip_gui.py:1200 msgid "Error code:" msgstr "رمز الخطأ:" #: thonny/plugins/pip_gui.py:601 msgid "Can't find package name from the list:" msgstr "لا يمكن العثور على اسم الحزمة من القائمة:" #: thonny/plugins/pip_gui.py:653 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "الحزمة \"{}\" مطلوبة لتثبيت وإلغاء تثبيت الحزم الأخرى." #: thonny/plugins/pip_gui.py:696 msgid "Package" msgstr "الحزمة" #: thonny/plugins/pip_gui.py:796 msgid "Manage packages for %s" msgstr "إدارة الحزم لـ %s" #: thonny/plugins/pip_gui.py:872 msgid "Confirmation" msgstr "تأكيد" #: thonny/plugins/pip_gui.py:873 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "يبدو أنك تقوم بتثبيت حزمة متعلقة بثوني.\n" "إذا كنت تقصد تثبيت مكون إضافي من ثوني، فيجب عليك اختيار \"أدوات... > إدارة الإضافات\" بدلاً من ذلك.\n" "\n" "هل أنت متأكد من أنك تريد تثبيت %s بالخلفية؟" #: thonny/plugins/pip_gui.py:981 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "ملاحظة! قد يكون هناك إصدار آخر متاح متوافق مع إصدار ثوني الحالي. انقر فوق الزر '...' لاختيار الإصدار المراد تثبيته." #: thonny/plugins/pip_gui.py:989 msgid "Thonny plugin without requirements" msgstr "إضافة لثوني بدون متطلبات" #: thonny/plugins/pip_gui.py:990 msgid "Looks like you are trying to install an outdated Thonny\n" "plug-in (it doesn't specify required Thonny version).\n" "\n" "If you still want it, then please install it from the command line." msgstr "يبدو أنك تحاول تثبيت إضافة لثوني لإصدار قديم (لم تحدد الإضافة إصدار ثوني المطلوب).\n" "\n" "إذا كنت لا تزال تريده ، فيرجى تثبيته من سطر الأوامر." #: thonny/plugins/pip_gui.py:1004 msgid "Unsuitable requirements" msgstr "متطلبات غير ملائمة" #: thonny/plugins/pip_gui.py:1005 msgid "This package requires different Thonny version:" msgstr "هذه الحزمة تتطلب إصدار آخر لثوني:" #: thonny/plugins/pip_gui.py:1009 msgid "If you still want it, then please install it from the command line." msgstr "إذا كنت لا تزال تريده ، فيرجى تثبيته من سطر الأوامر." #: thonny/plugins/pip_gui.py:1052 msgid "(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)" msgstr "(في هذه الحالة ، تستخدم الواجهة الخلفية لثوني نفس المفسر، لذا فإن كلا الحوارات يديران نفس الحزم.)" #: thonny/plugins/pip_gui.py:1058 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "ملاحظة! تحتاج إلى إعادة تشغيل ثوني بعد تثبيت / تحديث / إزالة لإضافة." #: thonny/plugins/pip_gui.py:1068 msgid "Thonny plug-ins" msgstr "إضافات ثوني" #: thonny/plugins/pip_gui.py:1090 msgid "Advanced install / upgrade / downgrade" msgstr "التثبيت المتقدم / التحديث / الرجوع إلى إصدار أقدم" #: thonny/plugins/pip_gui.py:1099 msgid "Desired version" msgstr "الإصدار المطلوب" #: thonny/plugins/pip_gui.py:1137 msgid "Upgrade dependencies" msgstr "تحديث الاعتمادية" #: thonny/plugins/pip_gui.py:1198 msgid "Requires:" msgstr "يتطلب:" #: thonny/plugins/pip_gui.py:1202 msgid "Error:" msgstr "خطأ:" #: thonny/plugins/pip_gui.py:1409 msgid "Manage packages..." msgstr "إدارة الحزم..." #: thonny/plugins/pip_gui.py:1415 msgid "Manage plug-ins..." msgstr "إدارة الإضافات..." #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "فتح إعادة التشغيل ..." #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "تغيير دليل العمل الحالي إلى دليل السكربت على التشغيل / التنقيح" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "عرض استدعاءات الدوال (الإطارات) في نوافذ منفصلة" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "قم بإلغاء تحديد إذا كنت تريد المزيد من التجربة التقليدية." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "فتح وإغلاق عرض المكدس تلقائياً" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "افتح عرض المكدس عند أول استدعاء وأغلقه عندما يعود البرنامج إلى الإطار الرئيسي." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "السماح بالدخول إلى المكتبات (على سبيل المثال ، خارج دليل السكربت الرئيسي)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "قد يجعل التنقيح أبطأ." #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "المنقح المفضل" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(يستخدم عند النقر زر شريط أدوات التنقيح)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Birdseye منفذ" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(إعادة تشغيل ثوني بعد تعديل هذه)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "التشغيل والتنقيح" #: thonny/plugins/shell_config_page.py:17 msgid "Terminal emulation" msgstr "محاكي الطرفية" #: thonny/plugins/shell_config_page.py:19 msgid "supports basic ANSI-colors and styles" msgstr "ANSI دعم أنماط والالوان الأساسية" #: thonny/plugins/shell_config_page.py:31 msgid "Maximum number of lines to keep." msgstr "الحد الأقصى لعدد الأسطر للاحتفاظ بها." #: thonny/plugins/shell_config_page.py:33 msgid "NB! Large values may cause poor performance!" msgstr "ملاحظة! قد تؤدي القيم الكبيرة إلى ضعف الأداء!" #: thonny/plugins/shell_config_page.py:49 msgid "Maximum length of line fragments before squeezing" msgstr "أقصى طول لشظايا الخط قبل الضغط" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "تشغيل السكربت الحالي في الطرفية" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "تقديم Python REPL بعد انتهاء البرنامج" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "البقاء على نافذة الطرفية بعد انتهاء عملية البايثون" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "ملاحظة! يجب تفعيل الإغلاق التلقائي في إعدادات الطرفية\n" "(ملفات التعريف > الصدفة > عند الخروج من الصدفة)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "الطرفية" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "سمة واجهة المستخدم" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "سمة الصياغة" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "خط المحرر" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "OI خط" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "معاينة" #: thonny/plugins/theme_and_font_config_page.py:145 msgid "This is a comment" msgstr "هذا تعليق" #: thonny/plugins/theme_and_font_config_page.py:148 msgid "The answer is" msgstr "الجواب هو" #: thonny/plugins/theme_and_font_config_page.py:152 msgid "unclosed_string" msgstr "نص_غير_مغلق" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "blah, blah" msgstr "الخ، الخ" #: thonny/plugins/theme_and_font_config_page.py:177 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "ملاحظة! بعض تنسيق العناصر يتغير فقط بعد إعادة تشغيل ثوني!" #: thonny/plugins/theme_and_font_config_page.py:216 msgid "Enter an integer" msgstr "إدخل عدد صحيح" #: thonny/plugins/theme_and_font_config_page.py:229 msgid "Theme & Font" msgstr "السمات والخطوط" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "فتح مجلد برنامج ثوني..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "فتح مجلد بيانات ثوني..." #: thonny/plugins/help/__init__.py:64 msgid "Home" msgstr "الرئيسية" #: thonny/plugins/help/__init__.py:75 msgid "Help contents" msgstr "محتويات المساعدة" #: thonny/plugins/micropython/__init__.py:274 msgid "CircuitPython device" msgstr "CircuitPython جهاز " #: thonny/plugins/micropython/__init__.py:278 msgid "MicroPython device" msgstr "جهاز مايكروبايثون" #: thonny/plugins/micropython/__init__.py:476 msgid "Connect your device to the computer and select corresponding port below" msgstr "Connect your device to the computer and select corresponding port below" #: thonny/plugins/micropython/__init__.py:479 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "ابحث عن اسم جهازك ، \"USB Serial\" أو \"UART\"" #: thonny/plugins/micropython/__init__.py:481 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "إذا لم تتمكن من العثور عليه ، فقد تحتاج إلى تثبيت تعريف USB مناسب أولاً." #: thonny/plugins/micropython/__init__.py:401 msgid "Port" msgstr "منفذ" #: thonny/plugins/micropython/__init__.py:411 msgid "Try to detect port automatically" msgstr "محاولة اكتشاف المنفذ تلقائياً" #: thonny/plugins/micropython/__init__.py:954 msgid "MicroPython (generic)" msgstr "مايكروبايثون (عام)" #: thonny/plugins/printing/__init__.py:82 msgid "Print..." msgstr "طباعة..." #: thonny/plugins/system_shell/__init__.py:59 msgid "Open system shell..." msgstr "افتح صدفة النظام..." #: thonny/plugins/backend_config_page.py:103 msgid "Details" msgstr "التفاصيل" #: thonny/plugins/pip_gui.py:345 msgid "Install from requirements file" msgstr "التثبيت من ملف المتطلبات" #: thonny/plugins/pip_gui.py:380 msgid "Install from local file" msgstr "التثبيت من ملف محلي" #: thonny/plugins/pip_gui.py:1038 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "هذه النافذة مخصصة لإدارة المكونات الإضافية لثوني وتبعياتها.\n" "إذا كنت ترغب في تثبيت حزم لبرامجك الخاصة ، فاختر أدوات ← إدارة الحزم ..." #: thonny/plugins/circuitpython/__init__.py:163 msgid "CircuitPython (generic)" msgstr "سيركت بايثون (عام)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "إضافة مسافة بادئة للأسطر المحددة" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "إزالة مسافة بادئة للأسطر المحددة" #: thonny/workbench.py:1391 msgid "Switch to\n" "regular\n" "mode" msgstr "التبديل إلى\n" "الوضع\n" "العادي" #: thonny/plugins/microbit/__init__.py:55 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "تأكد بأن مايكروبايثون مثبت مسبقاً على micro:bit الخاص بك" #: thonny/plugins/microbit/__init__.py:57 msgid "Don't forget that main.py only works without embedded main script." msgstr "لا تنس أن main.py يعمل فقط بدون السكربت الرئيسي المضمن." #: thonny/plugins/micropython/uf2dialog.py:45 msgid "please wait" msgstr "الرجاء الانتظار" #: thonny/plugins/microbit/__init__.py:199 msgid "Done!" msgstr "انتهى!" #: thonny/plugins/micropython/__init__.py:298 msgid "Firmware" msgstr "برنامج ثابت" #: thonny/misc_utils.py:134 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "لم نتمكن من إيجاد القرص '%s'. هل ترغب بتحديده بنفسك؟" #: thonny/misc_utils.py:137 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "تم العثور على عدة أقراص '%s'. هل تريد اختيار واحد بنفسك؟" #: thonny/misc_utils.py:153 msgid "Can't find suitable disk" msgstr "لا يمكن العثور على القرص المناسب" #: thonny/base_file_browser.py:273 msgid "%d items" msgstr "%d عنصر" #: thonny/base_file_browser.py:692 msgid "Move to Recycle Bin" msgstr "نقل إلى سلة المحذوفات" #: thonny/base_file_browser.py:694 msgid "Move to Trash" msgstr "نقل إلى سلة المحذوفات" #: thonny/base_file_browser.py:697 msgid "Delete" msgstr "حذف" #: thonny/base_file_browser.py:700 thonny/base_file_browser.py:834 msgid "New directory" msgstr "دليل جديد" #: thonny/base_file_browser.py:703 msgid "Properties" msgstr "خصائص" #: thonny/base_file_browser.py:705 msgid "Storage space" msgstr "مساحة التخزين" #: thonny/base_file_browser.py:715 msgid "Path" msgstr "المسار" #: thonny/base_file_browser.py:717 msgid "Directory properties" msgstr "خصائص الدليل" #: thonny/base_file_browser.py:719 msgid "File properties" msgstr "خصائص الملف" #: thonny/base_file_browser.py:721 msgid "bytes" msgstr "البايت" #: thonny/base_file_browser.py:724 msgid "Size" msgstr "الحجم" #: thonny/base_file_browser.py:83 thonny/base_file_browser.py:735 msgid "Modified" msgstr "تم التعديل" #: thonny/base_file_browser.py:794 msgid "Deleting %s" msgstr "حذف %s" #: thonny/base_file_browser.py:817 msgid "Moving %s to %s" msgstr "نقل %s إلى %s" #: thonny/editors.py:219 msgid "Loading" msgstr "تحميل" #: thonny/editors.py:335 msgid "Saving" msgstr "حفظ" #: thonny/running.py:1408 msgid "Working..." msgstr "يعمل..." #: thonny/plugins/files.py:199 msgid "Uploading %s to %s" msgstr "رفع %s إلى %s" #: thonny/plugins/files.py:216 msgid "Upload to %s" msgstr "رفع إلى %s" #: thonny/plugins/files.py:362 msgid "Downloading %s to %s" msgstr "تنزيل %s إلى %s" #: thonny/plugins/files.py:275 msgid "Download to %s" msgstr "التنزيل إلى %s" #: thonny/base_file_browser.py:620 msgid "Open in system file manager" msgstr "فتح في مدير ملفات النظام" #: thonny/base_file_browser.py:625 msgid "Hide hidden files" msgstr "إخفاء الملفات المخفية" #: thonny/base_file_browser.py:625 msgid "Show hidden files" msgstr "إظهار الملفات المخفية" #: thonny/base_file_browser.py:635 msgid "Open in Thonny" msgstr "افتح في ثوني" #: thonny/base_file_browser.py:640 thonny/base_file_browser.py:661 msgid "Open in system default app" msgstr "افتح في تطبيق النظام الافتراضي" #: thonny/base_file_browser.py:647 thonny/base_file_browser.py:669 msgid "Configure %s files" msgstr "إعداد ملفات %s" #: thonny/base_file_browser.py:670 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "ماذا تفعل بملف %s عند النقر فوقه نقرًا مزدوجًا في مستعرض ملفات ثوني؟" #: thonny/base_file_browser.py:1042 thonny/plugins/micropython/pip_gui.py:77 msgid "Deleting" msgstr "حذف" #: thonny/base_file_browser.py:1049 msgid "Creating directory" msgstr "إنشاء دليل" #: thonny/editors.py:217 msgid "Loading %s" msgstr "تحميل %s" #: thonny/editors.py:333 msgid "Saving to %s" msgstr "الحفظ في %s" #: thonny/editors.py:622 thonny/editors.py:624 msgid "Save All files" msgstr "حفظ كافة الملفات" #: thonny/workbench.py:828 msgid "Configure interpreter..." msgstr "إعداد المفسر" #: thonny/workbench.py:1501 msgid "Device" msgstr "جهاز" #: thonny/workdlg.py:185 msgid "Cancelling" msgstr "إلغاء" #: thonny/workdlg.py:212 msgid "Starting" msgstr "يبدأ" #: thonny/plugins/backend_config_page.py:234 msgid "Authentication" msgstr "المصادقة" #: thonny/plugins/backend_config_page.py:236 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "أدخل عبارة مرور مفتاحك الخاص لـ\n" "{}" #: thonny/plugins/backend_config_page.py:239 msgid "Enter your password for\n" "{}" msgstr "أدخل كلمة المرور الخاصة بك لـ\n" "{}" #: thonny/plugins/object_inspector.py:458 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "التمثيل أعلاه هو قيمة تقريبية لعدد العشري. القيمة الدقيقة المخزنة هي %s وهي حوالي %s" #: thonny/plugins/pip_gui.py:557 msgid "Search results" msgstr "نتائج البحث" #: thonny/plugins/pip_gui.py:558 msgid "Searching" msgstr "يبحث" #: thonny/plugins/pip_gui.py:639 thonny/plugins/pip_gui.py:729 msgid "Installing '%s'" msgstr "تثبيت '%s'" #: thonny/plugins/pip_gui.py:645 msgid "Upgrading '%s'" msgstr "تحديث '%s'" #: thonny/plugins/pip_gui.py:650 msgid "Uninstalling '%s'" msgstr "إزالة '%s'" #: thonny/plugins/pip_gui.py:663 msgid "Installing" msgstr "تثبيت" #: thonny/plugins/pip_gui.py:1372 msgid "Package manager is not available for this interpreter" msgstr "مدير الحزم غير متوفر لهذا المفسر" #: thonny/plugins/pip_gui.py:1385 msgid "Not supported" msgstr "غير مدعوم" #: thonny/plugins/micropython/pip_gui.py:290 thonny/plugins/pip_gui.py:1390 msgid "Not available" msgstr "غير متوفر" #: thonny/plugins/pip_gui.py:1391 msgid "You need to stop your program before launching the package manager." msgstr "تحتاج إلى إيقاف برنامجك لتشغيل مدير الحزم" #: thonny/plugins/shell_config_page.py:64 msgid "Open evaluated values in Object inspector" msgstr "افتح القيم المقيمة في مراقب الكائنات" #: thonny/plugins/cpython/__init__.py:370 msgid "Python executable" msgstr "بايثون قابل للتنفيذ" #: thonny/plugins/cpython/__init__.py:393 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "ملاحظة! قد لا يعمل زر اختيار الملف بشكل صحيح عند تحديد الملفات القابلة للتنفيذ من بيئة افتراضية. في هذه الحالة ، اختر تفعيل السكربت بدلاً من المفسر (أو أدخل المسار مباشرة في مربع النص)!" #: thonny/plugins/cpython_ssh/__init__.py:153 msgid "Remote Python 3 (SSH)" msgstr "Remote Python 3 (SSH)" #: thonny/plugins/micropython/__init__.py:284 msgid "Not connected" msgstr "غير متصل" #: thonny/plugins/micropython/__init__.py:453 msgid "Advanced options" msgstr "خيارات متقدمة" #: thonny/plugins/micropython/__init__.py:460 msgid "Install or update firmware" msgstr "تثبيت أو إزالة البرنامج الثابت" #: thonny/plugins/micropython/__init__.py:963 msgid "MicroPython (local)" msgstr "مايكروبايثون (محلي)" #: thonny/plugins/micropython/__init__.py:973 msgid "MicroPython (SSH)" msgstr "مايكروبايثون (SSH)" #: thonny/plugins/micropython/pip_gui.py:134 msgid "Module" msgstr "الوحدة" #: thonny/plugins/micropython/pip_gui.py:159 msgid "Shadowed items (not importable):" msgstr "العناصر المظللة (غير قابلة للاستيراد):" #: thonny/plugins/micropython/pip_gui.py:208 msgid "Package is not available at micropython.org. Version at PyPI will be installed." msgstr "PyPI الخزمة غير متوفرة في مايكروبايثون. سيتم تثبت إصدارة " #: thonny/plugins/micropython/pip_gui.py:219 msgid "NB! micropython.org has published version %s of this package and this will be installed by default." msgstr "ملاحظة! مايكروباثيون نشرت إصدار %s من هذه الحزمة وسوف تثبت تلقائياً." #: thonny/plugins/micropython/pip_gui.py:245 msgid "For upgrading simply install the package again." msgstr "للتحديث، قم بتثبيت الحزمة مرة أخرى." #: thonny/plugins/micropython/pip_gui.py:248 msgid "For uninstalling delete corresponding files." msgstr "لإلغاء التثبيت، احذف الملفات المتطابقة." #: thonny/plugins/micropython/pip_gui.py:262 msgid "Scope" msgstr "مجال" #: thonny/plugins/micropython/pip_gui.py:275 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "يسرد مربع الحوار هذا وحدات المستوى الأعلى من الأدلة التالية:\n" "\n" "" #: thonny/plugins/micropython/pip_gui.py:284 msgid "New packages will be installed to" msgstr "سيتم تثبيت الحزم الجديدة على" #: thonny/plugins/micropython/pip_gui.py:292 msgid "no absolute lib directory in sys.path" msgstr "لا يوجد دليل lib مطلق في sys.path" #: thonny/plugins/micropython/uf2dialog.py:40 msgid "Version to be installed" msgstr "الإصدار المراد تثبيته" #: thonny/plugins/micropython/uf2dialog.py:48 msgid "Target device location" msgstr "موقع الجهاز المستهدف" #: thonny/plugins/micropython/uf2dialog.py:59 msgid "Target device model" msgstr "طراز الجهاز المستهدف" #: thonny/plugins/micropython/uf2dialog.py:145 msgid "Please wait" msgstr "الرجاء الانتظار" #: thonny/plugins/pip_gui.py:67 msgid "Search on PyPI" msgstr "PyPI البحث في " #: thonny/plugins/pip_gui.py:79 msgid "Delete selected" msgstr "حذف المحدد" #: thonny/base_file_browser.py:662 msgid "Open in Thonny's text editor" msgstr "افتح في محرر نصوص ثوني" #: thonny/base_file_browser.py:325 msgid "Storage space on this drive or filesystem" msgstr "مساخة التخزين في هذا القرص أو نظام الملفات" #: thonny/base_file_browser.py:326 msgid "total space" msgstr "المساحة الكلية" #: thonny/base_file_browser.py:328 msgid "used space" msgstr "المساحة المستخدمة" #: thonny/base_file_browser.py:329 msgid "free space" msgstr "المساحة المتوفرة" #: thonny/base_file_browser.py:336 msgid "Storage info" msgstr "معلومات التخزين" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "استبدال التاب بالمسافات" #: thonny/plugins/editor_config_page.py:28 msgid "Highlight tab characters" msgstr "تمييز أحرف التاب" #: thonny/plugins/editor_config_page.py:47 msgid "Indent with tab characters (not recommended for Python)" msgstr "مسافة بادئة بأحرف جدولة (غير مستحسن لبايثون)" #: thonny/base_file_browser.py:81 thonny/memory.py:63 msgid "Name" msgstr "الاسم" #: thonny/base_file_browser.py:85 msgid "Size (bytes)" msgstr "الحجم (البايت)" #: thonny/base_file_browser.py:835 msgid "Enter name for new directory under\n" "%s" msgstr "أدخل اسم لدليل الجديد تحت %s" #: thonny/base_file_browser.py:858 msgid "Nothing selected" msgstr "لا شيء محدد" #: thonny/base_file_browser.py:858 msgid "Select an item and try again!" msgstr "اختر عنصر ومن ثم حاول مرة آخرى" #: thonny/base_file_browser.py:1105 msgid "Open from %s" msgstr "افتح من %s" #: thonny/base_file_browser.py:1108 msgid "Save to %s" msgstr "الحفظ في %s" #: thonny/base_file_browser.py:1120 msgid "File name:" msgstr "اسم الملف:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:510 #: thonny/plugins/object_inspector.py:589 msgid "Value ID" msgstr "معرف القيمة" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:511 #: thonny/plugins/object_inspector.py:590 msgid "Value" msgstr "القيمة" #: thonny/plugins/backend_config_page.py:257 msgid "Save password" msgstr "حفظ كلمة المرور" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "استدعاء دالة في %s" #: thonny/plugins/debugger.py:1001 msgid "Local variables" msgstr "المتغيرات المحلية" #: thonny/plugins/debugger.py:1033 msgid "Function" msgstr "الدالة" #: thonny/plugins/debugger.py:1034 msgid "Location" msgstr "الموقع" #: thonny/plugins/debugger.py:1110 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "إذا رمى الأمر الأخير استثناءً ، فسيُظهر هذا العرض تفاصيل الخطأ." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "المعرف" #: thonny/plugins/object_inspector.py:87 msgid "Data" msgstr "بيانات" #: thonny/plugins/object_inspector.py:88 msgid "Attributes" msgstr "خصائص" #: thonny/plugins/object_inspector.py:509 msgid "Index" msgstr "فهرس" #: thonny/plugins/object_inspector.py:587 msgid "Key ID" msgstr "معرف المفتاح" #: thonny/plugins/object_inspector.py:588 msgid "Key" msgstr "المفتاح" #: thonny/plugins/variables.py:36 msgid "Back to\n" "%s" msgstr "العودة إلى %s" #: thonny/plugins/micropython/__init__.py:401 msgid "Port or WebREPL" msgstr "WebREPL أو منفذ" #: thonny/plugins/micropython/__init__.py:518 msgid "Password" msgstr "كلمة المرور" #: thonny/plugins/debugger.py:959 msgid "Source code" msgstr "الكود المصدري" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "استخدم مربع حوار الملفات لتي كي بدلاً من زينتي" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "حدد ما إذا كانت مربعات حوار الملفات ظهرت خلف النافذة الرئيسية" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "متغيرات البيئة (المفتاح=القيمة لكل سطر)" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/compile_mo.bat0000664000175000017500000000011514276461532020247 0ustar00annamaaannamaacd ..\.. C:\Py3\Scripts\pybabel compile -d thonny/locale/ -D thonny pause ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/thonny/locale/cs_CZ/0000775000175000017500000000000014307363733016437 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6861067 thonny-4.0.1/thonny/locale/cs_CZ/LC_MESSAGES/0000775000175000017500000000000014307363733020224 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/cs_CZ/LC_MESSAGES/thonny.mo0000664000175000017500000007032414276461532022107 0ustar00annamaaannamaal $)   /&<c!tD&   .!0P2  x ao &;AYnGt     G*2G<a%*%:Zx3    $ 7 L !g  ( ) ! !B'!j!o!~!!! !!%!!!")" /";"B" I"S" X"d"y""" """""" " " "##=# #$ $$ &$ 1$?$0D$u$ z$$6$$$%%4%M%R%[%c%mk%F% &m&CV'''''''( /(=(P( `(l((3(((((( (() ))%4)3Z))zc*;*+1+D+ W+1e+ +++++,",+,=, N,\,o,n,,,0-<L--,.UJ... ..n.!// Q/]/c/t/w/?/C/ 0'0'E0)m0 000001$151J16R1T1 1111 122H$25m2222 2222 3 '333:;3v3{3&3333333 4 4 4%4 64(C4l444 4B444 455 5&*5Q5 Y5e5 ~5 555 5+555 5 5 66 >6"L6o6t6 6 6 6 6 6666 66 6 77227:e777 7077 8838 88 E8Q8o8-u8 8 88 888 88899 )969>9G9 Z9!h9 99:: ::bv;^;8</J<z<4=C="S=v=== ====0= >> >)>;>S>V>^>s> >2>%>> >>?&?+?L3?B??S@k@@ @ @@ @@1@ @%@VAIqAAAAA B%BEB C CC-(CVC#iCMCCCDD*!D1LD/~DD DDDzDkE{E EE"E!EEFFJ-FxFFFbF G!G*G0G 9GGGYG tGGH HB$H gHrH HHH/H"H/IJI#eIIII&I)I%J.*JYJrJJJJJ JJJJ&K8K@K'VK(~KK KJKLL/L@LHL OL\L!sLLLLLLL M MMM")MLM`MgM|MMMMMMM MMMN3NOOO0O8OLOcOAhO OOODO"PBP\PsPPPP P PrPWEQQ_R>R2SLS lSvS S3S'STT.T ATMT]T9fTT TTTTTT TU)U,DU/qUUsNV:VVW(W:W+MWyWWWWWW XX(XEXYXsXyX/Y(2Y;[YY6ZNUZZZZ ZZ'P[x[ [[[[C[@\F\#e\5\4\\]](5]*^]*]]] ]J]bH^^^^ ^ ^^^J^7:_r______ __``5"`X`]`+s```````` a aa*a/=amaaaaYa bb b*b DbQb2cbb bb bbb b c+c About BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating virtual environmentCutDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter your password for {}ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...HeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageINSTALLIO fontIf the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:Installing '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLine numberLoadLoadingLocal variablesLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...ProblemProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingScopeSearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.Step backStep intoStep outStep overStopStop/Restart backendStorage spaceSummarySupportSupport UkraineSwitch to regular modeSyntax themeTarget:TerminalTerminal emulationThe answer isThe specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityValueVariablesVersion historyVersion to be installedViewWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You need to select a file!Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"please waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.unclosed_stringuser site packagesvirtual environmentMIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: POEditor.com Project-Id-Version: Thonny Language: cs %d položek(restartujte Thonny po této změně)(používá se po kliknutí na tlačítko Debug na panelu nástrojů)O BirdseyeO ThonnyRozšířená instalace / upgrade / downgradePokročílé volbyPovolit pouze jednu instanci ThonnyUmožnit vstupovat do knihoven (například mimo adresář hlavního skriptu)Jste si jisti odinstalací?AsistentAutorAutomatické doplňováníAutomaticky našeptávat zatímco píšeteAutomaticky zobrazit dokumentaci v našeptávačiAutomaticky zobrazit parametry po napsání '('ZpětZpět na %sZpět k aktuálnímu snímkuŠpatný adresářBirdseye je Debuger Pythonu, který musí být instalován samostatně. Chcete otevřít nápovědu a dozvědět se více? Birdseye port Projít balíkButrackerještě není možné zavřítNemůžu najít balík ze seznamu:Není možné najít vhodný diskZrušitCitlivé na velikostZměnit velikost písmaZměnit pracovní adresář na adresář skriptu při Spuštění / DebuguCircuitPython (generic)CircuitPython zařízeníSmazatVyčistit shell před spuštěním nového procesu (Spustit, Debugovat, Zastavit/Restartovat, ...)Smazat shellKliknoutKlik ZavřítZavřít všeZavřít ostatníPříkaz není k dispoziciZakomentovatKonfigurace byla změněna. Restartujte Thonny pro práci v normálním módu. (Pro změnu jděte do "Nástroje - Volby - Obecné)Nastavit %s souboryPotvrzeníPřipojte zařízení k počítači a vyberte odpovídající portKopírovatZkopírovat do schránkyKopírujiKopíruji %s do %sNepodařilo se najít definiciNenalezen disk '%s'. Chcete jej najít sám(a)?Není možné najít balík z PyPINení možné najít informace o balíku z PyPIUkládání se nezdaříloVytvářím virtuální prostředíVyjmoutDebugDebugovat aktuální skriptDebugovat aktuální skript (birdseye)Debugovat aktuální skript (rychlejší)Debugovat aktuální skript (hezčí)Ladící režim (poskytuje detailnější log)Zmenšit velikost písmaZmenšit odstazení o úroveňSmazatMažu %sŽádaná verzeDetailyZařízeníMěli jste na mysli '%s'?Vlastnosti adresářeVypnout notifikační zvukyvypnout kontrolu (jedno id na řádek)OdpojitChcete přepsat '%s'?Chcete soubor uložit před zavřením?Chcete soubory uložit před zavřením?Ukotvit uživatelská oknaDokumentaceNezapomeňte, že main.py funguje pouze bez vloženého hlavního skriptu.DolůStáhnout do %sStahuju %s do %sUpravitEditorFont editoruZapište celé čísloZadejte jméno nové složky v %sZadejte nové jménoVložte řetězec k nahrazeníZadejte svoje heslo pro {}ChybaChybový kód:Chyba:UdálostiVyjímkyKonecUkončit ThonnyExportovat protokoly využití ...Externí modifikaceSouborSoubor již existujeJméno souboru:Vlastnosti souboruSouboryNajítNajít a nahraditNajít:Přepnout do editoruPřepnout doPřepnout do shelluMód škálování písmaZ důvodů výkonu se Shell vyhýbá zobrazování velmi dlouhých řádků v plné délce (viz Nástroje => Možnosti => Shell). Zde můžete pracovat s původním fragmentem textu.Nalezeno několik '%s' disků. Chcete jeden vybrat?Celá obrazovkaFunkceVolání funkce na %sObecnéPřejít na řádekPřejít na řádek...HeapHeap mód je zapnutý. Zavřete Heap zobrazení pro jeho vypnutíNápovědaObsah nápovědySkrýt skryté souboryZvýrazňovat aktuální řádek (vyžaduje znovuotevření editoru)Zvýraznit lokální proměnnéZvýraznit stejná jménaZvýrazňovat závorkyZvýrazňovat synaxiZvýraznit znaky tabulátoruDomůDomovská stránkaINTALOVATIO písmoPokud je potřeba otevřít soubor v externí aplikaci, uložte jej do lokální složky a otevřete jej odtamtud!Pokud jej nemůžete najít, možná musíte nedříve nainstalovat správný ovladač.Pokud nevíte, odkud balíček získat, pak budete pravděpodobně hledat Python Package Index. Začněte zadáním názvu balíčku do vyhledávacího pole výše a stisknutím klávesy ENTER.Když napíšete hodnotu proměnné prostředí do uvozovek, tyto uvozovky se stanou součástí hodnoty proměnné. Opravdu to tak chcete udělat?Pokud to stále chcete, instalujte to z příkazového řádkuZvětšit velikost písmaZvětšit odstazení o úroveňInstalaceInstalovat z PyPIInstalovat z lokálního souboruInstalace ze souboru požadavků (requirements.txt)Nainstalovat nebo aktualizovat firmwareNainstalováno do:Nainstalovaná verze:Instalování '%s'InterpreterPřerušit běhDovnitřNechat otevřený terminál po ukončení Python programuKlíčID klíčeJazykPoslední stabilní verzePoslední verzeČíslo řádkuNahrátNahrávámLokální proměnnéProtokolovat události využití programuZdá se že '%s' byl smazán nebo přesunut.Vypadá to že '%s' byl změněný mimo editor.Vypadá to že instalujete balík do Thonny. Pokud chcete instalovat Thonny plugin, potom vyberte 'Nástroje - Spáva pluginů' Určitě chcete instalovat %s bro back-end?Vytvořeno v University of Tartu, Estonia, s pomocí komunity open-source, Raspberry Pi Foundation a Cybernetica ASUjistěte se že na micro:bit je nainstalován MicroPythonSpravovat balíky pro %sSpravovat balíkySpravovat pluginyMaximalizovat oknoMaximální délka řádky před zalomenímMaximální počet řádkůMůže zpomalit debugingMicroPython (SSH)MicroPython (generic)MicroPython (lokální)MicroPython zařzeníZměněnoPřesunout '%s' do koše?Přesunout / přejmenovat...Přesunout do košePřesouvám '%s' do košePřesouvám do košePozn. V nastavení terminálu musí být povoleno automatické zavírání (Profily → Shell → Když skočí z shellu)!Velké hodnoty mohou způsobit nízký výkon!!Restartuje Thonny po těchto změnách!!Některé změny stylu se projeví až po restartu Thonny!!Zřejmě existuje další verze která je kompatibilní s aktuální verzí Thonny. Klikněte na '...' pro výběr verze k instalaci!Poznámka: Thonny podporuje jen Python %s a novější!Je potřeba resatartovat Thonny po instalaci / upgrade / odinstalaci pluginu!JménoNovýNový adresářNový souborDo tohoto adresáře budou nainstalovány také nové balíčky. Ostatní místa musí být řízena alternativními prostředky.Nové balíčky budou nainstalovány donásledující objektPoznámkyNic není vybránoOKInspektor objektůOtevřít Asistenta automaticky když má varování pro váš kódOtevřít Asistenta automaticky pokud program skončí výjimkouOtevřít adresář dat ThonnyOtevřít adresář programu ThonnyOtevřít a zavřít pohled na zásobník automatickyOtevřít vyhodnocené hodnoty v Inspektoru objektůOtevřít z '%s'Otevřít v ThonnyOtevřít v editoru v ThonnyOtevřít ve výchozí externí aplikaciOtevřít v systémové výchozí aplikaciOtevřít v systémovém správci souborůOtevřít prohlížeč historieOtevřít systémový shellOtevřít...Otevírání vzdálených souborů v externí aplikaci není podporováno.Otevře první zobrazení zásobníku a zavře jej, když se program vrátí do hlavního snímku.Volby...VenOsnovaPreskočitPřepsat?Přepsat motiv '%s'BalíkBalík '{}' je požadován pro instalaci a odinstalaci ostatních balíkůSprávce balíčků není v tomto interpretru dostupnýAdresář balíkůHesloVložitVkládání se nezdařiloCestaProvést MyPy kontroluProvést vybranou Pylint kontoluProsím, zkontrolujte zápisVyčkejte prosímPlotterPlotter vykresluje řady čísel vypsaných do ShelluPortPreferovaný debuggerPo skončení programu zobrazí Python REPLNáhledPředhozí objektTisk...ProblémArgumenty programuArgumenty programu:Strom programuVlastnostiPyPI stránkyPygame Zero módPythonové souboryPythonové soubory mají obvykle příponu .py.Interpretery PythonuUkončitOpravdu odinstalovat?Nedávné souboryDoporučené maximum znaků na řádek (nastavte 0 pro vypnutí čáry pro konec řádku)VpředObnovitObvyklý módVzdálený Python 3 (SSH)PřejmenovatPřejmenovat '%s'Otevřít všechny soubory z předchozího sezeníNahraditNahradit všeNahradit tabulátory mezeramiNahradit s:Najít a nahraditNahlásit problémVyžadujeVyžadje:Restartuje interpretr než spustíte skriptPokračovatBěhSpustit & DebugouvatSpustit / pokračovatSpustit aktuální skriptSpustit aktuální skript v termináluSkoč na kurzorSpustit aktuální skript v termináluUložitUložit všechny souboryUložit při zavřeníUložit jako...Uložit kopii...Uložit hesloUložit do '%s'UkládámRozsahVýsledky vyhledáváníVyhledáváníDetaily viz nápovědaVybrat všeVybrat všeVyberte položku a zkuste to znovu!Vyberte prázdný adresář pro nové virtuální prostředíVybraný adresář není prázdný. Vyberte jiný adresář.Poslat EOF / Soft rebootShellZobrat PlotterZobrazit volání funkcí (rámce) v samostatných oknechZobrazit skryté souboryZobrazit čísla řádkůZobrazit informace o parameterechVelikostVelikost (v bajtech)Zdrojový textZkrátit text (%d znaků)ZásobníkZačněte vybráním balíku vlevo.Krok zpětKrok dovnitřKrok venPřeskočitZastavitZastavit/restartovat backendÚložištěSouhrnPodporaPodpořte UkrajinuPřepnout do běžného režimuMotiv syntaxeCíl:TerminálEmulace TermináluOdpověď jeText nebyl nalezenMotiv & PísmoToto pole je určeno pro vaše pracovní poznámky -- k přiřazení úkolů, úryvků kódu, pro cokoli. Všechno se automaticky uloží a načte, když příště otevřete Thonny. Neváhejte tento text smazat a vytvořte si tak prostor pro vlastní poznámky.Tento příkaz není k dispozici v Thonny spuštěném z FlatpackuTento počítačToto okno je pro správu pluginů Thonny a jejich závislostí. Pokud chcete instalovat pluginy pro vlatní programy, potom vyberte 'Nástroje - Spravovat balíky'Tento dialog zobrazuje všechny dostupné balíky, ale umožňuje upgrade nebo odinstalaci pouze zTohle nevypadá jako balíček pro MicroPython/CircuitPython. Jste si jistí, že jej chcete nainstalovat.Tohle je komentářTento balík vyžaduje jinou verzi Thonny:Tento program je šířen BEZ JAKÉKOLI ZÁRUKY! Jedná se o svobodný software a jeho šíření v souladu s licencí je vítáno, viz https://opensource.org/licenses/MITVolby ThonnyThonny pluginyThonny plugin bez požaradkůThonnyho PythonPřepnout komentářeNástrojeZkusti detekovat port automatickyMód UIUI škálovací faktorMotiv UIZrušte zaškrtnutí, pokud chcete více tradiční uživatelské prostředí.OdkomentovatZpětOdinstalovatOdinstaluje se '%s'Nesplnitelné požadavkyNahoruUpgradeZávislosti upgradeUpgrade a odinstalaceNahrát do %sPoužijte "Stop" příkaz pro ukončení debugginguPoužít Tk souborové dialogy namísto ZenityHodnotaProměnnéHistorie verzíVerze která se má nainstalovatZobrazeníVarováníCo se má stát s %s souborem když na něj poklepete v Thonnyho souborovém dialogu?Který interpretr má Thonny použít ke spuštění vašeho kódu?S aktuálním interpreterem zde můžete procházet pouze balíčky. K instalaci, upgradu nebo odinstalaci použijte 'Nástroje → Otevřít systémový shell ...'.Zalomte text (může být pomalý)Musíte vybrat soubor!Zvětšitvšechny souborybla, blabajtůvolné místozdezkontrolujte název zařízení, např. "USB Serial" nebo "UART"prosím čekejtepodporuje základní ANSI barvy a stylynajít a nainstalovat soubor balíčku (obvykle s příponou .whl, .tar.gz nebo .zip).vyhledejte soubor requirements.txt a nainstalujte balíčky v něm uvedené.unclosed_stringbalíčky z uživatelských stránekvirtuální prostředí././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/cs_CZ/LC_MESSAGES/thonny.po0000664000175000017500000014620614276461532022115 0ustar00annamaaannamaamsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: cs\n" #: thonny/workbench.py:361 msgid "File" msgstr "Soubor" #: thonny/workbench.py:362 msgid "Edit" msgstr "Upravit" #: thonny/workbench.py:363 msgid "View" msgstr "Zobrazení" #: thonny/running.py:116 thonny/workbench.py:364 msgid "Run" msgstr "Běh" #: thonny/workbench.py:365 msgid "Tools" msgstr "Nástroje" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:366 msgid "Help" msgstr "Nápověda" #: thonny/workbench.py:583 msgid "Exit" msgstr "Konec" #: thonny/workbench.py:610 msgid "Decrease font size" msgstr "Zmenšit velikost písma" #: thonny/workbench.py:622 msgid "Focus editor" msgstr "Přepnout do editoru" #: thonny/workbench.py:631 msgid "Focus shell" msgstr "Přepnout do shellu" #: thonny/workbench.py:642 msgid "Maximize view" msgstr "Maximalizovat okno" #: thonny/workbench.py:654 msgid "Full screen" msgstr "Celá obrazovka" #: thonny/workbench.py:1457 msgid "Program arguments" msgstr "Argumenty programu" #: thonny/plugins/about.py:21 thonny/plugins/about.py:140 msgid "About Thonny" msgstr "O Thonny" #: thonny/plugins/about.py:66 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Vytvořeno v\n" "University of Tartu, Estonia,\n" "s pomocí\n" "komunity open-source,\n" "Raspberry Pi Foundation\n" "a Cybernetica AS" #: thonny/plugins/about.py:86 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Tento program je šířen\n" "BEZ JAKÉKOLI ZÁRUKY!\n" "Jedná se o svobodný software a jeho šíření\n" "v souladu s licencí je vítáno, viz\n" "https://opensource.org/licenses/MIT" #: thonny/plugins/about.py:129 msgid "Version history" msgstr "Historie verzí" #: thonny/plugins/about.py:136 msgid "Report problems" msgstr "Nahlásit problém" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Otevřít Asistenta automaticky pokud program skončí výjimkou" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Otevřít Asistenta automaticky když má varování pro váš kód" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Provést vybranou Pylint kontolu" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Provést MyPy kontrolu" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "vypnout kontrolu (jedno id na řádek)" #: thonny/assistance.py:985 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Asistent" #: thonny/plugins/autocomplete.py:512 msgid "Auto-complete" msgstr "Automatické doplňování" #: thonny/plugins/backend_config_page.py:337 msgid "Interpreter" msgstr "Interpreter" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "O Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye je Debuger Pythonu, který musí být\n" "instalován samostatně.\n" "Chcete otevřít nápovědu a dozvědět se více?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Debugovat aktuální skript (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Přepnout komentáře" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "Zakomentovat" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "Odkomentovat" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Zpět" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Vpřed" #: thonny/base_file_browser.py:721 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2294 msgid "Cut" msgstr "Vyjmout" #: thonny/base_file_browser.py:722 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2295 msgid "Copy" msgstr "Kopírovat" #: thonny/base_file_browser.py:724 thonny/base_file_browser.py:730 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2296 msgid "Paste" msgstr "Vložit" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Vybrat vše" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1401 msgid "Run to cursor" msgstr "Skoč na kurzor" #: thonny/plugins/debugger.py:982 msgid "Can't close yet" msgstr "ještě není možné zavřít" #: thonny/plugins/debugger.py:983 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Použijte \"Stop\" příkaz pro ukončení debuggingu" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Ukotvit uživatelská okna" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Zvýraznit stejná jména" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Zvýraznit lokální proměnné" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Zvýrazňovat závorky" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Zvýrazňovat synaxi" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Zvýrazňovat aktuální řádek (vyžaduje znovuotevření editoru)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Zobrazit čísla řádků" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Doporučené maximum znaků na řádek\n" "(nastavte 0 pro vypnutí čáry pro konec řádku)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Exportovat protokoly využití ..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Události" #: thonny/plugins/files.py:606 msgid "Files" msgstr "Soubory" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:430 msgid "Find & Replace" msgstr "Najít a nahradit" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Najít:" #: thonny/plugins/find_replace.py:87 msgid "Replace with:" msgstr "Nahradit s:" #: thonny/plugins/find_replace.py:105 msgid "Case sensitive" msgstr "Citlivé na velikost" #: thonny/plugins/find_replace.py:112 msgid "Up" msgstr "Nahoru" #: thonny/plugins/find_replace.py:116 msgid "Down" msgstr "Dolů" #: thonny/plugins/find_replace.py:125 msgid "Find" msgstr "Najít" #: thonny/plugins/find_replace.py:135 msgid "Replace" msgstr "Nahradit" #: thonny/plugins/find_replace.py:143 msgid "Replace+Find" msgstr "Najít a nahradit" #: thonny/plugins/find_replace.py:153 msgid "Replace all" msgstr "Nahradit vše" #: thonny/plugins/find_replace.py:249 msgid "Enter string to be replaced." msgstr "Vložte řetězec k nahrazení" #: thonny/plugins/find_replace.py:333 msgid "The specified text was not found!" msgstr "Text nebyl nalezen" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Povolit pouze jednu instanci Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Otevřít všechny soubory z předchozího sezení" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Vypnout notifikační zvuky" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Mód škálování písma" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Heap mód je zapnutý.\n" "Zavřete Heap zobrazení pro jeho vypnutí" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Heap" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Jazyk" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Toto pole je určeno pro vaše pracovní poznámky -- k přiřazení úkolů, úryvků kódu, pro cokoli.\n" "\n" "Všechno se automaticky uloží a načte, když příště otevřete Thonny.\n" "\n" "Neváhejte tento text smazat a vytvořte si tak prostor pro vlastní poznámky." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Poznámky" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Předhozí objekt" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "následující objekt" #: thonny/plugins/object_inspector.py:733 msgid "Object inspector" msgstr "Inspektor objektů" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Osnova" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero mód" #: thonny/plugins/pip_gui.py:79 msgid "Uninstall" msgstr "Odinstalovat" #: thonny/editors.py:667 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:491 #: thonny/ui_utils.py:1871 thonny/workdlg.py:162 msgid "Close" msgstr "Zavřít" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Klik " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "zde" #: thonny/plugins/pip_gui.py:76 msgid "Upgrade" msgstr "Upgrade" #: thonny/plugins/esp/__init__.py:349 #: thonny/plugins/micropython/uf2dialog.py:348 thonny/plugins/pip_gui.py:73 msgid "Install" msgstr "Instalace" #: thonny/plugins/pip_gui.py:535 msgid "Could not find the package from PyPI." msgstr "Není možné najít balík z PyPI" #: thonny/plugins/pip_gui.py:557 msgid "Latest stable version" msgstr "Poslední stabilní verze" #: thonny/plugins/pip_gui.py:559 msgid "Latest version" msgstr "Poslední verze" #: thonny/plugins/pip_gui.py:561 msgid "Summary" msgstr "Souhrn" #: thonny/plugins/pip_gui.py:563 msgid "Author" msgstr "Autor" #: thonny/plugins/pip_gui.py:565 msgid "Homepage" msgstr "Domovská stránka" #: thonny/plugins/pip_gui.py:567 msgid "Bugtracker" msgstr "Butracker" #: thonny/plugins/pip_gui.py:569 msgid "Documentation" msgstr "Dokumentace" #: thonny/plugins/pip_gui.py:571 msgid "PyPI page" msgstr "PyPI stránky" #: thonny/plugins/pip_gui.py:611 msgid "Requires" msgstr "Vyžaduje" #: thonny/plugins/pip_gui.py:743 msgid "Really uninstall?" msgstr "Opravdu odinstalovat?" #: thonny/plugins/pip_gui.py:748 msgid "Are you sure you want to uninstall it?" msgstr "Jste si jisti odinstalací?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Zpět k\n" "aktuálnímu snímku" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Proměnné" #: thonny/base_file_browser.py:1558 msgid "This computer" msgstr "Tento počítač" #: thonny/base_file_browser.py:641 msgid "Refresh" msgstr "Obnovit" #: thonny/base_file_browser.py:650 msgid "Focus into" msgstr "Přepnout do" #: thonny/base_file_browser.py:1393 thonny/base_file_browser.py:1405 #: thonny/plugins/autocomplete.py:300 thonny/plugins/highlight_names.py:87 msgid "Error" msgstr "Chyba" #: thonny/base_file_browser.py:1393 thonny/base_file_browser.py:1405 msgid "You need to select a file!" msgstr "Musíte vybrat soubor!" #: thonny/base_file_browser.py:1409 msgid "Overwrite?" msgstr "Přepsat?" #: thonny/base_file_browser.py:1409 msgid "Do you want to overwrite '%s' ?" msgstr "Chcete přepsat '%s'?" #: thonny/editors.py:632 thonny/editors.py:634 msgid "New" msgstr "Nový" #: thonny/editors.py:645 msgid "Open..." msgstr "Otevřít..." #: thonny/editors.py:647 msgid "Load" msgstr "Nahrát" #: thonny/editors.py:656 msgid "Recent files" msgstr "Nedávné soubory" #: thonny/editors.py:678 thonny/ui_utils.py:493 msgid "Close all" msgstr "Zavřít vše" #: thonny/editors.py:688 thonny/editors.py:690 msgid "Save" msgstr "Uložit" #: thonny/editors.py:713 msgid "Save as..." msgstr "Uložit jako..." #: thonny/editors.py:724 msgid "Save copy..." msgstr "Uložit kopii..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Volby Thonny" #: thonny/running.py:115 msgid "Run current script" msgstr "Spustit aktuální skript" #: thonny/running.py:146 msgid "Run current script in terminal" msgstr "Spustit aktuální skript v terminálu" #: thonny/running.py:159 msgid "Stop/Restart backend" msgstr "Zastavit/restartovat backend" #: thonny/running.py:160 msgid "Stop" msgstr "Zastavit" #: thonny/running.py:171 msgid "Interrupt execution" msgstr "Přerušit běh" #: thonny/running.py:184 msgid "Send EOF / Soft reboot" msgstr "Poslat EOF / Soft reboot" #: thonny/running.py:195 msgid "Disconnect" msgstr "Odpojit" #: thonny/plugins/cpython_frontend/cp_front.py:268 msgid "Python interpreters" msgstr "Interpretery Pythonu" #: thonny/editors.py:36 thonny/plugins/cpython_frontend/cp_front.py:269 #: thonny/plugins/pip_gui.py:789 thonny/plugins/pip_gui.py:802 msgid "all files" msgstr "všechny soubory" #: thonny/plugins/cpython_frontend/cp_front.py:297 msgid "Select empty directory for new virtual environment" msgstr "Vyberte prázdný adresář pro nové virtuální prostředí" #: thonny/plugins/cpython_frontend/cp_front.py:304 msgid "Bad directory" msgstr "Špatný adresář" #: thonny/plugins/cpython_frontend/cp_front.py:305 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Vybraný adresář není prázdný.\n" "Vyberte jiný adresář." #: thonny/plugins/cpython_frontend/cp_front.py:322 msgid "Creating virtual environment" msgstr "Vytvářím virtuální prostředí" #: thonny/shell.py:100 msgid "Clear shell" msgstr "Smazat shell" #: thonny/shell.py:174 msgid "Plotter" msgstr "Plotter" #: thonny/shell.py:306 msgid "Clear" msgstr "Smazat" #: thonny/shell.py:319 msgid "Show Plotter" msgstr "Zobrat Plotter" #: thonny/shell.py:1648 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Z důvodů výkonu se Shell vyhýbá zobrazování velmi dlouhých řádků v plné délce (viz Nástroje => Možnosti => Shell).\n" "Zde můžete pracovat s původním fragmentem textu." #: thonny/shell.py:1659 msgid "Wrap text (may be slow)" msgstr "Zalomte text (může být pomalý)" #: thonny/ui_utils.py:1866 msgid "Copy to clipboard" msgstr "Zkopírovat do schránky" #: thonny/shell.py:1701 msgid "Squeezed text (%d characters)" msgstr "Zkrátit text (%d znaků)" #: thonny/shell.py:1871 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Plotter vykresluje řady čísel\n" "vypsaných do Shellu" #: thonny/shell.py:1873 msgid "See Help for details." msgstr "Detaily viz nápověda" #: thonny/ui_utils.py:492 msgid "Close others" msgstr "Zavřít ostatní" #: thonny/ui_utils.py:1722 msgid "Copying" msgstr "Kopíruji" #: thonny/ui_utils.py:1725 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Kopíruji\n" "%s\n" "do\n" "%s" #: thonny/base_file_browser.py:1364 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:290 thonny/plugins/pip_gui.py:1256 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1733 thonny/ui_utils.py:1818 #: thonny/workdlg.py:164 thonny/workdlg.py:209 msgid "Cancel" msgstr "Zrušit" #: thonny/base_file_browser.py:1355 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:100 thonny/plugins/backend_config_page.py:285 #: thonny/ui_utils.py:154 thonny/ui_utils.py:1815 thonny/workdlg.py:206 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2300 msgid "Select All" msgstr "Vybrat vše" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:155 #: thonny/workbench.py:162 msgid "Shell" msgstr "Shell" #: thonny/workbench.py:593 msgid "Options..." msgstr "Volby..." #: thonny/workbench.py:600 msgid "Increase font size" msgstr "Zvětšit velikost písma" #: thonny/workbench.py:665 msgid "Change font size" msgstr "Změnit velikost písma" #: thonny/workbench.py:666 msgid "Zoom" msgstr "Zvětšit" #: thonny/workbench.py:675 msgid "Exit Thonny" msgstr "Ukončit Thonny" #: thonny/workbench.py:678 msgid "Quit" msgstr "Ukončit" #: thonny/workbench.py:1236 thonny/workbench.py:1244 msgid "Overwriting theme '%s'" msgstr "Přepsat motiv '%s'" #: thonny/workbench.py:1428 msgid "Program arguments:" msgstr "Argumenty programu:" #: thonny/workbench.py:1482 msgid "Regular mode" msgstr "Obvyklý mód" #: thonny/workbench.py:1483 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Konfigurace byla změněna. Restartujte Thonny pro \n" "práci v normálním módu.\n" "(Pro změnu jděte do \"Nástroje - Volby - Obecné)" #: thonny/plugins/ast_view.py:212 msgid "Program tree" msgstr "Strom programu" #: thonny/plugins/debugger.py:1283 msgid "Resume" msgstr "Pokračovat" #: thonny/plugins/debugger.py:1299 msgid "Run / resume" msgstr "Spustit / pokračovat" #: thonny/plugins/debugger.py:1314 msgid "Debug current script" msgstr "Debugovat aktuální skript" #: thonny/plugins/debugger.py:1316 msgid "Debug" msgstr "Debug" #: thonny/plugins/debugger.py:1327 msgid "Debug current script (nicer)" msgstr "Debugovat aktuální skript (hezčí)" #: thonny/plugins/debugger.py:1339 msgid "Debug current script (faster)" msgstr "Debugovat aktuální skript (rychlejší)" #: thonny/plugins/debugger.py:1350 msgid "Step over" msgstr "Přeskočit" #: thonny/plugins/debugger.py:1352 msgid "Over" msgstr "Preskočit" #: thonny/plugins/debugger.py:1363 msgid "Step into" msgstr "Krok dovnitř" #: thonny/plugins/debugger.py:1365 msgid "Into" msgstr "Dovnitř" #: thonny/plugins/debugger.py:1376 msgid "Step out" msgstr "Krok ven" #: thonny/plugins/debugger.py:1378 msgid "Out" msgstr "Ven" #: thonny/plugins/debugger.py:1413 msgid "Step back" msgstr "Krok zpět" #: thonny/plugins/debugger.py:1415 msgid "Back" msgstr "Zpět" #: thonny/plugins/debugger.py:1421 msgid "Stack" msgstr "Zásobník" #: thonny/plugins/debugger.py:1422 msgid "Exception" msgstr "Vyjímky" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Protokolovat události využití programu" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Ladící režim (poskytuje detailnější log)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Mód UI" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "UI škálovací faktor" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "!Restartuje Thonny po těchto změnách!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Obecné" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INTALOVAT" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Projít balík" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "S aktuálním interpreterem zde můžete procházet pouze balíčky.\n" "K instalaci, upgradu nebo odinstalaci použijte 'Nástroje → Otevřít systémový shell ...'." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Adresář balíků" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Instalovat z PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Pokud nevíte, odkud balíček získat, pak budete pravděpodobně hledat Python Package Index. Začněte zadáním názvu balíčku do vyhledávacího pole výše a stisknutím klávesy ENTER." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "vyhledejte soubor requirements.txt a nainstalujte balíčky v něm uvedené." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Kliknout" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "najít a nainstalovat soubor balíčku (obvykle s příponou .whl, .tar.gz nebo .zip)." #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Upgrade a odinstalace" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Začněte vybráním balíku vlevo." #: thonny/plugins/pip_gui.py:410 msgid "Target:" msgstr "Cíl:" #: thonny/plugins/pip_gui.py:414 msgid "virtual environment" msgstr "virtuální prostředí" #: thonny/plugins/pip_gui.py:412 msgid "user site packages" msgstr "balíčky z uživatelských stránek" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Tento dialog zobrazuje všechny dostupné balíky, ale umožňuje\n" "upgrade nebo odinstalaci pouze z" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Do tohoto adresáře budou nainstalovány také nové balíčky. Ostatní místa musí být řízena alternativními prostředky." #: thonny/plugins/pip_gui.py:485 msgid "Installed version:" msgstr "Nainstalovaná verze:" #: thonny/plugins/pip_gui.py:487 msgid "Installed to:" msgstr "Nainstalováno do:" #: thonny/plugins/pip_gui.py:538 msgid "Please check your spelling!" msgstr "Prosím, zkontrolujte zápis" #: thonny/plugins/pip_gui.py:542 msgid "Could not find the package info from PyPI." msgstr "Není možné najít informace o balíku z PyPI" #: thonny/plugins/pip_gui.py:544 thonny/plugins/pip_gui.py:1326 msgid "Error code:" msgstr "Chybový kód:" #: thonny/plugins/pip_gui.py:689 msgid "Can't find package name from the list:" msgstr "Nemůžu najít balík ze seznamu:" #: thonny/plugins/pip_gui.py:744 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Balík '{}' je požadován pro instalaci a odinstalaci ostatních balíků" #: thonny/plugins/pip_gui.py:789 msgid "Package" msgstr "Balík" #: thonny/plugins/pip_gui.py:902 msgid "Manage packages for %s" msgstr "Spravovat balíky pro %s" #: thonny/editors.py:571 thonny/plugins/micropython/pip_gui.py:23 #: thonny/plugins/pip_gui.py:953 msgid "Confirmation" msgstr "Potvrzení" #: thonny/plugins/pip_gui.py:954 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Vypadá to že instalujete balík do Thonny.\n" "Pokud chcete instalovat Thonny plugin,\n" "potom vyberte 'Nástroje - Spáva pluginů'\n" "\n" "Určitě chcete instalovat %s bro back-end?" #: thonny/plugins/pip_gui.py:1059 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "!Zřejmě existuje další verze která je kompatibilní s aktuální\n" "verzí Thonny. Klikněte na '...' pro výběr verze k instalaci!" #: thonny/plugins/pip_gui.py:1067 msgid "Thonny plugin without requirements" msgstr "Thonny plugin bez požaradků" #: thonny/plugins/pip_gui.py:1083 msgid "Unsuitable requirements" msgstr "Nesplnitelné požadavky" #: thonny/plugins/pip_gui.py:1084 msgid "This package requires different Thonny version:" msgstr "Tento balík vyžaduje jinou verzi Thonny:" #: thonny/plugins/pip_gui.py:1088 msgid "If you still want it, then please install it from the command line." msgstr "Pokud to stále chcete, instalujte to z příkazového řádku" #: thonny/plugins/pip_gui.py:1125 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "!Je potřeba resatartovat Thonny po instalaci / upgrade / odinstalaci pluginu!" #: thonny/plugins/pip_gui.py:1135 msgid "Thonny plug-ins" msgstr "Thonny pluginy" #: thonny/plugins/pip_gui.py:1171 msgid "Advanced install / upgrade / downgrade" msgstr "Rozšířená instalace / upgrade / downgrade" #: thonny/plugins/pip_gui.py:1180 msgid "Desired version" msgstr "Žádaná verze" #: thonny/plugins/pip_gui.py:1239 msgid "Upgrade dependencies" msgstr "Závislosti upgrade" #: thonny/plugins/pip_gui.py:1324 msgid "Requires:" msgstr "Vyžadje:" #: thonny/plugins/pip_gui.py:1328 msgid "Error:" msgstr "Chyba:" #: thonny/plugins/pip_gui.py:1541 msgid "Manage packages..." msgstr "Spravovat balíky" #: thonny/plugins/pip_gui.py:1547 msgid "Manage plug-ins..." msgstr "Spravovat pluginy" #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "Otevřít prohlížeč historie" #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "Změnit pracovní adresář na adresář skriptu při Spuštění / Debugu" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Zobrazit volání funkcí (rámce) v samostatných oknech" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "Zrušte zaškrtnutí, pokud chcete více tradiční uživatelské prostředí." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Otevřít a zavřít pohled na zásobník automaticky" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Otevře první zobrazení zásobníku a zavře jej, když se program vrátí do hlavního snímku." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Umožnit vstupovat do knihoven (například mimo adresář hlavního skriptu)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Může zpomalit debuging" #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "Preferovaný debugger" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(používá se po kliknutí na tlačítko Debug na panelu nástrojů)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr " Birdseye port " #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(restartujte Thonny po této změně)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Spustit & Debugouvat" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Emulace Terminálu" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "podporuje základní ANSI barvy a styly" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Maximální počet řádků" #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "!Velké hodnoty mohou způsobit nízký výkon!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maximální délka řádky před zalomením" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Spustit aktuální skript v terminálu" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Po skončení programu zobrazí Python REPL" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Nechat otevřený terminál po ukončení Python programu" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "Pozn. V nastavení terminálu musí být povoleno automatické zavírání\n" "(Profily → Shell → Když skočí z shellu)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminál" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "Motiv UI" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Motiv syntaxe" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Font editoru" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "IO písmo" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Náhled" #: thonny/plugins/theme_and_font_config_page.py:151 msgid "This is a comment" msgstr "Tohle je komentář" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "The answer is" msgstr "Odpověď je" #: thonny/plugins/theme_and_font_config_page.py:158 msgid "unclosed_string" msgstr "unclosed_string" #: thonny/plugins/theme_and_font_config_page.py:160 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:184 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "!Některé změny stylu se projeví až po restartu Thonny!" #: thonny/plugins/theme_and_font_config_page.py:223 msgid "Enter an integer" msgstr "Zapište celé číslo" #: thonny/plugins/theme_and_font_config_page.py:236 msgid "Theme & Font" msgstr "Motiv & Písmo" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Otevřít adresář programu Thonny" #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Otevřít adresář dat Thonny" #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Domů" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Obsah nápovědy" #: thonny/plugins/micropython/mp_front.py:300 msgid "CircuitPython device" msgstr "CircuitPython zařízení" #: thonny/plugins/micropython/mp_front.py:304 msgid "MicroPython device" msgstr "MicroPython zařzení" #: thonny/plugins/micropython/mp_front.py:541 msgid "Connect your device to the computer and select corresponding port below" msgstr "Připojte zařízení k počítači a vyberte odpovídající port" #: thonny/plugins/micropython/mp_front.py:544 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "zkontrolujte název zařízení, např. \"USB Serial\" nebo \"UART\"" #: thonny/plugins/micropython/mp_front.py:546 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Pokud jej nemůžete najít, možná musíte nedříve nainstalovat správný ovladač." #: thonny/plugins/micropython/mp_front.py:439 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:449 msgid "Try to detect port automatically" msgstr "Zkusti detekovat port automaticky" #: thonny/plugins/micropython/__init__.py:25 msgid "MicroPython (generic)" msgstr "MicroPython (generic)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Tisk..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Otevřít systémový shell" #: thonny/plugins/backend_config_page.py:110 msgid "Details" msgstr "Detaily" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Instalace ze souboru požadavků (requirements.txt)" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Instalovat z lokálního souboru" #: thonny/plugins/pip_gui.py:1118 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Toto okno je pro správu pluginů Thonny a jejich závislostí.\n" "Pokud chcete instalovat pluginy pro vlatní programy, potom vyberte 'Nástroje - Spravovat balíky'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (generic)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Zvětšit odstazení o úroveň" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "Zmenšit odstazení o úroveň" #: thonny/workbench.py:1471 msgid "Switch to\n" "regular\n" "mode" msgstr "Přepnout do\n" "běžného\n" "režimu" #: thonny/plugins/microbit/__init__.py:58 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Ujistěte se že na micro:bit je nainstalován MicroPython" #: thonny/plugins/microbit/__init__.py:60 msgid "Don't forget that main.py only works without embedded main script." msgstr "Nezapomeňte, že main.py funguje pouze bez vloženého hlavního skriptu." #: thonny/plugins/micropython/uf2dialog.py:44 msgid "please wait" msgstr "prosím čekejte" #: thonny/misc_utils.py:151 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Nenalezen disk '%s'. Chcete jej najít sám(a)?" #: thonny/misc_utils.py:154 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Nalezeno několik '%s' disků. Chcete jeden vybrat?" #: thonny/misc_utils.py:170 msgid "Can't find suitable disk" msgstr "Není možné najít vhodný disk" #: thonny/base_file_browser.py:287 msgid "%d items" msgstr "%d položek" #: thonny/base_file_browser.py:736 msgid "Move to Trash" msgstr "Přesunout do koše" #: thonny/base_file_browser.py:739 msgid "Delete" msgstr "Smazat" #: thonny/base_file_browser.py:718 thonny/base_file_browser.py:869 msgid "New directory" msgstr "Nový adresář" #: thonny/base_file_browser.py:742 msgid "Properties" msgstr "Vlastnosti" #: thonny/base_file_browser.py:744 msgid "Storage space" msgstr "Úložiště" #: thonny/base_file_browser.py:754 msgid "Path" msgstr "Cesta" #: thonny/base_file_browser.py:756 msgid "Directory properties" msgstr "Vlastnosti adresáře" #: thonny/base_file_browser.py:758 msgid "File properties" msgstr "Vlastnosti souboru" #: thonny/base_file_browser.py:760 msgid "bytes" msgstr "bajtů" #: thonny/base_file_browser.py:763 msgid "Size" msgstr "Velikost" #: thonny/base_file_browser.py:93 thonny/base_file_browser.py:774 msgid "Modified" msgstr "Změněno" #: thonny/base_file_browser.py:833 msgid "Deleting %s" msgstr "Mažu %s" #: thonny/editors.py:253 msgid "Loading" msgstr "Nahrávám" #: thonny/editors.py:382 msgid "Saving" msgstr "Ukládám" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Nahrát do %s" #: thonny/plugins/files.py:417 msgid "Downloading %s to %s" msgstr "Stahuju %s do %s" #: thonny/plugins/files.py:323 msgid "Download to %s" msgstr "Stáhnout do %s" #: thonny/base_file_browser.py:643 msgid "Open in system file manager" msgstr "Otevřít v systémovém správci souborů" #: thonny/base_file_browser.py:671 msgid "Hide hidden files" msgstr "Skrýt skryté soubory" #: thonny/base_file_browser.py:671 msgid "Show hidden files" msgstr "Zobrazit skryté soubory" #: thonny/base_file_browser.py:654 msgid "Open in Thonny" msgstr "Otevřít v Thonny" #: thonny/base_file_browser.py:685 msgid "Open in system default app" msgstr "Otevřít v systémové výchozí aplikaci" #: thonny/base_file_browser.py:666 thonny/base_file_browser.py:693 msgid "Configure %s files" msgstr "Nastavit %s soubory" #: thonny/base_file_browser.py:694 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Co se má stát s %s souborem když na něj poklepete v Thonnyho souborovém dialogu?" #: thonny/base_file_browser.py:1240 thonny/editors.py:953 thonny/editors.py:955 msgid "Deleting" msgstr "" #: thonny/base_file_browser.py:1247 msgid "Creating directory" msgstr "" #: thonny/editors.py:251 msgid "Loading %s" msgstr "" #: thonny/editors.py:377 msgid "Saving to %s" msgstr "" #: thonny/editors.py:702 thonny/editors.py:704 msgid "Save All files" msgstr "Uložit všechny soubory" #: thonny/plugins/backend_config_page.py:340 thonny/workbench.py:869 msgid "Configure interpreter..." msgstr "" #: thonny/workbench.py:1581 msgid "Device" msgstr "Zařízení" #: thonny/workdlg.py:193 msgid "Cancelling" msgstr "" #: thonny/workdlg.py:220 msgid "Starting" msgstr "" #: thonny/plugins/backend_config_page.py:251 msgid "Authentication" msgstr "" #: thonny/plugins/backend_config_page.py:253 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "" #: thonny/plugins/backend_config_page.py:256 msgid "Enter your password for\n" "{}" msgstr "Zadejte svoje heslo pro\n" "{}" #: thonny/plugins/object_inspector.py:487 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "" #: thonny/plugins/pip_gui.py:645 msgid "Search results" msgstr "Výsledky vyhledávání" #: thonny/plugins/pip_gui.py:646 msgid "Searching" msgstr "Vyhledávání" #: thonny/plugins/pip_gui.py:728 thonny/plugins/pip_gui.py:817 msgid "Installing '%s'" msgstr "Instalování '%s'" #: thonny/plugins/pip_gui.py:734 msgid "Upgrading '%s'" msgstr "" #: thonny/plugins/pip_gui.py:741 msgid "Uninstalling '%s'" msgstr "Odinstaluje se '%s'" #: thonny/plugins/pip_gui.py:755 msgid "Installing" msgstr "" #: thonny/plugins/pip_gui.py:1502 msgid "Package manager is not available for this interpreter" msgstr "Správce balíčků není v tomto interpretru dostupný" #: thonny/base_file_browser.py:1191 thonny/plugins/pip_gui.py:1516 msgid "Not supported" msgstr "" #: thonny/plugins/micropython/pip_gui.py:100 thonny/plugins/pip_gui.py:1521 msgid "Not available" msgstr "" #: thonny/plugins/pip_gui.py:1522 msgid "You need to stop your program before launching the package manager." msgstr "" #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Otevřít vyhodnocené hodnoty v Inspektoru objektů" #: thonny/plugins/cpython_frontend/cp_front.py:208 msgid "Python executable" msgstr "" #: thonny/plugins/cpython_frontend/cp_front.py:231 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Vzdálený Python 3 (SSH)" #: thonny/plugins/micropython/mp_front.py:310 msgid "Not connected" msgstr "" #: thonny/plugins/micropython/mp_front.py:515 msgid "Advanced options" msgstr "Pokročílé volby" #: thonny/plugins/micropython/mp_front.py:547 msgid "Install or update firmware" msgstr "Nainstalovat nebo aktualizovat firmware" #: thonny/plugins/micropython/__init__.py:36 msgid "MicroPython (local)" msgstr "MicroPython (lokální)" #: thonny/plugins/micropython/__init__.py:47 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:77 msgid "Scope" msgstr "Rozsah" #: thonny/plugins/micropython/pip_gui.py:90 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "" #: thonny/plugins/micropython/pip_gui.py:99 msgid "New packages will be installed to" msgstr "Nové balíčky budou nainstalovány do" #: thonny/plugins/micropython/pip_gui.py:102 msgid "no absolute lib directory in sys.path" msgstr "" #: thonny/plugins/micropython/uf2dialog.py:39 msgid "Version to be installed" msgstr "Verze která se má nainstalovat" #: thonny/plugins/micropython/uf2dialog.py:47 msgid "Target device location" msgstr "" #: thonny/plugins/micropython/uf2dialog.py:58 msgid "Target device model" msgstr "" #: thonny/plugins/micropython/uf2dialog.py:146 msgid "Please wait" msgstr "Vyčkejte prosím" #: thonny/plugins/pip_gui.py:70 msgid "Search on PyPI" msgstr "" #: thonny/base_file_browser.py:686 msgid "Open in Thonny's text editor" msgstr "Otevřít v editoru v Thonny" #: thonny/base_file_browser.py:339 msgid "Storage space on this drive or filesystem" msgstr "" #: thonny/base_file_browser.py:340 msgid "total space" msgstr "" #: thonny/base_file_browser.py:342 msgid "used space" msgstr "" #: thonny/base_file_browser.py:343 msgid "free space" msgstr "volné místo" #: thonny/base_file_browser.py:350 msgid "Storage info" msgstr "" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "Nahradit tabulátory mezerami" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Zvýraznit znaky tabulátoru" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "" #: thonny/base_file_browser.py:91 thonny/memory.py:63 msgid "Name" msgstr "Jméno" #: thonny/base_file_browser.py:95 msgid "Size (bytes)" msgstr "Velikost (v bajtech)" #: thonny/base_file_browser.py:870 msgid "Enter name for new directory under\n" "%s" msgstr "Zadejte jméno nové složky v\n" "%s" #: thonny/base_file_browser.py:893 msgid "Nothing selected" msgstr "Nic není vybráno" #: thonny/base_file_browser.py:893 msgid "Select an item and try again!" msgstr "Vyberte položku a zkuste to znovu!" #: thonny/base_file_browser.py:1311 msgid "Open from %s" msgstr "Otevřít z '%s'" #: thonny/base_file_browser.py:1314 msgid "Save to %s" msgstr "Uložit do '%s'" #: thonny/base_file_browser.py:1333 msgid "File name:" msgstr "Jméno souboru:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value ID" msgstr "" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:540 #: thonny/plugins/object_inspector.py:619 msgid "Value" msgstr "Hodnota" #: thonny/plugins/backend_config_page.py:274 msgid "Save password" msgstr "Uložit heslo" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Volání funkce na %s" #: thonny/plugins/debugger.py:1003 msgid "Local variables" msgstr "Lokální proměnné" #: thonny/plugins/debugger.py:1035 msgid "Function" msgstr "Funkce" #: thonny/plugins/debugger.py:1036 msgid "Location" msgstr "" #: thonny/plugins/debugger.py:1112 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "" #: thonny/plugins/heap.py:22 msgid "ID" msgstr "" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "" #: thonny/plugins/object_inspector.py:538 msgid "Index" msgstr "" #: thonny/plugins/object_inspector.py:616 msgid "Key ID" msgstr "ID klíče" #: thonny/plugins/object_inspector.py:617 msgid "Key" msgstr "Klíč" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Zpět na %s" #: thonny/plugins/micropython/mp_front.py:439 msgid "Port or WebREPL" msgstr "" #: thonny/plugins/micropython/mp_front.py:583 msgid "Password" msgstr "Heslo" #: thonny/plugins/debugger.py:961 msgid "Source code" msgstr "Zdrojový text" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Použít Tk souborové dialogy namísto Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "" #: thonny/base_file_browser.py:715 msgid "New file" msgstr "Nový soubor" #: thonny/base_file_browser.py:733 msgid "Rename" msgstr "Přejmenovat" #: thonny/base_file_browser.py:919 msgid "Rename '%s'" msgstr "Přejmenovat '%s'" #: thonny/base_file_browser.py:919 msgid "Enter new name" msgstr "Zadejte nové jméno" #: thonny/base_file_browser.py:1007 msgid "Paste failed" msgstr "Vkládání se nezdařilo" #: thonny/base_file_browser.py:1007 msgid "There are conflicting folders" msgstr "" #: thonny/base_file_browser.py:1129 msgid "File already exists" msgstr "Soubor již existuje" #: thonny/base_file_browser.py:1194 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "" #: thonny/editors.py:35 msgid "Python files" msgstr "Pythonové soubory" #: thonny/editors.py:119 thonny/editors.py:182 msgid "" msgstr "" #: thonny/editors.py:146 msgid "File is gone" msgstr "" #: thonny/editors.py:149 msgid "Do you want to also close the editor?" msgstr "" #: thonny/editors.py:165 msgid "External modification" msgstr "Externí modifikace" #: thonny/editors.py:168 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "" #: thonny/editors.py:572 msgid "Python files usually have .py extension." msgstr "Pythonové soubory mají obvykle příponu .py." #: thonny/editors.py:574 msgid "Did you mean '%s'?" msgstr "Měli jste na mysli '%s'?" #: thonny/editors.py:733 msgid "Move / rename..." msgstr "Přesunout / přejmenovat..." #: thonny/editors.py:742 msgid "Go to line..." msgstr "Přejít na řádek..." #: thonny/editors.py:977 msgid "Line number" msgstr "Číslo řádku" #: thonny/editors.py:1123 msgid "Do you want to save files before closing?" msgstr "Chcete soubory uložit před zavřením?" #: thonny/editors.py:1125 msgid "Do you want to save file before closing?" msgstr "Chcete soubor uložit před zavřením?" #: thonny/editors.py:1128 msgid "Save On Close" msgstr "Uložit při zavření" #: thonny/misc_utils.py:513 msgid "Command not available" msgstr "Příkaz není k dispozici" #: thonny/misc_utils.py:514 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Tento příkaz není k dispozici v Thonny spuštěném z Flatpacku" #: thonny/workbench.py:686 thonny/workbench.py:786 msgid "Support Ukraine" msgstr "Podpořte Ukrajinu" #: thonny/plugins/backend_config_page.py:91 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Který interpretr má Thonny použít ke spuštění vašeho kódu?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Zobrazit informace o parameterech" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Automaticky zobrazit parametry po napsání '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Automaticky našeptávat zatímco píšete" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Automaticky zobrazit dokumentaci v našeptávači" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "" #: thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Problém" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Nepodařilo se najít definici" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Vyčistit shell před spuštěním nového procesu (Spustit, Debugovat, Zastavit/Restartovat, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:170 msgid "Thonny's Python" msgstr "Thonnyho Python" #: thonny/plugins/micropython/mp_front.py:487 msgid "Interrupt working program on connect" msgstr "" #: thonny/plugins/micropython/mp_front.py:494 msgid "Synchronize device's real time clock" msgstr "" #: thonny/plugins/micropython/mp_front.py:500 msgid "Use local time in real time clock" msgstr "" #: thonny/plugins/micropython/mp_front.py:506 msgid "Restart interpreter before running a script" msgstr "Restartuje interpretr než spustíte skript" #: thonny/plugins/micropython/pip_gui.py:24 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Tohle nevypadá jako balíček pro MicroPython/CircuitPython.\n" "Jste si jistí, že jej chcete nainstalovat." #: thonny/base_file_browser.py:844 msgid "Moving to Trash" msgstr "Přesouvám do koše" #: thonny/base_file_browser.py:845 msgid "Move %s to Trash?" msgstr "Přesunout '%s' do koše?" #: thonny/base_file_browser.py:852 msgid "Moving %s to Trash" msgstr "Přesouvám '%s' do koše" #: thonny/base_file_browser.py:659 msgid "Open in default external app" msgstr "Otevřít ve výchozí externí aplikaci" #: thonny/base_file_browser.py:1192 msgid "Opening remote files in external app is not supported." msgstr "Otevírání vzdálených souborů v externí aplikaci není podporováno." #: thonny/base_file_browser.py:1199 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Pokud je potřeba otevřít soubor v externí aplikaci, uložte jej do lokální složky a otevřete jej odtamtud!" #: thonny/editors.py:147 msgid "Looks like '%s' was deleted or moved." msgstr "Zdá se že '%s' byl smazán nebo přesunut." #: thonny/editors.py:166 msgid "Looks like '%s' was modified outside of the editor." msgstr "Vypadá to že '%s' byl změněný mimo editor." #: thonny/plugins/cpython_frontend/cp_front.py:229 msgid "NB! Thonny only supports Python %s and later" msgstr "Poznámka: Thonny podporuje jen Python %s a novější" #: thonny/editors.py:977 msgid "Go to line" msgstr "Přejít na řádek" #: thonny/workbench.py:689 msgid "Support" msgstr "Podpora" #: thonny/editors.py:386 thonny/editors.py:401 msgid "Could not save" msgstr "Ukládání se nezdařílo" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Varování" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Když napíšete hodnotu proměnné prostředí do uvozovek, tyto uvozovky se stanou součástí hodnoty proměnné.\n" "Opravdu to tak chcete udělat?" #: thonny/workbench.py:859 msgid "Install MicroPython" msgstr "" #: thonny/workbench.py:863 msgid "Install CircuitPython" msgstr "" #: thonny/plugins/backend_config_page.py:212 msgid "Make uploaded shebang scripts executable" msgstr "" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "" #: thonny/plugins/micropython/pip_gui.py:77 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "" #: thonny/plugins/todo_view.py:42 msgid "Line" msgstr "" #: thonny/plugins/todo_view.py:43 msgid "Info" msgstr "" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "" #: thonny/plugins/circuitpython/cirpy_front.py:98 #: thonny/plugins/micropython/mp_front.py:530 msgid "Install or update %s" msgstr "" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "" #: thonny/plugins/cpython_frontend/cp_front.py:239 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "" #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/thonny/locale/de_DE/0000775000175000017500000000000014307363733016376 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6861067 thonny-4.0.1/thonny/locale/de_DE/LC_MESSAGES/0000775000175000017500000000000014307363733020163 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1661185392.0 thonny-4.0.1/thonny/locale/de_DE/LC_MESSAGES/thonny.mo0000664000175000017500000010520314300726560022032 0ustar00annamaaannamaal$)   /<&Y!D&  )4C J.X02  x  &  ' 6 ;G    G  !!! ! '!4! J!V!!" "G&"n"s""""<"%"*#J#Y#l########3$<$O$e$v$}$ $$$$$$$!$ %%!%LG%%(%)%& &B'&j&o&~&&& &&%&&&/'>'.Y'' ''' '' ''''' ( ((/(5(:(I( O( \( g(s((=#) a)m)v)) ) ))0)) ))6*=*W*p********{*LV+m+F,X,m -C---7-3.9.>.F.\.p..... .. // %/1/$E/j/3o/////// /// /00$0-0%F03l00zu1%1;2(R2{222 212 2343F3\3p3333 333n3O4,$50Q5<55,S6U666 66n6!e7 77 7 7 77777?8CH888'8)8 9$939P9m9999969T : ^:i:m:u: z:::H:5:#;7;@; F;S;X;l;; ;;:;;; <$<&C<j<r<<<<< < < <<< <( =3=G=L= ^=Bk=== === =&=> >,> E> S>`>)p>+>> >+>? ? ? ?)?6rlur rrrrss-s>3s;rsss sss!s0t,Bt ot|t4tttt.t$u9uBu Tu`uhu{u u u uuuu5u*v=vEv^vTpvv vvv ww2.waw jw%xwwww*w'w !x +x,6x cx nxyxxx'xx'y )y3yIycywyyyyyyyyzzz-z1>z5pz>z;z!{ 7{E{8V{{{{{{ {{|%|B|K| ]| g| q|||| |2|}} }9}*R} }}}}}}}}}}z})l~~#~~1\JY]6΁ ݂ *?)FpyG߃  8 ="KnE4",OT \fw.ȅUЅM&t# D#E: C) ))6S``)=Up%d items(restart Thonny after changing this)(used when clicking Debug toolbar button)About BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAdvanced optionsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...HeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyVersion to be installedViewVisualize current script at Python TutorWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentMIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: POEditor.com Project-Id-Version: Thonny Language: de %d Elemente(Nach dieser Änderung Thonny neu starten)(wird beim Klicken auf die Schaltfläche Debuggen in der Symbolleiste verwendet)Über Birdseye (Debugger)Über ThonnyVirtuelle Umgebung aktivierenErweitertes Installieren / Aktualisierung / DowngradeErweiterte OptionenNur eine Instanz von Thonny zulassenWechseln in Bibliotheken erlauben (dh außerhalb des Hauptskriptverzeichnisses)Bist du sicher, dass du es deinstallieren möchtest?AssistentAttributeAuthentifizierungAutorAutovervollständigenBiete beim Tippen Auto-Vervollständigen anZeige automatisch Doku für VervollständigungenZeige automatisch Parameter-Info nach Eingabe von '('ZurückZurück nach %sZurück zum aktuellen FrameOrdner nicht leerBirdseye ist ein Python-Debugger, der separat installiert werden muss. Möchtest du die Hilfe-Seite öffnen und mehr erfahren?Birdseye portPakete durchsuchenBugtrackerSchließen noch nicht möglichPaketname kann in der Liste nicht gefunden werden:Geeignetes Laufwerk kann nicht gefunden werdenAbbrechenAbbrechenGroß-/Kleinschreibung beachtenSchriftgröße ändernÄndern Sie das Arbeitsverzeichnis in das Skriptverzeichnis unter "Ausführen / Debuggen"CircuitPython (generic)CircuitPython deviceLeerenLeere Terminal-Fenster vor Start des neuen Prozesses (ausführen, debuggen, Stop/Restart, ...) Kommandozeile leerenKlickKlick SchließenAlle schließenAndere schließenBefehl nicht verfügbarAuskommentierenKonfiguration wurde geändert. Thonny neu starten um im Standard-Modus zu arbeiten. (siehe "Extras > Optionen > Allgemeines" wenn Sie sich anders entscheidenKonfiguriere %s DateienDen Interpreter konfigurieren ...BestätigungVerbinden Sie Ihr Gerät mit dem Computer und wählen Sie den relevanten Port unten ausKopierenKopie in ZwischenablageKopierenKopiere %s nach %sDefinition nicht gefundenKonnte Laufwerk '%s' nicht finden. Möchten das Laufwerk selbst suchen?Das Paket konnte nicht in PyPI gefunden werden.Paketinformation von PyPI kann nicht gefunden werdenKonnte nicht gespeichert werdenErstelle VerzeichnisVirtuelle Umgebung erzeugenAusschneidenDatenDebuggenAktuelles Skript debuggenAktuelles Skript debuggen (birdseye)Aktuelles Skript debuggen (schneller)Aktuelles Skript debuggen (besser) Debug-Modus (liefert detaillierteres Diagnoseprotokoll)Schrift verkleinernDedent selektierte Zeilen (entf. Leerzeichen am Zeilenanfang)Standard-PasswortLöschenLöschen%s löschenGewünschte VersionDetailsGerätMeintest Du '%s'?Ordner EigenschaftenBenachrichtigungston deaktivierenAbgewählte Prüfungen (eine ID per Zeile)Verbindung unterbrechenWillst Du auch den Editor schließen?Willst Du den jetzigen Editor-Inhalt verwerfen und die Datei von der Platte neu laden?Wollen Sie '%s' überschreiben?Willst Du vor dem Schließen speichern?Willst Du die Dateien vor dem Schließen speichern?Benutzerfenster andockenDokumentationVergessen Sie nicht, dass main.py nur ohne eingebettetes Hauptskript funktioniert.UntenDownload nach %sDownloading %s nach %sBearbeitenEditorSchriftart Editor Ganzzahl eingebenGebe einen Namen für ein neues Verzeichnis ein unter %sNeuen Namen eingebenGib die zu ersetzende Zeichenkette ein.Geben sie Ihren persönlichen Passwort-Satz für {} eingeben Sie hier Ihr Passwort für {} einUmgebungs-Variablen (jeweils eine pro Zeile)FehlerFehler-Code:Fehler:EreignisseAusnahmeBeendenThonny schließenProtokoll Dateien exportien ...Externe VeränderungDateiDatei existiert bereitsDatei ist verschwundenDateiname:Datei EigenschaftenDateienSuchenSuchen & ErsetzenSuchen:Editor aktivierenCursor inTerminal aktivierenSchrift-SkalierungsmodusAus Performancegründen werden sehr lange Zeilen nicht vollständig gezeigt (siehe Extras > Optionen > Kommandozeile). Hier können Sie den originalen Textabschnitt beeinflussen.Es wurden mehrere '% s' Laufwerke gefunden. Möchten Sie selbst eines auswählen?VollbildFunktionFunktionsaufruf bei %sAllgemeinesGehe zu ZeileGehe zu Zeile ...HeapHeap-Modus ist an. Schließe Heap-Ansicht um ihn auszuschalten.HilfeHilfe InhaltVersteckte Dateien ausblendenAktuelle Zeile hervorheben (erfordert erneutes Öffnen des Editors)Lokale Variablen hervorhebenÜbereinstimmende Namen hervorhebenKlammern hervorhebenSyntax-Elemente hervorhebenHebe Tabulatorzeichen hervorHomeHomepageIDInstallierenSchriftart TerminalWenn dies eine Textdatei ist, kannst Du es automatisch mit Thonny öffnen, indem Du rechts klickst und 'Konfiguriere ... Dateien' wählstFalls das letzte Kommando eine Exception (interrupt) ausgelöst hat, dann wird in diesem Fenster der zugehörige Stack gezeigtWenn die Datei in einer externen App, geöffnet werden muss, dann lade sie in ein lokales Verzeichnis und öffne sie von dort!Falls Sie es nicht finden, müssen Sie ggf. erst den richtigen USB-Treiber installieren.Wenn Sie nicht wissen, woher Sie das Paket beziehen können, sollten Sie den Python-Paketindex durchsuchen. Geben Sie den Anfang des Paketnamens in das Suchfeld oben ein und drücken die EINGABETASTE .Wenn der Wert einer Umgebungsvariable in Anführungszeichen gesetzt wird, werden die Anführungszeichen Teil des Werts. Ist das beabsichtigt?Falls Sie das trotzdem möchten, dann benutzen Sie bitte die Kommandozeile. Schrift vergrößernAusgewählte Zeilen einrückenEinrücken mit Tab (für Python nicht empfohlen)IndexInfoInstallierenCircuitPython installierenMicroPython installierenInstalliere von PyPIInstallieren mit lokalen DateienInstallieren mit requirements.txt Datei%s installieren oder aktualisierenInstallieren oder aktualisieren Sie die FirmwareInstalliert inInstallierte VersionInstalliereInstalliere '%s'InterpreterAusführung abbrechenBeim Verbinden laufendes Programm unterbrechenIntoNach Programmende Terminal geöffnet lassen.SchlüsselSchlüssel-IDSpracheNeueste stabile VersionNeueste VersionZeileZeilennummerLadenwird geladenLade %sLokales Python 3Lokale VariablenOrtProgrammereignisse protokollierenAnscheinend wurde '%s' gelöscht oder verschoben.Anscheinend wurde '%s' außerhalb des Editors geändert.Es scheint, Sie wollen ein Thonny zugehöriges Paket installieren. Falls es ein Thonny Plug-in ist, dann wählen Sie bitte 'Extras > Verwaltung Plug-ins'... Sind Sie sicher, dass Sie %s als Backend installieren wollen?Hergestellt an der Universität Tartu, Estland, mit Hilfe der Open-Source-Community, Raspberry Pi Foundation und Cybernetica ASGespeicherte Shebang-Skripte ausführbar machenStellen Sie sicher, dass MicroPython auf Ihrem micro: bit installiert ist.Hochgeladene Shebang-Skripte ausführbar machenVerwalte Pakete für %sVerwalte Pakete ...Verwalte Plug-ins ...Ansicht maximierenMaximal angezeigte Zeichenlänge bis zum VerschiebenMaximale Anzahl der Zeilen, die beibehalten werden sollen.Kann das Debuggen verzögern.MicroPython(über SSH)MicroPython (generic)MicroPython (lokal)MicroPython deviceGeändert%s in den Papierkorb schieben?Verschieben / Umbenennen von ...In den Papierkorb verschiebenSchiebe %s in den PapierkorbIn den Papierkorb schiebenHinweis: Das automatische Schließen muss in den Einstellungen des Terminals aktiviert sein (Hinweis: Die Dateiauswahl funktioniert möglicherweise nicht richtig, wenn Programme aus einer virtuellen Umgebung heraus aufgerufen werden. In diesem Fall ist das 'activate' Script anstelle des Interpreters zu wählen (oder der Pfad direkt in der Eingabebox einzugeben).Hinweis: Große Werte können zu Geschwindigkeitsverlust führen!Notiz: Thonny nach Änderung dieser Optionen neu starten!Hinweis: Einige Einstellungen ändern sich erst nach einem Neustart von Thonny!Hinweis: Möglicherweise ist eine andere kompatible Version für Ihre Thonny-Version verfügbar. Klicken Sie den '...'-Button um die zu installierende Version auszuwählen.Achtung! Thonny unterstützt nur Python %s und neuerHinweis: Sie müssen Thonny nach der Installation / Aktualisierung / Deinstallation eines Plugins neu starten.NameNeuNeuer OrdnerNeue DateiNeue Pakete werden ebenso in diesen Ordner installiert. Andere Ordner müssen mit alternativen Verfahren verwaltet werden.Neue Pakete werden installiert inNächstes ObjektKeine mit #todo markierte Zeile gefundenNicht verfügbarNicht verbundenNicht unterstütztNotizenNichts ausgewähltOKObjektinspektorAssistenten automatisch öffnen, wenn er Warnungen für deinen Code hatAssistenten automatisch öffnen, wenn das Programm mit einer Ausnahme abstürztArbeitsverzeichnis von Thonny öffnen ...Installationsverzeichnis von Thonny öffnen ...Stack View automatisch öffnen und schließenSehen Sie den Wert des Ausdruckes im Objekt-InspektorÖffnen von %sÖffnen in ThonnyIn Thonnys Texteditor öffnenÖffne in externer Standard-AppÖffnen in der Systemstandard-AppIm Systemdateimanager öffnenLogdatei schreibenSystem Terminal öffnen ...Öffnen ...Remote-Dateien können nicht in externer App geöffnet werden.Stack View beim ersten Aufruf öffnen und bei Programmreturn schließen um zum Hauptfenster zurückzukehren.Optionen...HerausUmrissÜberÜberschreiben?Theme überschreiben ' %s'PaketZur Installation und Deinstallation ist Paket '{}' notwendig. für diesen Interpreter ist kein Package-Manager verfügbarOrdner für PaketePasswortEinfügenEinfügen gescheitertPfadMyPy-Überprüfungen durchführenAusgewählte Pylint-Überprüfungen durchführenBitte überprüfen Sie Ihre Rechtschreibung!Bitte wartenDruckenDrucker visualisiert Anzahl von Nummern im Terminal.PortPort oder WebREBLBevorzugter DebuggerVorbereitungen (überspringe den VS-Code-Teil)Zeige Python REPL nach Programmende.VorschauVorheriges ObjektDrucken ...ProblemProgramm-ArgumenteProgramm-Argumente:ProgrammbaumEigenschaftenPyPi-SeitePygame Zero-ModusAusführbares Python-ProgrammPython-DateienPython-Dateien haben üblicherweise die Endung '.py'.Python-InterpreterBeendenWirklich deinstallieren?Zuletzt verwendetEmpfohlene maximale Zeilenlänge (Auf 0 einstellen, um die Randlinie auszuschalten.)WiederherstellenAktualisierenStandard-ModusNichtlokales Python 3 über SSHUmbenennenBenenne '%s' umAlle Dateien der vorherigen Sitzung erneut öffnenErsetzenAlle ersetzenErsetze Tabulatoren durch LeerzeichenErsetzen durch:Ersetzen+SuchenProbleme meldenAutovervollständigen mit Tab in der ShellAutovervollständigen mit Tab im EditorBenötigtBenötigt:Vor Start des Skript Interpreter neu startenFortfahrenAusführenAusführen & DebuggenAusführen / fortfahrenAktuelles Skript ausführenAktuelles Skript in Terminal ausführenBis Cursor ausführenAktuelles Skript in Terminal ausführenSpeichernSpeicher Alle DateienBeim Schließen speichernSpeichern unter ...Kopie speichern ...Passwort SpeichernSpeichern nach %sspeichern läuftSpeichern nach %sGeltungsbereichSuche auf PyPISuchergebnisseSuchenDetails siehe HilfeAlles auswählenAlles auswählenWählen Sie ein Item und versuchen Sie es erneut!Leeren Ordner für neue virtuelle Umgebung auswählenWähle aus, falls Dialoge hinter dem Hauptfenster verschwindenOrdner ist nicht leer, wähle einen Anderen oder breche ab.EOF senden / NeustartKommandozeileDrucker anzeigenFunktionsaufrufe in separaten Fenstern (Frames) anzeigenVersteckte Dateien anzeigenZeilennummern anzeigenZeige Parameter-InfoGrößeGröße (Bytes)Quellcodegekürzter Text (%d Zeichen)StackBeginne links die Pakete auszuwählenBeginnenZurück schreitenEintretenVerlassenEinzelschrittAusführung beendenStopp/Restart ausführenSpeicherinformationSpeicherplatzSpeicherplatz auf diesem Laufwerk oder DateisystemZusammenfassungUnterstützungUnterstütze die UkraineWechsle zu Standard ModeSynchronisiere die Echtzeituhr des GerätsSyntax ThemeToDoZielOrt im Ziel-GerätModell des Ziel-GerätesZielTerminalTerminal-EmulationDie Antwort istDer gezeigte Wert ist dieser Floatingpoint-Zahl ähnlich. Der genaue gespeicherte Wert ist %s, was ungefähr %s entsprichtDer angegebene Text wurde nicht gefunden!Theme & SchriftartEs gibt sich widersprechende OrdnerDiese Box ist für Ihre Notizen gedacht (Aufgaben, Code-Snippets, etc.) Text wird automatisch gespeichert und beim nächsten Öffnen von Thonny geladen. Löschen Sie diesen Text um für Ihre Notizen Platz zu schaffen.Dieser Befehl ist nicht unter Flatpack verfügbarDieser ComputerIn diesem Fenster werden Thonny Plug-ins und Ihre Korrespondierenden Pakete verwaltet. Falls Sie Pakete für Ihre eigenen Programme installieren möchten, wählen Sie "Extras → Pakete verwalten ...".Diser Dialog listet all verfügbaren Pakete, aber erlaubt nur Upgrade und Deinstallation vonDieser Dialog listet die Top-Level Module in den folgenden Verzeichnissen:Dies scheint kein Micro-/CircuitPython-Paket zu sein. Willst Du es wirklich installieren?Dies ist ein KommentarDieses Paket erfordert eine andere Version von Thonny:Diese Programm wird ohne Gewährleistung zur Verfügung gestellt. Es ist freie Software, die du unter bestimmte Bedingungen weiterverbreiten kannst, siehe https://opensource.org/licenses/MIT für weitere InformationThonny ExtrasThonny-PluginsThonny-Plugin ohne AnforderungenThonnys PythonKommentar umschaltenExtrasVersuche den Port automatisch zu erkennenUI-ModusUI-SkalierungsfaktorUI ThemeKontrollkästchen deaktivieren, falls klassisches Verhalten erwünscht.EntkommentierenRückgängigDeinstallierenDeinstalliere '%s'Ungeeignete AnforderungenObenAktualisierenAbhängigkeiten bei AktualisierungUpgrade oder DeinstallationNeuere Version von "%s"Upload nach %sVerwende den Befehl "Stopp", wenn du das Debuggen abbrechen möchtestBenutzen Sie die TK-Dateiauswahl anstelle von ZenityBenutze lokale Zeit in EchtzeituhrWertID-WertVariablenVersionshinweiseZu installierende VersionAnsichtAktuelles Skript im Python Tutor visualisierenWarnungWas mit einer %s Datei machen, wenn Sie in Thonnys Dateibrowser darauf doppelklicken?Welche Art von Interpreter soll Thonny zur Ausführung Deines Codes benutzen?Mit dem aktuellen Interpreter können Sie nur die Pakete hier durchsuchen. Zum Installieren, Upgraden oder Deinstallieren öffnen Sie "Extras > Kommandozeile öffnen ..." Text einklappen (kann langsam sein)Es kann eine vorhandene virtuelle Umgebung auch über das Rechtsklick-Kontextmenü in der Dateinavigation aktiviert werden, wenn ein virtueller Umgebungsordner oder die darin enthaltene Datei 'pyveng.cfg' ausgewählt wird.Selektiere eine Datei!Sie müssen ihr Programm stoppen, bevor Sie den Paketmanager starten.ZoomAlle Dateienbla, blaBytesfreier SpeicherplatzhierSuchen Sie nach Ihrer Geräteschnittstelle "USB Serial" oder "UART"es gibt kein -lib-Verzeichnis im sys-pfadbitte wartenUnterstützt basis ANSI-Farben und -StileFinde und installiere die Pakete (gewöhnlich mit Extension .whl, tar.gz oder .zip)Finde die requirements.txt Datei zu finden und die in Ihr spezifizierten Pakete zu installieren.Speicherplatz totaloffene_Zeichenfolgebenutzter SpeicherplatzBenutzerspezifische PaketeVirtuelle Umgebung././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662903732.0 thonny-4.0.1/thonny/locale/de_DE/LC_MESSAGES/thonny.po0000664000175000017500000015742514307362664022062 0ustar00annamaaannamaamsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: de\n" #: thonny/workbench.py:369 msgid "File" msgstr "Datei" #: thonny/workbench.py:370 msgid "Edit" msgstr "Bearbeiten" #: thonny/workbench.py:371 msgid "View" msgstr "Ansicht" #: thonny/running.py:116 thonny/workbench.py:372 msgid "Run" msgstr "Ausführen" #: thonny/workbench.py:373 msgid "Tools" msgstr "Extras" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:374 msgid "Help" msgstr "Hilfe" #: thonny/workbench.py:591 msgid "Exit" msgstr "Beenden" #: thonny/workbench.py:618 msgid "Decrease font size" msgstr "Schrift verkleinern" #. Cursor in Editor workspace -> DE: Cursor in Editorfenster aktivieren #: thonny/workbench.py:630 msgid "Focus editor" msgstr "Editor aktivieren" #: thonny/workbench.py:639 msgid "Focus shell" msgstr "Terminal aktivieren" #: thonny/workbench.py:650 msgid "Maximize view" msgstr "Ansicht maximieren" #: thonny/workbench.py:662 msgid "Full screen" msgstr "Vollbild" #: thonny/workbench.py:1465 msgid "Program arguments" msgstr "Programm-Argumente" #: thonny/plugins/about.py:24 thonny/plugins/about.py:151 msgid "About Thonny" msgstr "Über Thonny" #: thonny/plugins/about.py:77 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Hergestellt an der\n" "Universität Tartu, Estland,\n" "mit Hilfe der\n" "Open-Source-Community,\n" "Raspberry Pi Foundation\n" "und Cybernetica AS" #: thonny/plugins/about.py:97 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Diese Programm wird ohne Gewährleistung zur Verfügung gestellt. Es ist freie Software, die du unter bestimmte Bedingungen weiterverbreiten kannst, siehe https://opensource.org/licenses/MIT für weitere Information" #: thonny/plugins/about.py:140 msgid "Version history" msgstr "Versionshinweise" #: thonny/plugins/about.py:147 msgid "Report problems" msgstr "Probleme melden" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Assistenten automatisch öffnen, wenn das Programm mit einer Ausnahme abstürzt" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Assistenten automatisch öffnen, wenn er Warnungen für deinen Code hat" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Ausgewählte Pylint-Überprüfungen durchführen" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "MyPy-Überprüfungen durchführen" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Abgewählte Prüfungen (eine ID per Zeile)" #: thonny/assistance.py:985 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Assistent" #: thonny/plugins/autocomplete.py:522 msgid "Auto-complete" msgstr "Autovervollständigen" #: thonny/plugins/backend_config_page.py:337 msgid "Interpreter" msgstr "Interpreter" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Über Birdseye (Debugger)" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye ist ein Python-Debugger, der separat installiert werden muss.\n" "\n" "Möchtest du die Hilfe-Seite öffnen und mehr erfahren?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Aktuelles Skript debuggen (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Kommentar umschalten" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "Auskommentieren" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "Entkommentieren" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Rückgängig" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Wiederherstellen" #: thonny/base_file_browser.py:724 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2295 msgid "Cut" msgstr "Ausschneiden" #: thonny/base_file_browser.py:725 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2296 msgid "Copy" msgstr "Kopieren" #: thonny/base_file_browser.py:727 thonny/base_file_browser.py:733 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2297 msgid "Paste" msgstr "Einfügen" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Alles auswählen" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1401 msgid "Run to cursor" msgstr "Bis Cursor ausführen" #: thonny/plugins/debugger.py:982 msgid "Can't close yet" msgstr "Schließen noch nicht möglich" #: thonny/plugins/debugger.py:983 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Verwende den Befehl \"Stopp\", wenn du das Debuggen abbrechen möchtest" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Benutzerfenster andocken" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Übereinstimmende Namen hervorheben" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Lokale Variablen hervorheben" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Klammern hervorheben" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Syntax-Elemente hervorheben" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Aktuelle Zeile hervorheben (erfordert erneutes Öffnen des Editors)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Zeilennummern anzeigen" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Empfohlene maximale Zeilenlänge\n" "(Auf 0 einstellen, um die Randlinie auszuschalten.)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Protokoll Dateien exportien ..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Ereignisse" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Dateien" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:437 msgid "Find & Replace" msgstr "Suchen & Ersetzen" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Suchen:" #: thonny/plugins/find_replace.py:87 msgid "Replace with:" msgstr "Ersetzen durch:" #: thonny/plugins/find_replace.py:105 msgid "Case sensitive" msgstr "Groß-/Kleinschreibung beachten" #: thonny/plugins/find_replace.py:112 msgid "Up" msgstr "Oben" #: thonny/plugins/find_replace.py:116 msgid "Down" msgstr "Unten" #: thonny/plugins/find_replace.py:125 msgid "Find" msgstr "Suchen" #: thonny/plugins/find_replace.py:135 msgid "Replace" msgstr "Ersetzen" #: thonny/plugins/find_replace.py:143 msgid "Replace+Find" msgstr "Ersetzen+Suchen" #: thonny/plugins/find_replace.py:153 msgid "Replace all" msgstr "Alle ersetzen" #: thonny/plugins/find_replace.py:253 msgid "Enter string to be replaced." msgstr "Gib die zu ersetzende Zeichenkette ein." #: thonny/plugins/find_replace.py:338 msgid "The specified text was not found!" msgstr "Der angegebene Text wurde nicht gefunden!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Nur eine Instanz von Thonny zulassen" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Alle Dateien der vorherigen Sitzung erneut öffnen" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Benachrichtigungston deaktivieren" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Schrift-Skalierungsmodus" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Heap-Modus ist an.\n" "Schließe Heap-Ansicht um ihn auszuschalten." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Heap" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Sprache" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Diese Box ist für Ihre Notizen gedacht (Aufgaben, Code-Snippets, etc.)\n" "\n" "Text wird automatisch gespeichert und beim nächsten Öffnen von Thonny geladen.\n" "\n" "Löschen Sie diesen Text um für Ihre Notizen Platz zu schaffen." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Notizen" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Vorheriges Objekt" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Nächstes Objekt" #: thonny/plugins/object_inspector.py:733 msgid "Object inspector" msgstr "Objektinspektor" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Umriss" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero-Modus" #: thonny/plugins/pip_gui.py:79 msgid "Uninstall" msgstr "Deinstallieren" #: thonny/editors.py:685 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:491 #: thonny/ui_utils.py:1872 thonny/workdlg.py:162 msgid "Close" msgstr "Schließen" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Klick " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "hier" #: thonny/plugins/pip_gui.py:76 msgid "Upgrade" msgstr "Aktualisieren" #: thonny/plugins/esp/__init__.py:349 #: thonny/plugins/micropython/uf2dialog.py:410 thonny/plugins/pip_gui.py:73 msgid "Install" msgstr "Installieren" #: thonny/plugins/pip_gui.py:535 msgid "Could not find the package from PyPI." msgstr "Das Paket konnte nicht in PyPI gefunden werden." #: thonny/plugins/pip_gui.py:557 msgid "Latest stable version" msgstr "Neueste stabile Version" #: thonny/plugins/pip_gui.py:559 msgid "Latest version" msgstr "Neueste Version" #: thonny/plugins/pip_gui.py:561 msgid "Summary" msgstr "Zusammenfassung" #: thonny/plugins/pip_gui.py:563 msgid "Author" msgstr "Autor" #: thonny/plugins/pip_gui.py:565 msgid "Homepage" msgstr "Homepage" #: thonny/plugins/pip_gui.py:567 msgid "Bugtracker" msgstr "Bugtracker" #: thonny/plugins/pip_gui.py:569 msgid "Documentation" msgstr "Dokumentation" #: thonny/plugins/pip_gui.py:571 msgid "PyPI page" msgstr "PyPi-Seite" #: thonny/plugins/pip_gui.py:611 msgid "Requires" msgstr "Benötigt" #: thonny/plugins/pip_gui.py:743 msgid "Really uninstall?" msgstr "Wirklich deinstallieren?" #: thonny/plugins/pip_gui.py:748 msgid "Are you sure you want to uninstall it?" msgstr "Bist du sicher, dass du es deinstallieren möchtest?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Zurück zum aktuellen Frame" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Variablen" #: thonny/base_file_browser.py:1572 msgid "This computer" msgstr "Dieser Computer" #: thonny/base_file_browser.py:644 msgid "Refresh" msgstr "Aktualisieren" #. Fokus means cursor active in ... #: thonny/base_file_browser.py:653 msgid "Focus into" msgstr "Cursor in" #: thonny/base_file_browser.py:1407 thonny/base_file_browser.py:1419 #: thonny/plugins/autocomplete.py:300 thonny/plugins/highlight_names.py:87 msgid "Error" msgstr "Fehler" #: thonny/base_file_browser.py:1407 thonny/base_file_browser.py:1419 msgid "You need to select a file!" msgstr "Selektiere eine Datei!" #: thonny/base_file_browser.py:1423 msgid "Overwrite?" msgstr "Überschreiben?" #: thonny/base_file_browser.py:1423 msgid "Do you want to overwrite '%s' ?" msgstr "Wollen Sie '%s' überschreiben?" #: thonny/editors.py:650 thonny/editors.py:652 msgid "New" msgstr "Neu" #: thonny/editors.py:663 msgid "Open..." msgstr "Öffnen ..." #: thonny/editors.py:665 msgid "Load" msgstr "Laden" #. Edited files is better. #: thonny/editors.py:674 msgid "Recent files" msgstr "Zuletzt verwendet" #: thonny/editors.py:696 thonny/ui_utils.py:493 msgid "Close all" msgstr "Alle schließen" #: thonny/editors.py:706 thonny/editors.py:708 msgid "Save" msgstr "Speichern" #: thonny/editors.py:731 msgid "Save as..." msgstr "Speichern unter ..." #: thonny/editors.py:742 msgid "Save copy..." msgstr "Kopie speichern ..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Thonny Extras" #: thonny/running.py:115 msgid "Run current script" msgstr "Aktuelles Skript ausführen" #: thonny/running.py:146 msgid "Run current script in terminal" msgstr "Aktuelles Skript in Terminal ausführen" #. What means "backend" in English? from beginning? From Line start? #: thonny/running.py:159 msgid "Stop/Restart backend" msgstr "Stopp/Restart ausführen" #. I think "Stopp" is better then "Halt". The meaning is maybe the Program stop. #: thonny/running.py:160 msgid "Stop" msgstr "Ausführung beenden" #: thonny/running.py:171 msgid "Interrupt execution" msgstr "Ausführung abbrechen" #: thonny/running.py:184 msgid "Send EOF / Soft reboot" msgstr "EOF senden / Neustart" #: thonny/running.py:195 msgid "Disconnect" msgstr "Verbindung unterbrechen" #: thonny/plugins/cpython_frontend/cp_front.py:269 msgid "Python interpreters" msgstr "Python-Interpreter" #: thonny/editors.py:36 thonny/plugins/cpython_frontend/cp_front.py:270 #: thonny/plugins/pip_gui.py:789 thonny/plugins/pip_gui.py:802 msgid "all files" msgstr "Alle Dateien" #: thonny/plugins/cpython_frontend/cp_front.py:298 msgid "Select empty directory for new virtual environment" msgstr "Leeren Ordner für neue virtuelle Umgebung auswählen" #. What means 'bad directory' ? Wrong directory or directory tree too deep? etc. #: thonny/plugins/cpython_frontend/cp_front.py:305 msgid "Bad directory" msgstr "Ordner nicht leer" #: thonny/plugins/cpython_frontend/cp_front.py:306 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Ordner ist nicht leer, wähle einen Anderen oder breche ab." #: thonny/plugins/cpython_frontend/cp_front.py:323 msgid "Creating virtual environment" msgstr "Virtuelle Umgebung erzeugen" #. alternative DE: "Terminal leeren" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Kommandozeile leeren" #: thonny/shell.py:185 msgid "Plotter" msgstr "Drucken" #: thonny/shell.py:317 msgid "Clear" msgstr "Leeren" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Drucker anzeigen" #: thonny/shell.py:1659 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Aus Performancegründen werden sehr lange Zeilen nicht vollständig gezeigt (siehe Extras > Optionen > Kommandozeile).\n" "Hier können Sie den originalen Textabschnitt beeinflussen." #: thonny/shell.py:1670 msgid "Wrap text (may be slow)" msgstr "Text einklappen (kann langsam sein)" #: thonny/ui_utils.py:1867 msgid "Copy to clipboard" msgstr "Kopie in Zwischenablage" #: thonny/shell.py:1712 msgid "Squeezed text (%d characters)" msgstr "gekürzter Text (%d Zeichen)" #. What does this mean? #: thonny/shell.py:1882 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Drucker visualisiert Anzahl von Nummern im Terminal." #: thonny/shell.py:1884 msgid "See Help for details." msgstr "Details siehe Hilfe" #: thonny/ui_utils.py:492 msgid "Close others" msgstr "Andere schließen" #: thonny/ui_utils.py:1722 msgid "Copying" msgstr "Kopieren" #: thonny/ui_utils.py:1725 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Kopiere\n" "%s\n" "nach\n" "%s" #: thonny/base_file_browser.py:1378 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:290 thonny/plugins/pip_gui.py:1256 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1733 thonny/ui_utils.py:1819 #: thonny/workdlg.py:164 thonny/workdlg.py:209 msgid "Cancel" msgstr "Abbrechen" #: thonny/base_file_browser.py:1369 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:111 thonny/plugins/backend_config_page.py:285 #: thonny/ui_utils.py:154 thonny/ui_utils.py:1816 thonny/workdlg.py:206 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:2301 msgid "Select All" msgstr "Alles auswählen" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:162 msgid "Shell" msgstr "Kommandozeile" #: thonny/workbench.py:601 msgid "Options..." msgstr "Optionen..." #: thonny/workbench.py:608 msgid "Increase font size" msgstr "Schrift vergrößern" #: thonny/workbench.py:673 msgid "Change font size" msgstr "Schriftgröße ändern" #: thonny/workbench.py:674 msgid "Zoom" msgstr "Zoom" #: thonny/workbench.py:683 msgid "Exit Thonny" msgstr "Thonny schließen" #: thonny/workbench.py:686 msgid "Quit" msgstr "Beenden" #: thonny/workbench.py:1244 thonny/workbench.py:1252 msgid "Overwriting theme '%s'" msgstr "Theme überschreiben ' %s'" #: thonny/workbench.py:1436 msgid "Program arguments:" msgstr "Programm-Argumente:" #: thonny/workbench.py:1490 msgid "Regular mode" msgstr "Standard-Modus" #: thonny/workbench.py:1491 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Konfiguration wurde geändert. Thonny neu starten um im Standard-Modus zu arbeiten.\n" "(siehe \"Extras > Optionen > Allgemeines\" wenn Sie sich anders entscheiden" #: thonny/plugins/ast_view.py:212 msgid "Program tree" msgstr "Programmbaum" #: thonny/plugins/debugger.py:1283 msgid "Resume" msgstr "Fortfahren" #: thonny/plugins/debugger.py:1299 msgid "Run / resume" msgstr "Ausführen / fortfahren" #: thonny/plugins/debugger.py:1314 msgid "Debug current script" msgstr "Aktuelles Skript debuggen" #. = Fehlersuche , but I think Debug is very common in Germany #: thonny/plugins/debugger.py:1316 msgid "Debug" msgstr "Debuggen" #. nice means better (besser) or only cosmetic (schöner)? #: thonny/plugins/debugger.py:1327 msgid "Debug current script (nicer)" msgstr "Aktuelles Skript debuggen (besser)\n" "" #: thonny/plugins/debugger.py:1339 msgid "Debug current script (faster)" msgstr "Aktuelles Skript debuggen (schneller)" #: thonny/plugins/debugger.py:1350 msgid "Step over" msgstr "Einzelschritt" #: thonny/plugins/debugger.py:1352 msgid "Over" msgstr "Über" #: thonny/plugins/debugger.py:1363 msgid "Step into" msgstr "Eintreten" #: thonny/plugins/debugger.py:1365 msgid "Into" msgstr "Into" #: thonny/plugins/debugger.py:1376 msgid "Step out" msgstr "Verlassen" #: thonny/plugins/debugger.py:1378 msgid "Out" msgstr "Heraus" #: thonny/plugins/debugger.py:1413 msgid "Step back" msgstr "Zurück schreiten" #: thonny/plugins/debugger.py:1415 msgid "Back" msgstr "Zurück" #. Stapelspeicher #: thonny/plugins/debugger.py:1421 msgid "Stack" msgstr "Stack" #: thonny/plugins/debugger.py:1422 msgid "Exception" msgstr "Ausnahme" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Programmereignisse protokollieren" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Debug-Modus (liefert detaillierteres Diagnoseprotokoll)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "UI-Modus" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "UI-Skalierungsfaktor" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "Notiz: Thonny nach Änderung dieser Optionen neu starten!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Allgemeines" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "Installieren" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Pakete durchsuchen" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Mit dem aktuellen Interpreter können Sie nur die Pakete hier durchsuchen.\n" "Zum Installieren, Upgraden oder Deinstallieren öffnen Sie \"Extras > Kommandozeile öffnen ...\" " #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Ordner für Pakete" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Installiere von PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Wenn Sie nicht wissen, woher Sie das Paket beziehen können, sollten Sie den Python-Paketindex durchsuchen. Geben Sie den Anfang des Paketnamens in das Suchfeld oben ein und drücken die EINGABETASTE\n" "." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "Finde die requirements.txt Datei zu finden und die in Ihr spezifizierten Pakete zu installieren." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Klick" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "Finde und installiere die Pakete (gewöhnlich mit Extension .whl, tar.gz oder .zip)" #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Upgrade oder Deinstallation" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Beginne links die Pakete auszuwählen" #: thonny/plugins/pip_gui.py:410 msgid "Target:" msgstr "Ziel" #: thonny/plugins/pip_gui.py:414 msgid "virtual environment" msgstr "Virtuelle Umgebung" #: thonny/plugins/pip_gui.py:412 msgid "user site packages" msgstr "Benutzerspezifische Pakete" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Diser Dialog listet all verfügbaren Pakete, aber erlaubt nur Upgrade und Deinstallation von" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Neue Pakete werden ebenso in diesen Ordner installiert. Andere Ordner müssen mit alternativen Verfahren verwaltet werden." #: thonny/plugins/pip_gui.py:485 msgid "Installed version:" msgstr "Installierte Version" #: thonny/plugins/pip_gui.py:487 msgid "Installed to:" msgstr "Installiert in" #: thonny/plugins/pip_gui.py:538 msgid "Please check your spelling!" msgstr "Bitte überprüfen Sie Ihre Rechtschreibung!" #: thonny/plugins/pip_gui.py:542 msgid "Could not find the package info from PyPI." msgstr "Paketinformation von PyPI kann nicht gefunden werden" #: thonny/plugins/pip_gui.py:544 thonny/plugins/pip_gui.py:1326 msgid "Error code:" msgstr "Fehler-Code:" #: thonny/plugins/pip_gui.py:689 msgid "Can't find package name from the list:" msgstr "Paketname kann in der Liste nicht gefunden werden:" #: thonny/plugins/pip_gui.py:744 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Zur Installation und Deinstallation ist Paket '{}' notwendig. " #: thonny/plugins/pip_gui.py:789 msgid "Package" msgstr "Paket" #: thonny/plugins/pip_gui.py:902 msgid "Manage packages for %s" msgstr "Verwalte Pakete für %s" #: thonny/editors.py:579 thonny/plugins/micropython/pip_gui.py:23 #: thonny/plugins/pip_gui.py:953 msgid "Confirmation" msgstr "Bestätigung" #. instead of Plug-in could be used (Zusatzprogramm), but I think Plug-in is much better. #: thonny/plugins/pip_gui.py:954 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Es scheint, Sie wollen ein Thonny zugehöriges Paket installieren.\n" "Falls es ein Thonny Plug-in ist, dann wählen Sie bitte\n" "'Extras > Verwaltung Plug-ins'...\n" "\n" "Sind Sie sicher, dass Sie %s als Backend installieren wollen?" #: thonny/plugins/pip_gui.py:1059 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "Hinweis: Möglicherweise ist eine andere kompatible Version für Ihre Thonny-Version verfügbar. Klicken Sie den '...'-Button um die zu installierende Version auszuwählen." #: thonny/plugins/pip_gui.py:1067 msgid "Thonny plugin without requirements" msgstr "Thonny-Plugin ohne Anforderungen" #: thonny/plugins/pip_gui.py:1083 msgid "Unsuitable requirements" msgstr "Ungeeignete Anforderungen" #: thonny/plugins/pip_gui.py:1084 msgid "This package requires different Thonny version:" msgstr "Dieses Paket erfordert eine andere Version von Thonny:" #: thonny/plugins/pip_gui.py:1088 msgid "If you still want it, then please install it from the command line." msgstr "Falls Sie das trotzdem möchten, dann benutzen Sie bitte die Kommandozeile. " #: thonny/plugins/pip_gui.py:1125 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "Hinweis: Sie müssen Thonny nach der Installation / Aktualisierung / Deinstallation eines Plugins neu starten." #. or "Zusatzmodule", but I thin Plug-in is more clear. #: thonny/plugins/pip_gui.py:1135 msgid "Thonny plug-ins" msgstr "Thonny-Plugins" #: thonny/plugins/pip_gui.py:1171 msgid "Advanced install / upgrade / downgrade" msgstr "Erweitertes Installieren / Aktualisierung / Downgrade" #. Ploosible "Gewünschte Version", if this is required by the User. If it's required by Thonny then "Verlangte Version" is better. #: thonny/plugins/pip_gui.py:1180 msgid "Desired version" msgstr "Gewünschte Version" #: thonny/plugins/pip_gui.py:1239 msgid "Upgrade dependencies" msgstr "Abhängigkeiten bei Aktualisierung" #: thonny/plugins/pip_gui.py:1324 msgid "Requires:" msgstr "Benötigt:" #: thonny/plugins/pip_gui.py:1328 msgid "Error:" msgstr "Fehler:" #: thonny/plugins/pip_gui.py:1541 msgid "Manage packages..." msgstr "Verwalte Pakete ..." #: thonny/plugins/pip_gui.py:1547 msgid "Manage plug-ins..." msgstr "Verwalte Plug-ins ..." #. What means "replayer"? Is this a kind of Macro recorder to repeat actions? #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "Logdatei schreiben" #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "Ändern Sie das Arbeitsverzeichnis in das Skriptverzeichnis unter \"Ausführen / Debuggen\"" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Funktionsaufrufe in separaten Fenstern (Frames) anzeigen" #. "traditional experience" not clear? Is this for the behaviour or for the look and feel (Layout)? #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "Kontrollkästchen deaktivieren, falls klassisches Verhalten erwünscht." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Stack View automatisch öffnen und schließen" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Stack View beim ersten Aufruf öffnen und bei Programmreturn schließen um zum Hauptfenster zurückzukehren." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Wechseln in Bibliotheken erlauben (dh außerhalb des Hauptskriptverzeichnisses)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Kann das Debuggen verzögern." #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "Bevorzugter Debugger" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(wird beim Klicken auf die Schaltfläche Debuggen in der Symbolleiste verwendet)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Birdseye port" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(Nach dieser Änderung Thonny neu starten)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Ausführen & Debuggen" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Terminal-Emulation" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "Unterstützt basis ANSI-Farben und -Stile" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Maximale Anzahl der Zeilen, die beibehalten werden sollen." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "Hinweis: Große Werte können zu Geschwindigkeitsverlust führen!" #. " Maximale Zeilenlänge bis zum ???" what means squeezing? Is this a kind of shorten by folding ? #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maximal angezeigte Zeichenlänge bis zum Verschieben" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Aktuelles Skript in Terminal ausführen" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Zeige Python REPL nach Programmende." #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Nach Programmende Terminal geöffnet lassen." #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "Hinweis: Das automatische Schließen muss in den Einstellungen des Terminals aktiviert sein (" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminal" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "UI Theme" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Syntax Theme" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Schriftart Editor " #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "Schriftart Terminal" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Vorschau" #: thonny/plugins/theme_and_font_config_page.py:151 msgid "This is a comment" msgstr "Dies ist ein Kommentar" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "The answer is" msgstr "Die Antwort ist" #: thonny/plugins/theme_and_font_config_page.py:158 msgid "unclosed_string" msgstr "offene_Zeichenfolge" #. Do you realy mean Blah Blah ??? :-) #: thonny/plugins/theme_and_font_config_page.py:160 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:184 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "Hinweis: Einige Einstellungen ändern sich erst nach einem Neustart von Thonny!" #: thonny/plugins/theme_and_font_config_page.py:223 msgid "Enter an integer" msgstr "Ganzzahl eingeben" #: thonny/plugins/theme_and_font_config_page.py:236 msgid "Theme & Font" msgstr "Theme & Schriftart" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Installationsverzeichnis von Thonny öffnen ..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Arbeitsverzeichnis von Thonny öffnen ..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Home" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Hilfe Inhalt" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "CircuitPython device" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "MicroPython device" #: thonny/plugins/micropython/mp_front.py:547 msgid "Connect your device to the computer and select corresponding port below" msgstr "Verbinden Sie Ihr Gerät mit dem Computer und wählen Sie den relevanten Port unten aus" #: thonny/plugins/micropython/mp_front.py:550 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "Suchen Sie nach Ihrer Geräteschnittstelle \"USB Serial\" oder \"UART\"" #: thonny/plugins/micropython/mp_front.py:552 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Falls Sie es nicht finden, müssen Sie ggf. erst den richtigen USB-Treiber installieren." #: thonny/plugins/micropython/mp_front.py:444 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:454 msgid "Try to detect port automatically" msgstr "Versuche den Port automatisch zu erkennen" #: thonny/plugins/micropython/__init__.py:25 msgid "MicroPython (generic)" msgstr "MicroPython (generic)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Drucken ..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "System Terminal öffnen ..." #: thonny/plugins/backend_config_page.py:110 msgid "Details" msgstr "Details" #. (requirements.txt) #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Installieren mit requirements.txt Datei" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Installieren mit lokalen Dateien" #: thonny/plugins/pip_gui.py:1118 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "In diesem Fenster werden Thonny Plug-ins und Ihre Korrespondierenden Pakete verwaltet.\n" "Falls Sie Pakete für Ihre eigenen Programme installieren möchten, wählen Sie \"Extras → Pakete verwalten ...\"." #. This text is used twice. #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (generic)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Ausgewählte Zeilen einrücken" #. evt. "Einzug verkleinern" vs "Einzug vergrößern" wie bei LibreOffice. #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "Dedent selektierte Zeilen (entf. Leerzeichen am Zeilenanfang)" #: thonny/workbench.py:1479 msgid "Switch to\n" "regular\n" "mode" msgstr "Wechsle zu\n" "Standard\n" "Mode" #: thonny/plugins/microbit/__init__.py:58 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Stellen Sie sicher, dass MicroPython auf Ihrem micro: bit installiert ist." #: thonny/plugins/microbit/__init__.py:60 msgid "Don't forget that main.py only works without embedded main script." msgstr "Vergessen Sie nicht, dass main.py nur ohne eingebettetes Hauptskript funktioniert." #: thonny/plugins/micropython/uf2dialog.py:44 msgid "please wait" msgstr "bitte warten" #: thonny/misc_utils.py:151 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Konnte Laufwerk '%s' nicht finden. Möchten das Laufwerk selbst suchen?" #: thonny/misc_utils.py:154 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Es wurden mehrere '% s' Laufwerke gefunden. Möchten Sie selbst eines auswählen?" #: thonny/misc_utils.py:170 msgid "Can't find suitable disk" msgstr "Geeignetes Laufwerk kann nicht gefunden werden" #: thonny/base_file_browser.py:290 msgid "%d items" msgstr "%d Elemente" #. same as recycle bin ? #: thonny/base_file_browser.py:739 msgid "Move to Trash" msgstr "In den Papierkorb verschieben" #: thonny/base_file_browser.py:742 msgid "Delete" msgstr "Löschen" #: thonny/base_file_browser.py:721 thonny/base_file_browser.py:874 msgid "New directory" msgstr "Neuer Ordner" #: thonny/base_file_browser.py:745 msgid "Properties" msgstr "Eigenschaften" #: thonny/base_file_browser.py:747 msgid "Storage space" msgstr "Speicherplatz" #: thonny/base_file_browser.py:757 msgid "Path" msgstr "Pfad" #: thonny/base_file_browser.py:759 msgid "Directory properties" msgstr "Ordner Eigenschaften" #: thonny/base_file_browser.py:761 msgid "File properties" msgstr "Datei Eigenschaften" #: thonny/base_file_browser.py:763 msgid "bytes" msgstr "Bytes" #: thonny/base_file_browser.py:766 msgid "Size" msgstr "Größe" #: thonny/base_file_browser.py:93 thonny/base_file_browser.py:777 msgid "Modified" msgstr "Geändert" #: thonny/base_file_browser.py:838 msgid "Deleting %s" msgstr "%s löschen" #: thonny/editors.py:260 msgid "Loading" msgstr "wird geladen" #: thonny/editors.py:389 msgid "Saving" msgstr "speichern läuft" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Upload nach %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Downloading %s nach %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Download nach %s" #: thonny/base_file_browser.py:646 msgid "Open in system file manager" msgstr "Im Systemdateimanager öffnen" #: thonny/base_file_browser.py:674 msgid "Hide hidden files" msgstr "Versteckte Dateien ausblenden" #: thonny/base_file_browser.py:674 msgid "Show hidden files" msgstr "Versteckte Dateien anzeigen" #: thonny/base_file_browser.py:657 msgid "Open in Thonny" msgstr "Öffnen in Thonny" #: thonny/base_file_browser.py:688 msgid "Open in system default app" msgstr "Öffnen in der Systemstandard-App" #: thonny/base_file_browser.py:669 thonny/base_file_browser.py:696 msgid "Configure %s files" msgstr "Konfiguriere %s Dateien" #: thonny/base_file_browser.py:697 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Was mit einer %s Datei machen, wenn Sie in Thonnys Dateibrowser darauf doppelklicken?" #: thonny/base_file_browser.py:1254 thonny/editors.py:979 thonny/editors.py:981 msgid "Deleting" msgstr "Löschen" #: thonny/base_file_browser.py:1261 msgid "Creating directory" msgstr "Erstelle Verzeichnis" #: thonny/editors.py:258 msgid "Loading %s" msgstr "Lade %s" #: thonny/editors.py:384 msgid "Saving to %s" msgstr "Speichern nach %s" #: thonny/editors.py:720 thonny/editors.py:722 msgid "Save All files" msgstr "Speicher Alle Dateien" #: thonny/plugins/backend_config_page.py:340 thonny/workbench.py:877 msgid "Configure interpreter..." msgstr "Den Interpreter konfigurieren ..." #: thonny/workbench.py:1589 msgid "Device" msgstr "Gerät" #: thonny/workdlg.py:193 msgid "Cancelling" msgstr "Abbrechen" #: thonny/workdlg.py:220 msgid "Starting" msgstr "Beginnen" #: thonny/plugins/backend_config_page.py:251 msgid "Authentication" msgstr "Authentifizierung" #: thonny/plugins/backend_config_page.py:253 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Geben sie Ihren persönlichen Passwort-Satz für\n" "{} ein" #: thonny/plugins/backend_config_page.py:256 msgid "Enter your password for\n" "{}" msgstr "geben Sie hier Ihr Passwort für\n" "{} ein" #: thonny/plugins/object_inspector.py:487 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Der gezeigte Wert ist dieser Floatingpoint-Zahl ähnlich. Der genaue gespeicherte Wert ist %s, was ungefähr %s entspricht" #: thonny/plugins/pip_gui.py:645 msgid "Search results" msgstr "Suchergebnisse" #: thonny/plugins/pip_gui.py:646 msgid "Searching" msgstr "Suchen" #: thonny/plugins/pip_gui.py:728 thonny/plugins/pip_gui.py:817 msgid "Installing '%s'" msgstr "Installiere '%s'" #: thonny/plugins/pip_gui.py:734 msgid "Upgrading '%s'" msgstr "Neuere Version von \"%s\"" #: thonny/plugins/pip_gui.py:741 msgid "Uninstalling '%s'" msgstr "Deinstalliere '%s'" #: thonny/plugins/pip_gui.py:755 msgid "Installing" msgstr "Installiere" #: thonny/plugins/pip_gui.py:1502 msgid "Package manager is not available for this interpreter" msgstr "für diesen Interpreter ist kein Package-Manager verfügbar" #: thonny/base_file_browser.py:1205 thonny/plugins/pip_gui.py:1516 msgid "Not supported" msgstr "Nicht unterstützt" #: thonny/plugins/micropython/pip_gui.py:100 thonny/plugins/pip_gui.py:1521 msgid "Not available" msgstr "Nicht verfügbar" #: thonny/plugins/pip_gui.py:1522 msgid "You need to stop your program before launching the package manager." msgstr "Sie müssen ihr Programm stoppen, bevor Sie den Paketmanager starten." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Sehen Sie den Wert des Ausdruckes im Objekt-Inspektor" #: thonny/plugins/cpython_frontend/cp_front.py:209 msgid "Python executable" msgstr "Ausführbares Python-Programm" #: thonny/plugins/cpython_frontend/cp_front.py:232 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "Hinweis: Die Dateiauswahl funktioniert möglicherweise nicht richtig, wenn Programme aus einer virtuellen Umgebung heraus aufgerufen werden. In diesem Fall ist das 'activate' Script anstelle des Interpreters zu wählen (oder der Pfad direkt in der Eingabebox einzugeben)." #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Nichtlokales Python 3 über SSH" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Nicht verbunden" #: thonny/plugins/micropython/mp_front.py:521 msgid "Advanced options" msgstr "Erweiterte Optionen" #: thonny/plugins/micropython/mp_front.py:547 msgid "Install or update firmware" msgstr "Installieren oder aktualisieren Sie die Firmware" #: thonny/plugins/micropython/__init__.py:36 msgid "MicroPython (local)" msgstr "MicroPython (lokal)" #: thonny/plugins/micropython/__init__.py:47 msgid "MicroPython (SSH)" msgstr "MicroPython(über SSH)" #: thonny/plugins/micropython/pip_gui.py:77 msgid "Scope" msgstr "Geltungsbereich" #: thonny/plugins/micropython/pip_gui.py:90 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "Dieser Dialog listet die Top-Level Module in den folgenden Verzeichnissen:" #: thonny/plugins/micropython/pip_gui.py:99 msgid "New packages will be installed to" msgstr "Neue Pakete werden installiert in" #: thonny/plugins/micropython/pip_gui.py:102 msgid "no absolute lib directory in sys.path" msgstr "es gibt kein -lib-Verzeichnis im sys-pfad" #: thonny/plugins/micropython/uf2dialog.py:39 msgid "Version to be installed" msgstr "Zu installierende Version" #: thonny/plugins/micropython/uf2dialog.py:47 msgid "Target device location" msgstr "Ort im Ziel-Gerät" #: thonny/plugins/micropython/uf2dialog.py:58 msgid "Target device model" msgstr "Modell des Ziel-Gerätes" #: thonny/plugins/micropython/uf2dialog.py:146 msgid "Please wait" msgstr "Bitte warten" #: thonny/plugins/pip_gui.py:70 msgid "Search on PyPI" msgstr "Suche auf PyPI" #: thonny/base_file_browser.py:689 msgid "Open in Thonny's text editor" msgstr "In Thonnys Texteditor öffnen" #: thonny/base_file_browser.py:342 msgid "Storage space on this drive or filesystem" msgstr "Speicherplatz auf diesem Laufwerk oder Dateisystem" #: thonny/base_file_browser.py:343 msgid "total space" msgstr "Speicherplatz total" #: thonny/base_file_browser.py:345 msgid "used space" msgstr "benutzter Speicherplatz" #: thonny/base_file_browser.py:346 msgid "free space" msgstr "freier Speicherplatz" #: thonny/base_file_browser.py:353 msgid "Storage info" msgstr "Speicherinformation" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "Ersetze Tabulatoren durch Leerzeichen" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Hebe Tabulatorzeichen hervor" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Einrücken mit Tab (für Python nicht empfohlen)" #: thonny/base_file_browser.py:91 thonny/memory.py:63 msgid "Name" msgstr "Name" #: thonny/base_file_browser.py:95 msgid "Size (bytes)" msgstr "Größe (Bytes)" #: thonny/base_file_browser.py:875 msgid "Enter name for new directory under\n" "%s" msgstr "Gebe einen Namen für ein neues Verzeichnis ein unter %s" #: thonny/base_file_browser.py:898 msgid "Nothing selected" msgstr "Nichts ausgewählt" #: thonny/base_file_browser.py:898 msgid "Select an item and try again!" msgstr "Wählen Sie ein Item und versuchen Sie es erneut!" #: thonny/base_file_browser.py:1325 msgid "Open from %s" msgstr "Öffnen von %s" #: thonny/base_file_browser.py:1328 msgid "Save to %s" msgstr "Speichern nach %s" #: thonny/base_file_browser.py:1347 msgid "File name:" msgstr "Dateiname:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value ID" msgstr "ID-Wert" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:540 #: thonny/plugins/object_inspector.py:619 msgid "Value" msgstr "Wert" #: thonny/plugins/backend_config_page.py:274 msgid "Save password" msgstr "Passwort Speichern" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Funktionsaufruf bei %s" #: thonny/plugins/debugger.py:1003 msgid "Local variables" msgstr "Lokale Variablen" #: thonny/plugins/debugger.py:1035 msgid "Function" msgstr "Funktion" #: thonny/plugins/debugger.py:1036 msgid "Location" msgstr "Ort" #: thonny/plugins/debugger.py:1112 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Falls das letzte Kommando eine Exception (interrupt) ausgelöst hat, dann wird in diesem Fenster der zugehörige Stack gezeigt" #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Daten" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Attribute" #: thonny/plugins/object_inspector.py:538 msgid "Index" msgstr "Index" #: thonny/plugins/object_inspector.py:616 msgid "Key ID" msgstr "Schlüssel-ID" #: thonny/plugins/object_inspector.py:617 msgid "Key" msgstr "Schlüssel" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Zurück nach %s" #: thonny/plugins/micropython/mp_front.py:444 msgid "Port or WebREPL" msgstr "Port oder WebREBL" #: thonny/plugins/micropython/mp_front.py:589 msgid "Password" msgstr "Passwort" #: thonny/plugins/debugger.py:961 msgid "Source code" msgstr "Quellcode" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Benutzen Sie die TK-Dateiauswahl anstelle von Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Wähle aus, falls Dialoge hinter dem Hauptfenster verschwinden" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Umgebungs-Variablen (jeweils eine pro Zeile)" #: thonny/base_file_browser.py:718 msgid "New file" msgstr "Neue Datei" #: thonny/base_file_browser.py:736 msgid "Rename" msgstr "Umbenennen" #: thonny/base_file_browser.py:924 msgid "Rename '%s'" msgstr "Benenne '%s' um" #: thonny/base_file_browser.py:924 msgid "Enter new name" msgstr "Neuen Namen eingeben" #: thonny/base_file_browser.py:1012 msgid "Paste failed" msgstr "Einfügen gescheitert" #: thonny/base_file_browser.py:1012 msgid "There are conflicting folders" msgstr "Es gibt sich widersprechende Ordner" #: thonny/base_file_browser.py:1140 msgid "File already exists" msgstr "Datei existiert bereits" #: thonny/base_file_browser.py:1208 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Wenn dies eine Textdatei ist, kannst Du es automatisch mit Thonny öffnen, indem Du rechts klickst und 'Konfiguriere ... Dateien' wählst" #: thonny/editors.py:35 msgid "Python files" msgstr "Python-Dateien" #: thonny/editors.py:122 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:149 msgid "File is gone" msgstr "Datei ist verschwunden" #: thonny/editors.py:152 msgid "Do you want to also close the editor?" msgstr "Willst Du auch den Editor schließen?" #: thonny/editors.py:168 msgid "External modification" msgstr "Externe Veränderung" #: thonny/editors.py:171 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Willst Du den jetzigen Editor-Inhalt verwerfen und die Datei von der Platte neu laden?" #: thonny/editors.py:580 msgid "Python files usually have .py extension." msgstr "Python-Dateien haben üblicherweise die Endung '.py'." #: thonny/editors.py:582 msgid "Did you mean '%s'?" msgstr "Meintest Du '%s'?" #: thonny/editors.py:751 msgid "Move / rename..." msgstr "Verschieben / Umbenennen von ..." #: thonny/editors.py:760 msgid "Go to line..." msgstr "Gehe zu Zeile ..." #: thonny/editors.py:1003 msgid "Line number" msgstr "Zeilennummer" #: thonny/editors.py:1149 msgid "Do you want to save files before closing?" msgstr "Willst Du die Dateien vor dem Schließen speichern?" #: thonny/editors.py:1151 msgid "Do you want to save file before closing?" msgstr "Willst Du vor dem Schließen speichern?" #: thonny/editors.py:1154 msgid "Save On Close" msgstr "Beim Schließen speichern" #: thonny/misc_utils.py:513 msgid "Command not available" msgstr "Befehl nicht verfügbar" #: thonny/misc_utils.py:514 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Dieser Befehl ist nicht unter Flatpack verfügbar" #: thonny/workbench.py:694 thonny/workbench.py:794 msgid "Support Ukraine" msgstr "Unterstütze die Ukraine" #: thonny/plugins/backend_config_page.py:91 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Welche Art von Interpreter soll Thonny zur Ausführung Deines Codes benutzen?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Zeige Parameter-Info" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Zeige automatisch Parameter-Info nach Eingabe von '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Biete beim Tippen Auto-Vervollständigen an" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Zeige automatisch Doku für Vervollständigungen" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Autovervollständigen mit Tab im Editor" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Autovervollständigen mit Tab in der Shell" #: thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Problem" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Definition nicht gefunden" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Leere Terminal-Fenster vor Start des neuen Prozesses (ausführen, debuggen, Stop/Restart, ...) " #: thonny/plugins/cpython_frontend/cp_front.py:171 msgid "Thonny's Python" msgstr "Thonnys Python" #: thonny/plugins/micropython/mp_front.py:492 msgid "Interrupt working program on connect" msgstr "Beim Verbinden laufendes Programm unterbrechen" #: thonny/plugins/micropython/mp_front.py:500 msgid "Synchronize device's real time clock" msgstr "Synchronisiere die Echtzeituhr des Geräts" #: thonny/plugins/micropython/mp_front.py:506 msgid "Use local time in real time clock" msgstr "Benutze lokale Zeit in Echtzeituhr" #: thonny/plugins/micropython/mp_front.py:512 msgid "Restart interpreter before running a script" msgstr "Vor Start des Skript Interpreter neu starten" #: thonny/plugins/micropython/pip_gui.py:24 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Dies scheint kein Micro-/CircuitPython-Paket zu sein.\n" "Willst Du es wirklich installieren?" #: thonny/base_file_browser.py:849 msgid "Moving to Trash" msgstr "In den Papierkorb schieben" #: thonny/base_file_browser.py:850 msgid "Move %s to Trash?" msgstr "%s in den Papierkorb schieben?" #: thonny/base_file_browser.py:857 msgid "Moving %s to Trash" msgstr "Schiebe %s in den Papierkorb" #: thonny/base_file_browser.py:662 msgid "Open in default external app" msgstr "Öffne in externer Standard-App" #: thonny/base_file_browser.py:1206 msgid "Opening remote files in external app is not supported." msgstr "Remote-Dateien können nicht in externer App geöffnet werden." #: thonny/base_file_browser.py:1213 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Wenn die Datei in einer externen App, geöffnet werden muss, dann lade sie in ein lokales Verzeichnis und öffne sie von dort!" #: thonny/editors.py:150 msgid "Looks like '%s' was deleted or moved." msgstr "Anscheinend wurde '%s' gelöscht oder verschoben." #: thonny/editors.py:169 msgid "Looks like '%s' was modified outside of the editor." msgstr "Anscheinend wurde '%s' außerhalb des Editors geändert." #: thonny/plugins/cpython_frontend/cp_front.py:230 msgid "NB! Thonny only supports Python %s and later" msgstr "Achtung! Thonny unterstützt nur Python %s und neuer" #: thonny/editors.py:1003 msgid "Go to line" msgstr "Gehe zu Zeile" #: thonny/workbench.py:697 msgid "Support" msgstr "Unterstützung" #: thonny/editors.py:393 thonny/editors.py:408 msgid "Could not save" msgstr "Konnte nicht gespeichert werden" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Warnung" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Wenn der Wert einer Umgebungsvariable in Anführungszeichen gesetzt wird, werden die Anführungszeichen Teil des Werts.\n" "Ist das beabsichtigt?" #: thonny/workbench.py:867 msgid "Install MicroPython" msgstr "MicroPython installieren" #: thonny/workbench.py:871 msgid "Install CircuitPython" msgstr "CircuitPython installieren" #: thonny/plugins/backend_config_page.py:212 msgid "Make uploaded shebang scripts executable" msgstr "Hochgeladene Shebang-Skripte ausführbar machen" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Gespeicherte Shebang-Skripte ausführbar machen" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Virtuelle Umgebung aktivieren" #: thonny/plugins/micropython/pip_gui.py:77 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Ziel" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Aktuelles Skript im Python Tutor visualisieren" #: thonny/plugins/todo_view.py:44 msgid "Line" msgstr "Zeile" #: thonny/plugins/todo_view.py:45 msgid "Info" msgstr "Info" #: thonny/plugins/todo_view.py:123 msgid "No line marked with #todo found" msgstr "Keine mit #todo markierte Zeile gefunden" #: thonny/plugins/todo_view.py:143 msgid "TODO" msgstr "ToDo" #: thonny/plugins/circuitpython/cirpy_front.py:98 #: thonny/plugins/micropython/mp_front.py:536 msgid "Install or update %s" msgstr "%s installieren oder aktualisieren" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Lokales Python 3" #: thonny/plugins/cpython_frontend/cp_front.py:240 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "Es kann eine vorhandene virtuelle Umgebung auch über das Rechtsklick-Kontextmenü in der Dateinavigation aktiviert werden, wenn ein virtueller Umgebungsordner oder die darin enthaltene Datei 'pyveng.cfg' ausgewählt wird." #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Vorbereitungen (überspringe den VS-Code-Teil)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Standard-Passwort" #: thonny/running.py:338 msgid "Information" msgstr "" #: thonny/running.py:339 msgid "For debugging the program must be saved first." msgstr "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/thonny/locale/el_GR/0000775000175000017500000000000014307363733016426 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6901064 thonny-4.0.1/thonny/locale/el_GR/LC_MESSAGES/0000775000175000017500000000000014307363733020213 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/el_GR/LC_MESSAGES/thonny.mo0000664000175000017500000013067314276461532022102 0ustar00annamaaannamaaL ||}]$) *3^ m&z+-! D.7s&      1x?  &5< P[j;{    , GD I [ c <x % * !%!8!U!Y!^!d!y!!!3!""1"8"H" Q"]"m"u"|""!" """ #B#\#b#g#v### ##%##/#'$.B$q$ w$$$ $$ $$$$ $$$$$ %"%(% 1% >% I%U%g%,&/2&=b& &&&&&0&' ''6,'c'}'''''''''L(FM((C\)))7)***!*9*X* s** ** ***3*+ ++&+/+E+T+Y+ a+l+|+ +++~,z1-;---. %.13. e......../ /"/n2//,v000<01-1U1c)222 2n2!3 53 A3 O3 ]3k3q333?3C3454'S4){4 444445&5;5TC5 5555 555H5O'65w66666667 $707:87s7x77&777777 8 8 8*8;8M8a8f8 x8B888 88 8&9)9 19=9 V9 d9q99 999 9 999 9"9: : /: :: G: U:`: g:t:z:: :: : ::2:/;8O;;:;; ;< <0!<R<d<v< {< <<<-<< < <= === 0= ==)K=u=}= ====== =>=n=>0>!> > ? ? @b@@ATA/fAA@PBBB"BBB B CC#C0,C ]CgC lCvCCCCCCC CC2D%7D]DcD lDvDDDLDDD5E EEEECF#YF}F F FF FF1F%F G%GV7GIG GG GGH&HHHWIn'JWJ JK[/K)KsK)LJLMcMYN hNuNNN%NNN* O-4ObO7P&IP'pP2PLPPQiQ-xQQ.Q:QR RS S$3SXS lSvSS"SSES&*U$QUvUU%V*8VcV.vVV;-WfiWKW#XB@XXXXFXQYYWYYY Z:Z?Z[%+[Q[b[v[[[%[F[a+\\;\4\],]]] ]]^)/^BY^5^R^K%_eq_)_W` Y`"f` ``` ``(`Ca Sa`a!{a a a)a'a bb?3bsb$bFb7bb+d_dnd]eue)e e ee{f'f,ff6tg=g)g:h0Nh hhhh%hhiVjtk:dl?l`l@mSm"jm7mHmKn Zn({nnnn!noo o#o'o o.p6pVpeptp#ppp`p3qPr8ti9u-u%u*u"vZ=vEvOv.w@w_wzwww=w*w((x)Qx{yq[{|{J|@|o~~z DOVrFF%$ρ!+E/HxEJȃelyK_hWȅ* 5KZnu. }!͉$D2]%ϊ_hF|`Ë$-?m-.%ތ )"Jm*ύ%)\+#CǏ ',%Tz-#< VJ0Nґ!36j,#ؒ +I+hI R!^tWӔ|+%yΕkH<)r*,.ʗ?= }Y  (>3Q8![<7M!B< '5+Ht~h=`%ĝ$bI@'Т\^Uo$<B[OϥAVaa̦.N_#z/ Χ٧)2Ki%D2w,ө;9uS$9 FI֭ 3L_e[^%EGkL'-:,h%%d items(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)(restart Thonny after changing this)(used when clicking Debug toolbar button)A special virtual environment (deprecated)About BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow code completion with Tab-key in ShellAllow code completion with Tab-key in editorsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Alternative Python 3 interpreter or virtual environmentAre you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeBackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancel the process?CancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear shellClickClick CloseClose allClose othersComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Create new virtual environmentCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDelete selectedDeletingDeleting %sDesired versionDetailsDeviceDirectory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to overwrite '%s' ?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.Done!DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExpand in ShellExport usage logs...FileFile name:File propertiesFilesFindFind & ReplaceFind package from PyPIFind:FirmwareFocus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.For uninstalling delete corresponding files.For upgrading simply install the package again.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf last command raised an exception then this view will show the stacktrace.If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDKnown interpretersLanguageLatest stable versionLatest versionLoadLoadingLoading %sLocal variablesLocationLocation: Log program usage eventsLooks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Looks like you are trying to install an outdated Thonny plug-in (it doesn't specify required Thonny version). If you still want it, then please install it from the command line.Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedModuleMove to Recycle BinMove to TrashMoving %s to %sNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python 3.5 and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NB! micropython.org has published version %s of this package and this will be installed by default.NameNewNew directoryNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package is not available at micropython.org. Version at PyPI will be installed.Package manager is not available for this interpreterPackages' directoryPasswordPastePathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...Program argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)Rename...Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:ResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect existing or create a new empty directorySelect if the file dialogs end up behind the main windowSelect interpreterSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShadowed items (not importable):ShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySwitch to regular modeSyntax themeTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe process is still running. Are you sure you want to cancel?The representation above is an approximate value of this float. The exact stored value is %s which is about %sThe same interpreter which runs Thonny (default)The specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThis virtual environment is automatically maintained by Thonny. Thonny optionsThonny plug-insThonny plugin without requirementsToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUploading %s to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityValueValue IDVariablesVersion historyVersion to be installedViewWhat to do with a %s file when you double-click it in Thonny's file browser?Which interpreter or device should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Working...Wrap text (may be slow)You need to enterYou need to select a file!You need to stop your program before launching the package manager.Your interpreter isn't in the list?Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentMIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: POEditor.com Project-Id-Version: Thonny Language: el %d στοιχεία(Σε αυτήν την περίπτωση, το back-end του Thonny χρησιμοποιεί τον ίδιο διερμηνευτή, επομένως και τα δύο παράθυρα διαχειρίζονται τα ίδια πακέτα.)(επανεκιννήστε το Thonny μετά από αυτήν την αλλαγή)(χρησιμοποιείται όταν κάνετε κλικ στο κουμπί Αποσφαλμάτωση)Ένα ειδικό εικονικό περιβάλλον (προς κατάργηση)Σχετικά με τo BirdseyeΣχετικά με το ThonnyΠροχωρημένη εγκατάσταση / αναβάθμιση / υποβάθμισηΠροχωρημένες επιλογέςΝα επιτρέπεται η συμπλήρωση κώδικα με το πλήκτρο Tab στο κέλυφοςΝα επιτρέπεται η συμπλήρωση κώδικα με το πλήκτρο Tab στον επεξεργαστή κειμένουΝα επιτρέπεται μόνο μία εκτέλεση του ThonnyΝα επιτρέπεται η μετάβαση σε βιβλιοθήκες (π.χ. εκτός του καταλόγου του κύριου προγράμματος)Εναλλακτικός διερμηνευτής Python 3 ή εικονικό περιβάλλονΕίσαι σίγουρος ότι θέλεις να το απεγκαταστήσεις;ΒοηθόςΧαρακτηριστικάΤαυτοποίησηΣυντάκτηςΑυτόματη συμπλήρωσηΠίσωΕπιστροφή στο %sΠίσω στο τρέχoν πλαίσιοΠροβληματικός κατάλογοςΤο Birdseye είναι ένας εκσφαλματωτής της Python που πρέπει να εγκατασταθεί ξεχωριστά. Θέλεις να ανοίξω τη σελίδα βοήθειας? Θύρα BirdseyeΠεριήγηση στα πακέταΑνιχνευτής σφαλμάτωνΔεν μπορεί να κλείσει ακόμηΔεν βρέθηκε το όνομα πακέτου από τη λίστα:Δεν είναι δυνατή η εύρεση κατάλληλου δίσκουΑκύρωσηΑκύρωση της διαδικασίας;ΑκύρωσηΔιάκριση πεζών-κεφαλαίωνΑλλαγή μεγέθους γραμματοσειράςΑλλαγή από τον τρέχοντα κατάλογο εργασίας στον κατάλογο του προγράμματος κατά την Eκτέλεση/ΑποσφαλμάτωσηCircuitPython (γενόσημο)Συσκευή CircuitPythonΚαθάρισμαΚαθάρισε το κέλυφοςΚάντε κλικΚλικ ΚλείσιμοΚλείσιμο όλωνΚλείσε τα υπόλοιπαΠροσθήκη σχολίουΟι ρυθμίσεις έχουν ενημερωθεί. Κάντε επανεκκίνηση του Thonny για να αρχίσετε να εργάζεστε σε κανονική λειτουργία. (Δείτε 'Εργαλεία → Επιλογές → Γενικά' αν αλλάξετε γνώμη αργότερα.)Διαμόρφωση %s αρχείωνΡύθμιση διερμηνέα...ΕπιβεβαίωσηΣυνδέστε τη συσκευή σας στον υπολογιστή και επιλέξτε την αντίστοιχη θύρα παρακάτωΑντιγραφήΑντιγραφή στο πρόχειροΑντιγραφήΑντιγραφή από   %s στο   %sΔεν ήταν δυνατή η εύρεση του δίσκου '%s'. Θέλετε να τον εντοπίσετε μόνοι σας;Αδυναμία εύρεσης πακέτου από PyPl.Δεν ήταν δυνατή η εύρεση των πληροφοριών πακέτου από PyPI.Δημιουργία νέου εικονικού περιβάλλοντοςΔημιουργία φακέλουΔημιουργία εικονικού περιβάλλοντοςΑποκοπήΔεδομέναΑποσφαλμάτωσηΑποσφαλμάτωση τρέχοντος προγράμματοςΑποσφαλμάτωση τρέχοντος προγράμματος (birdseye)Αποσφαλμάτωση τρέχοντος προγράμματος (ταχύτερη)Αποσφαλμάτωση τρέχοντος προγράμματος (καλύτερη)Λειτουργία εντοπισμού σφαλμάτων (παρέχει πιο λεπτομερή καταγραφή διαγνωστικών)Μείωση μεγέθους γραμματοσειράςΜείωση εσοχής επιλεγμένων γραμμώνΔιαγραφήΕπιλέχθηκε ΔιαγραφήΔιαγραφήΔιαγραφή %sΕπιθυμητή έκδοσηΛεπτομέρειεςΣυσκευήΙδιότητες καταλόγουΑπενεργοποίηση ηχητικών ειδοποιήσεωνΑπενεργοποιημένοι έλεγχοι (μία ταυτότητα ανά γραμμή)ΑποσύνδεσηΘέλετε να αντικαταστήσετε το '%s';Ενσωμάτωση παραθύρων χρήστηΒιβλιογραφίαΜην ξεχνάτε ότι το main.py λειτουργεί μόνο χωρίς ενσωματωμένο κύριο πρόγραμμα.Ολοκληρώθηκε!ΚάτωΜεταφόρτωση στο %sΛήψη του %s στο %sΕπεξεργασίαΕπεξεργαστής κειμένουΓραμματοσειρά επεξεργαστή κειμένουΕισάγετε έναν ακέραιο αριθμόΕισαγωγή ονόματος για νέο ευρετήριο υπό το %sΕισάγετε συμβολοσειρά για αντικατάστασηΕισαγωγή συνθηματικού για τα προσωπικο κλειδί για το {}Εισαγωγή κωδικού για {}Παράμετροι περιβάλλοντος (ένα KEY=VALUE ανά γραμμή) ΣφάλμαΚωδικός σφάλματος:Σφάλμα:ΓεγονόταΕξαίρεσηΈξοδοςΈξοδος από το ThonnyΕπέκτεινε στο ΚέλυφοςΕξαγωγή αρχείων καταγραφής χρήσης ...ΑρχείοΌνομα αρχείου:Ιδιότητες αρχείουΑρχείαΕύρεσηΕύρεση & ΑντικατάστασηΕύρεση πακέτου από PyPlΕύρεση:YλικολογισμικόΕστίαση στον επεξεργαστή κειμένουΕστίαση σεΕστίαση στο κέλυφοςΛειτουργία κλιμάκωσης γραμματοσειρώνΓια λόγους απόδοσης, το κέλυφος αποφεύγει να εμφανίζει πλήρως τις μεγάλες γραμμές (βλ. Εργαλεία=> Επιλογές=> Κέλυφος). Εδώ μπορείτε να αλληλεπιδράσετε με το αρχικό κειμένο.Για απεγκατάσταση να διαγραφούν τα αντίστοιχα αρχείαΓια αναβάθμιση απλώς να εγκατασταθεί ξανά το πακέτοΒρέθηκαν διάφοροι δίσκοι '%s'. Θέλετε να επιλέξετε έναν εσείς;Πλήρης οθόνηΣυνάρτησηΚλήση συνάρτησης στο %sΓενικάΣωρόςΗ λειτουργία Σωρού είναι ενεργοποιημένη. Κλείστε την προβολή Σωρού για να την απενεργοποιήσετε.ΒοήθειαΠεριεχόμενα ΒοήθειαςΑπόκρυψη κρυφών αρχείωνΕπισήμανε την τρέχουσα γραμμή (απαιτεί εκ νέου άνοιγμα του επεξεργαστή κειμένου)Επισήμανε τοπικές μεταβλητέςΕπισήμανε ονόματα που ταιριάζουνΕπισήμανε παρανθέσειςΕπισήμανε στοιχεία συντακτικούΕπισήμανση στηλοθετών (tabs)ΑρχικήΑρχική σελίδαΤαυτότηταΕΓΚΑΤΑΣΤΑΣΗΓραμματοσειρά Ε/Ε (IO)Αν η τελευταία εντολή δημιούργησε εξαίρεση, τότε αυτή η προβολή θα δείξει πληροφορίες στοίβας (stacktrace)Αν δεν μπορείτε να το βρείτε, ίσως χρειαστεί να εγκαταστήσετε πρώτα τον κατάλληλο οδηγό USB.Εάν δεν γνωρίζετε από πού να κατεβάσετε το πακέτο, τότε κατά πάσα πιθανότητα πρέπει να κάνετε αναζήτηση στον κατάλογο πακέτων Python. Ξεκινήστε εισάγοντας το όνομα του πακέτου στο πλαίσιο αναζήτησης παραπάνω και πατώντας ENTER.Εάν το θέλετε ακόμα, τότε εγκαταστήστε το από τη γραμμή εντολών.Αύξηση μεγέθους γραμματοσειράςΑύξηση εσοχής επιλεγμένων γραμμώνΕσοχές με στηλοθέτες (tabs) (δεν συνίσταται για την Python)ΕυρετήριοΕγκατάστασηΕγκατάσταση από PyPIΕγκατάσταση από τοπικό αρχείοΕγκατάσταση από το αρχείο προδιαγραφώνΕγκατάσταση ή ενημέρωση υλικολογισμικούΕγκαταστήθηκε σε:Εγκατεστημένη έκδοση:ΕγκατάστασηΕγκατάσταση ‘%s’ΔιερμηνευτήςΔιακοπή εκτέλεσηςΠρόςΔιατήρησε το τερματικό ανοικτό μετά την ολοκλήρωση της διεργασίας PythonΚλειδίΤαυτότητα κλειδιούΓνωστοί διερμηνευτέςΓλώσσαΤελευταία σταθερή έκδοσηΤελευταία έκδοσηΦόρτωσηΦόρτωσηΦόρτωση %sΤοπικές μεταβλητέςΤοποθεσίαΤοποθεσία: Καταγραφή συμβάντων κατά την χρήση του προγράμματοςΦαίνεται ότι εγκαθιστάτε ένα πακέτο που σχετίζεται με το Thonny. Εάν σκοπεύατε να εγκαταστήσετε ένα πρόσθετο στο Thonny, τότε θα έπρεπε να επιλέξτε "Εργαλεία → Διαχείριση πρόσθετων ..." Είστε βέβαιοι ότι θέλετε να εγκαταστήσετε το %s για το back-end;Φαίνεται ότι προσπαθείτε να εγκαταστήσετε ένα ξεπερασμένο πρόσθετο του Thonny (δεν καθορίζει την απαιτούμενη έκδοση Thonny). Εάν το θέλετε ακόμα, τότε εγκαταστήστε το από τη γραμμή εντολών.Δημιουργήθηκε στο Πανεπιστήμιο Tartu της Εσθονίας με την βοήθεια της κοινότητας λογισμικού ανοιχτού κώδικα, του Raspberry Pi Foundation και της Cybernetica ASΒεβαιωθείτε ότι το MicroPython έχει εγκατασταθεί στο micro:bit σας.Διαχείριση πακέτων για %sΔιαχείριση πακέτων..Διαχείριση προσθέτων...ΜεγιστοποίησηΜέγιστο μήκος τμήματων γραμμής πριν την συμπίεσηΜέγιστος αριθμός διατηρητέων γραμμώνΜπορεί να κάνει την αποσφαλμάτωση πιο αργή.MicroPython (SSH)MicroPython (γενόσημο)MicroPython (τοπική)Συσκευή MicroPythonΤροποποιήθηκεΕνότηταΜετακίνηση στον Κάδο ΑνακύκλωσηςΜετακίνηση στα ΆχρησταΜετακίνηση του %s στο %sΥπενθύμιση! Το αυτόματο κλείσιμο πρέπει να ενεργοποιηθεί στις ρυθμίσεις του τερματικού (Τερματικό → Προτιμήσεις → Προφίλ → Κέλυφος → Όταν το κέλυφος εξέρχεται)Σημείωση! Το κουμπί επιλογής αρχείου μπορεί να μην λειτουργεί σωστά όταν επιλέγονται εκτελέσιμα από εικονικό περιβάλλον. Σε αυτή την περίπτωση να επιλεγεί το σενάριο "ενεργοποίησης" (activate script) αντί για το διερμηνέα (η καταχώρησε το μονοπάτι απευθείας στο πεδίο)! Υπενθύμιση! Μεγάλες τιμές μπορεί να προκαλέσουν αργή απόδοση!Yπενθύμιση! Επανεκκινήστε το Thonny μετά την αλλαγή αυτών των επιλογών!Υπενθύμιση! Ορισμένα στοιχεία στυλ αλλάζουν μόνο μετά την επανεκκίνηση του Thonny!Υπενθύμιση! Μπορεί να υπάρχει άλλη διαθέσιμη έκδοση που είναι συμβατή με την τρέχουσα έκδοση του Thonny. Κάντε κλικ στο κουμπί '...' για να επιλέξετε την έκδοση που θα εγκατασταθεί.Υπενθύμιση! Το Thonny υποστηρίζει μόνο Python 3.5 και νεότερη έκδοσηΥπενθύμιση! Πρέπει να κάνετε επανεκκίνηση του Thonny μετά την εγκατάσταση / αναβάθμιση / κατάργηση της εγκατάστασης ενός πρόσθετου.Σημείωση! Το micropython.org έχει δημοσιεύσει την έκδοση %s αυτού του πακέτου και αυτό θα εγκατασταθεί από προεπιλογή.ΌνομαΝέοΝέος κατάλογοςΝέα πακέτα θα εγκατασταθούν επίσης σε αυτόν τον κατάλογο. Οι άλλες τοποθεσίεςα διαχειρίζονται με εναλλακτικά μέσα.Τα Νέα πακέτα θα εγκατασταθούν στο/στηΕπόμενο αντικείμενοΔεν διατίθεταιΔεν υπάρχει σύνδεσηΔεν υποστηρίζεταιΣημειώσειςΚαμία επιλογήOKΕπιθεωρητής αντικειμένουΆνοιγμα του Βοηθού αυτόματα όταν υπάρχουν προειδοποιήσεις για τον κώδικαΆνοιγμα του Βοηθού αυτόματα όταν το πρόγραμμα τερματιστεί με εξαίρεσηΆνοιξε τον φάκελο δεδομένων του Thonny ...Άνοιξε τον φάκελο προγραμμάτων του Thonny...Αυτόματο άνοιγμα και κλείσιμο της προβολής της ΣτοίβαςΆνοιξε τις εκτιμημένες τιμές στον επιθεωρητή ΑντικειμένουΆνοιγμα από %sΆνοιγμα στο ThonnyΆνοιγμα στο επεξεργαστή κειμένου του ThonnyΆνοιγμα στην προεπιλεγμένη εφαρμογή του συστήματοςΆνοιγμα στο διαχειριστή αρχείων του συστήματοςΆνοιγμα αναπαραγωγής...Άνοιξε το κέλυφος συστήματοςΆνοιγμαΑνοίγει την προβολή στοίβας κατά την πρώτη κλήση και κλείνει όταν το πρόγραμμα επιστρέψει στο κυρίως πλαίσιο.Επιλογές...ΈξωΠεριεχόμεναπάνω απόΑντικατάσταση;Αντικατάσταση θέματος '%s'ΠακέτοΤο πακέτο '{}' είναι απαραίτητο για την εγκατάσταση και την απεγκατάσταση άλλων πακέτων.Το πακέτο δεν είναι διαθέσιμο στο micropython.org. Θα εγκατασταθεί η έκδοση στο PyPI.Ο διαχειριστής πακέτων δεν είναι διαθέσιμος για αυτόν τον διερμηνέαΚατάλογος πακέτωνΚωδικόςΕπικόλλησηΜονοπάτιΕκτέλεση ελέγχων MyPyΕκτέλεση των επιλεγμένων ελέγχων PylintΕλέγξτε την ορθογραφία σας!Παρακαλώ περιμένετεΣχεδιογράφοςΟ σχεδιαστής απεικονίζει μια σειρά από αριθμούς που εκτυπώνονται στο κέλυφος.ΘύραΘύρα η WebREPLΠροτιμώμενο πρόγραμμα αποσφαλμάτωσηςΠαρουσίαση του Python REPL μετά το τέλος του προγράμματοςΠροεπισκόπησηΠροηγούμενο αντικείμενοΕκτύπωση...Παράμετροι προγράμματοςΠαράμετροι προγράμματος:Δέντρο ΠρογράμματοςΙδιότητεςΣελίδα PyPlΛειτουργία Pygame ZeroΕκτελέσιμο της pythonΔιερμηνευτές PythonΤερματισμόςΣίγουρα απεγκατάσταση;Πρόσφατα αρχείαΣυνιστώμενο μέγιστο μήκος γραμμής (Ρυθμίστε στο 0 για να απενεργοποιήσετε τη γραμμή περιθωρίου)ΕπανάληψηΑνανέωσηΚανονική λειτουργίαΑπομακρυσμένη Python 2 (SSH)Μετονομασία...Άνοιγμα όλων των αρχείων από προηγούμενη συνεδρίαΑντικατάστασηΑντικατάσταση όλωνΑντικατάσταση στηλοθετών(tabs) με κενάΑντικατάσταση με:Αντικαταστάση+ΕύρεσηΑναφορά προβλήματοςΑπαιτείΑπαιτεί:ΣυνέχειαΕκτέλεσηΕκτέλεση & ΑποσφαλμάτωσηΕκτέλεση / ΣυνέχειαΕκτέλεση τρέχοντος προγράμματοςΕκτέλεση τρέχοντος προγράμματος στο τερματικόEκτέλεση μέχρι τον κέρσοραΤρέχον εκτελέσιμο πρόγραμμα στο τερματικόΑποθήκευσηΑποθήκευση Όλων των αρχείωνΑποθήκευση ως...Αποθήκευση αντιγράφου...Αποθήκευση κωδικούΑποθήκευση στο %sΑποθήκευσηΑποθήκευση στο %sΠεδίο εφαρμογήςΑναζήτηση στο PyPIΑναζήτησε αποτελέσματαΑναζήτησηΑνατρέξτε στη Βοήθεια για λεπτομέρειες.Επιλογή ΌλωνΕπιλογή όλωνΕπέλεξε ένα αντικείμενο και προσπάθησε ξανά!Επιλέξτε κενό κατάλογο για νέο εικονικό περιβάλλονΕπιλογή υπάρχοντος ή δημιουργία νέου καταλόγουΕπέλεξε αν ο διάλογος αρχείου καταλήγει πίσω από το κυρίως παράθυροΕπιλογή διερμηνευτήΟ επιλεγμένος κατάλογος δεν είναι κενός. Επιλέξτε άλλο ή ακυρώστε.Αποστολή Τέλους Αρχείου (EOF) / Επανεκκίνηση μέσω λογισμικούΣκιασμένα στοιχεία (με εισακτέα):ΚέλυφοςΕμφάνιση σχεδιογράφουΕμφάνιση κλήσεων συναρτήσεων (πλαισίων) σε ξεχωριστά παράθυραΕμφάνιση κρυφών αρχείωνΕμφάνιση αριθμού γραμμώνΜεγέθοςΜέγεθος (bytes)Πηγαίος κώδικαςΣυμπιεσμένο κείμενο (%d χαρακτήρες)ΣτοίβαΞεκινήστε επιλέγοντας το πακέτο από τα αριστερά.ΈναρξηΟπισθοδρόμησηΕίσοδοςΈξοδοςΠροσπέραση ΣταμάτημαΣταμάτημα/Επανεκκίνηση backendΠληροφορίες μέσων αποθήκευσηςΧώρος αποθήκευσηςΜέσα αποθήκευσης στον οδηγό ή στο σύστημα αρχείωνΠερίληψηΑλλαγή σε κανονική λειτουργίαΘεματικό σύνταξηςΣτόχευσε την τοποθεσία της συσκευήςΣτόχευσε το μοντέλο της συσκευήςΣτόχος:ΤερματικόΠροσομοίωση τερματικούΗ απάντηση είναιΗ διεργασία είναι σε εξέλιξη. Είσαι σίγουρος ότι θέλεις να ακυρώσεις;Η παραπάνω αναπαράσταση είναι μια κατά προσέγγιση τιμή αυτού του float. Η ακριβής αποθηκευμένη τιμή είναι %s που είναι περίπου %sΤον ίδιο διερμηνευτή που χρησιμοποιεί τοThonny (προεπιλογή)Το ζητούμενο κειμενο δεν βρέθηκε!Θέμα & ΓραμματοσειράΑυτό το πλαίσιο προορίζεται για τις σημειώσεις εργασίας σας - οδηγίες , αποσπάσματα κώδικα, οτιδήποτε άλλο. Όλα θα αποθηκευτούν αυτόματα και θα φορτωθούν όταν ανοίξετε το Thonny την επόμενη φορά. Διαγράψτε ελεύθερα αυτό το κείμενο για να δημιουργήσετε χώρο για τις σημειώσεις σας.Αυτός ο υπολογιστήςΑυτός ο διάλογος είναι για τη διαχείριση των πρόσθετων του Thonny και των εξαρτήσεων τους. Αν θέλετε να εγκαταστήσετε πακέτα για τα δικά σας προγράμματα, επιλέξτε "Εργαλεία → Διαχείριση πακέτων ..."Αυτό το παράθυρο διαλόγου εμφανίζει όλα τα διαθέσιμα πακέτα, αλλά επιτρέπει την αναβάθμιση και την απεγκατάσταση μόνο των πακέτων απόΑυτός ο διάλογος αναγράφει τις κορυφαίες ενότητες από τα ακόλουθα ευρετήρια: Αυτό είναι ένα σχόλιοΑυτό το πακέτο απαιτεί διαφορετική έκδοση του Thonny:Αυτό το πρόγραμμα δεν παρέχει ΑΠΟΛΥΤΩΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ! Είναι ελεύθερο λογισμικό και είστε ευπρόσδεκτοι να το αναδιανείμετε υπό ορισμένες προϋποθέσεις, βλ https://opensource.org/licenses/MIT για λεπτομέρειεςΑυτό το εικονικό περιβάλλον συντηρείται αυτόματα από το Thonny.Επιλογές ThonnyΠρόσθετα του ThonnyΠρόσθετο του Thonny χωρίς προδιαγραφέςΕναλλαγή σχολίουΕργαλείαΠροσπαθήστε να εντοπίσετε αυτόματα τη θύραΛειτουργία περιβάλλοντος χρήστη (UI)Παράγοντας κλιμάκωσης περιβάλλοντος χρήστη (UI)Θεματικό UIΑποεπιλέξτε εάν θέλετε μια πιο παραδοσιακή εμπειρία.Αφαίρεση σχολίουΑναίρεσηΑπεγκατάστασηΑπεγκατάσταση ‘%s’Ακατάλληλες προδιαγραφέςΕπάνωΑναβάθμισηΑναβάθμιση εξαρτήσεωνΑναβάθμιση ή απεγκατάστασηΑναβάθμιση ‘%s’Ανέβασμα στο %sΑνέβασμα του %s στο %sΧρησιμοποίηστε την εντολή "Stop" αν θέλετε να σταματήσετε την αποσφαλμάτωσηΧρήση διαλόγων αρχείου Tk αντί για ZenityΤιμήΤαυτότητα τιμήςΜεταβλητέςΙστορικό έκδοσηςΈκδοση προς εγκατάστασηΠροβολήΤι να κάνω με ένα %s αρχείο όταν γίνεται διπλό κλικ στον προβολέα αρχείων του Thonny?Ποιον διερμηνευτή ή συσκευή να χρησιμοποιήσει το Thonny για να τρέξει τον κώδικά σου;Με τον τρέχοντα διερμηνευή μπορείτε μόνο να περιηγηθείτε στα πακέτα. Μεταβείτε σε: 'Εργαλεία → Άνοιξε το κέλυφος συστήματος ...' για εγκατάσταση, αναβάθμιση ή απεγκατάσταση.Επεξεργάζεται...Αναδίπλωση κειμένου (ενδέχεται να είναι αργή)Πρέπει να εισέλθετεΠρέπει να επιλέξετε ενα αρχείο!Πρέπει να σταματήσει το πρόγραμμά σου πριν την έναρξη του διαχειριστή πακέτωνΟ διερμηνευτής σας δεν είναι στην λίστα;Μεγέθυνσηόλα τα αρχείαΜπλα, μπλαbytesελεύθερος χώροςΕδώαναζητήστε το όνομα της συσκευής σας, "USB Serial" ή "UART"δεν υπάρχει απόλυτη βιβλιοθήκη ευρετηρίου στο sys.pathΠαρακαλώ περιμένετευποστηρίζει βασικά χρώματα ANSI και στυλγια να εντοπίσετε και να εγκαταστήσετε το πακέτου(συνήθως με επέκταση .whl, .tar.gz ή .zip).για να εντοπίσετε το αρχείο requirements.txt και να εγκαταστήσετε τα πακέτα που ορίζονται από αυτό.συνολικός χώροςανοιχτή_συμβολοσειράχρησιμοποιούμενος χώροςπακέτα ιστότοπου χρήστηεικονικό περιβάλλον././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/el_GR/LC_MESSAGES/thonny.po0000664000175000017500000017605214276461532022106 0ustar00annamaaannamaamsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: el\n" #: thonny/workbench.py:357 msgid "File" msgstr "Αρχείο" #: thonny/workbench.py:358 msgid "Edit" msgstr "Επεξεργασία" #: thonny/workbench.py:359 msgid "View" msgstr "Προβολή" #: thonny/running.py:122 thonny/workbench.py:360 msgid "Run" msgstr "Εκτέλεση" #: thonny/workbench.py:361 msgid "Tools" msgstr "Εργαλεία" #: thonny/plugins/help/__init__.py:74 thonny/workbench.py:362 msgid "Help" msgstr "Βοήθεια" #. Ίσως ο διερμηνευτής να πρέπει να μείνει inerpreter σε παρένθεση #: thonny/plugins/cpython/__init__.py:610 msgid "Alternative Python 3 interpreter or virtual environment" msgstr "Εναλλακτικός διερμηνευτής Python 3 ή εικονικό περιβάλλον" #. Η έννοια του deprecated έχει να κάνει με στοιχεία / λειτουργικότητες που βαίνουν προς κατάργηση στις επόμενες εκδόσεις #: thonny/plugins/cpython/__init__.py:618 msgid "A special virtual environment (deprecated)" msgstr "Ένα ειδικό εικονικό περιβάλλον (προς κατάργηση)" #: thonny/workbench.py:582 msgid "Exit" msgstr "Έξοδος" #: thonny/workbench.py:609 msgid "Decrease font size" msgstr "Μείωση μεγέθους γραμματοσειράς" #: thonny/workbench.py:621 msgid "Focus editor" msgstr "Εστίαση στον επεξεργαστή κειμένου" #: thonny/workbench.py:630 msgid "Focus shell" msgstr "Εστίαση στο κέλυφος" #: thonny/workbench.py:641 msgid "Maximize view" msgstr "Μεγιστοποίηση" #: thonny/workbench.py:653 msgid "Full screen" msgstr "Πλήρης οθόνη" #: thonny/workbench.py:1377 msgid "Program arguments" msgstr "Παράμετροι προγράμματος" #: thonny/plugins/about.py:28 thonny/plugins/about.py:163 msgid "About Thonny" msgstr "Σχετικά με το Thonny" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Δημιουργήθηκε\n" "στο Πανεπιστήμιο Tartu της Εσθονίας\n" "με την βοήθεια της κοινότητας λογισμικού ανοιχτού κώδικα,\n" "του Raspberry Pi Foundation \n" "και της Cybernetica AS" #: thonny/plugins/about.py:107 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Αυτό το πρόγραμμα δεν παρέχει\n" "ΑΠΟΛΥΤΩΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ!\n" "Είναι ελεύθερο λογισμικό και είστε ευπρόσδεκτοι\n" "να το αναδιανείμετε υπό ορισμένες προϋποθέσεις, βλ\n" "https://opensource.org/licenses/MIT\n" "για λεπτομέρειες" #: thonny/plugins/about.py:152 msgid "Version history" msgstr "Ιστορικό έκδοσης" #: thonny/plugins/about.py:159 msgid "Report problems" msgstr "Αναφορά προβλήματος" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Άνοιγμα του Βοηθού αυτόματα όταν το πρόγραμμα τερματιστεί με εξαίρεση" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Άνοιγμα του Βοηθού αυτόματα όταν υπάρχουν προειδοποιήσεις για τον κώδικα" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Εκτέλεση των επιλεγμένων ελέγχων Pylint" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Εκτέλεση ελέγχων MyPy" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Απενεργοποιημένοι έλεγχοι (μία ταυτότητα ανά γραμμή)" #: thonny/assistance.py:968 thonny/plugins/assistant_config_page.py:73 msgid "Assistant" msgstr "Βοηθός" #: thonny/plugins/autocomplete.py:333 msgid "Auto-complete" msgstr "Αυτόματη συμπλήρωση" #: thonny/plugins/backend_config_page.py:84 msgid "Which interpreter or device should Thonny use for running your code?" msgstr "Ποιον διερμηνευτή ή συσκευή να χρησιμοποιήσει το Thonny για να τρέξει τον κώδικά σου;" #: thonny/plugins/backend_config_page.py:320 msgid "Interpreter" msgstr "Διερμηνευτής" #: thonny/plugins/birdseye_frontend.py:54 msgid "About Birdseye" msgstr "Σχετικά με τo Birdseye" #: thonny/plugins/birdseye_frontend.py:55 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Το Birdseye είναι ένας εκσφαλματωτής της Python που πρέπει να εγκατασταθεί ξεχωριστά.\n" "Θέλεις να ανοίξω τη σελίδα βοήθειας? " #: thonny/plugins/birdseye_frontend.py:83 msgid "Debug current script (birdseye)" msgstr "Αποσφαλμάτωση τρέχοντος προγράμματος (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Εναλλαγή σχολίου" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "Προσθήκη σχολίου" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "Αφαίρεση σχολίου" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Αναίρεση" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Επανάληψη" #: thonny/plugins/common_editing_commands.py:49 thonny/ui_utils.py:2176 msgid "Cut" msgstr "Αποκοπή" #: thonny/plugins/common_editing_commands.py:61 thonny/ui_utils.py:2177 msgid "Copy" msgstr "Αντιγραφή" #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2178 msgid "Paste" msgstr "Επικόλληση" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Επιλογή όλων" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1398 msgid "Run to cursor" msgstr "Eκτέλεση μέχρι τον κέρσορα" #: thonny/plugins/debugger.py:980 msgid "Can't close yet" msgstr "Δεν μπορεί να κλείσει ακόμη" #: thonny/plugins/debugger.py:981 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Χρησιμοποίηστε την εντολή \"Stop\" αν θέλετε να σταματήσετε την αποσφαλμάτωση" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Ενσωμάτωση παραθύρων χρήστη" #: thonny/plugins/editor_config_page.py:15 msgid "Highlight matching names" msgstr "Επισήμανε ονόματα που ταιριάζουν" #: thonny/plugins/editor_config_page.py:21 msgid "Highlight local variables" msgstr "Επισήμανε τοπικές μεταβλητές" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight parentheses" msgstr "Επισήμανε παρανθέσεις" #: thonny/plugins/editor_config_page.py:27 msgid "Highlight syntax elements" msgstr "Επισήμανε στοιχεία συντακτικού" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight current line (requires reopening the editor)" msgstr "Επισήμανε την τρέχουσα γραμμή (απαιτεί εκ νέου άνοιγμα του επεξεργαστή κειμένου)" #: thonny/plugins/editor_config_page.py:36 msgid "Allow code completion with Tab-key in editors" msgstr "Να επιτρέπεται η συμπλήρωση κώδικα με το πλήκτρο Tab στον επεξεργαστή κειμένου" #: thonny/plugins/editor_config_page.py:42 msgid "Allow code completion with Tab-key in Shell" msgstr "Να επιτρέπεται η συμπλήρωση κώδικα με το πλήκτρο Tab στο κέλυφος" #: thonny/plugins/editor_config_page.py:51 msgid "Show line numbers" msgstr "Εμφάνιση αριθμού γραμμών" #: thonny/plugins/editor_config_page.py:54 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Συνιστώμενο μέγιστο μήκος γραμμής\n" "(Ρυθμίστε στο 0 για να απενεργοποιήσετε τη γραμμή περιθωρίου)" #: thonny/plugins/editor_config_page.py:75 msgid "Editor" msgstr "Επεξεργαστής κειμένου" #: thonny/plugins/event_logging.py:206 msgid "Export usage logs..." msgstr "Εξαγωγή αρχείων καταγραφής χρήσης ..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Γεγονότα" #: thonny/plugins/files.py:551 msgid "Files" msgstr "Αρχεία" #: thonny/plugins/find_replace.py:57 thonny/plugins/find_replace.py:416 msgid "Find & Replace" msgstr "Εύρεση & Αντικατάσταση" #: thonny/plugins/find_replace.py:63 msgid "Find:" msgstr "Εύρεση:" #: thonny/plugins/find_replace.py:74 msgid "Replace with:" msgstr "Αντικατάσταση με:" #: thonny/plugins/find_replace.py:92 msgid "Case sensitive" msgstr "Διάκριση πεζών-κεφαλαίων" #: thonny/plugins/find_replace.py:99 msgid "Up" msgstr "Επάνω" #: thonny/plugins/find_replace.py:103 msgid "Down" msgstr "Κάτω" #: thonny/plugins/find_replace.py:112 msgid "Find" msgstr "Εύρεση" #: thonny/plugins/find_replace.py:122 msgid "Replace" msgstr "Αντικατάσταση" #: thonny/plugins/find_replace.py:130 msgid "Replace+Find" msgstr "Αντικαταστάση+Εύρεση" #: thonny/plugins/find_replace.py:140 msgid "Replace all" msgstr "Αντικατάσταση όλων" #: thonny/plugins/find_replace.py:236 msgid "Enter string to be replaced." msgstr "Εισάγετε συμβολοσειρά για αντικατάσταση" #: thonny/plugins/find_replace.py:320 msgid "The specified text was not found!" msgstr "Το ζητούμενο κειμενο δεν βρέθηκε!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Να επιτρέπεται μόνο μία εκτέλεση του Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Άνοιγμα όλων των αρχείων από προηγούμενη συνεδρία" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Απενεργοποίηση ηχητικών ειδοποιήσεων" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Λειτουργία κλιμάκωσης γραμματοσειρών" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Η λειτουργία Σωρού είναι ενεργοποιημένη.\n" "Κλείστε την προβολή Σωρού για να την απενεργοποιήσετε." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Σωρός" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Γλώσσα" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Αυτό το πλαίσιο προορίζεται για τις σημειώσεις εργασίας σας - οδηγίες , αποσπάσματα κώδικα, οτιδήποτε άλλο.\n" "\n" "Όλα θα αποθηκευτούν αυτόματα και θα φορτωθούν όταν ανοίξετε το Thonny την επόμενη φορά.\n" "\n" "Διαγράψτε ελεύθερα αυτό το κείμενο για να δημιουργήσετε χώρο για τις σημειώσεις σας." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Σημειώσεις" #: thonny/plugins/object_inspector.py:111 msgid "Previous object" msgstr "Προηγούμενο αντικείμενο" #: thonny/plugins/object_inspector.py:114 msgid "Next object" msgstr "Επόμενο αντικείμενο" #: thonny/plugins/object_inspector.py:704 msgid "Object inspector" msgstr "Επιθεωρητής αντικειμένου" #: thonny/plugins/outline.py:138 msgid "Outline" msgstr "Περιεχόμενα" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Λειτουργία Pygame Zero" #: thonny/plugins/pip_gui.py:78 msgid "Find package from PyPI" msgstr "Εύρεση πακέτου από PyPl" #: thonny/plugins/pip_gui.py:76 msgid "Uninstall" msgstr "Απεγκατάσταση" #: thonny/editors.py:587 thonny/plugins/pip_gui.py:228 thonny/ui_utils.py:448 #: thonny/ui_utils.py:1755 thonny/workdlg.py:155 msgid "Close" msgstr "Κλείσιμο" #: thonny/plugins/pip_gui.py:347 msgid "Click " msgstr "Κλικ " #: thonny/plugins/pip_gui.py:348 thonny/plugins/pip_gui.py:382 msgid "here" msgstr "Εδώ" #: thonny/plugins/pip_gui.py:73 msgid "Upgrade" msgstr "Αναβάθμιση" #: thonny/plugins/esp/__init__.py:365 #: thonny/plugins/micropython/uf2dialog.py:94 thonny/plugins/pip_gui.py:70 msgid "Install" msgstr "Εγκατάσταση" #: thonny/plugins/pip_gui.py:491 msgid "Could not find the package from PyPI." msgstr "Αδυναμία εύρεσης πακέτου από PyPl." #: thonny/plugins/pip_gui.py:511 msgid "Latest stable version" msgstr "Τελευταία σταθερή έκδοση" #: thonny/plugins/pip_gui.py:513 msgid "Latest version" msgstr "Τελευταία έκδοση" #: thonny/plugins/pip_gui.py:514 msgid "Summary" msgstr "Περίληψη" #: thonny/plugins/pip_gui.py:515 msgid "Author" msgstr "Συντάκτης" #: thonny/plugins/pip_gui.py:516 msgid "Homepage" msgstr "Αρχική σελίδα" #: thonny/plugins/pip_gui.py:518 msgid "Bugtracker" msgstr "Ανιχνευτής σφαλμάτων" #: thonny/plugins/pip_gui.py:520 msgid "Documentation" msgstr "Βιβλιογραφία" #: thonny/plugins/pip_gui.py:522 msgid "PyPI page" msgstr "Σελίδα PyPl" #: thonny/plugins/pip_gui.py:526 msgid "Requires" msgstr "Απαιτεί" #: thonny/plugins/pip_gui.py:652 msgid "Really uninstall?" msgstr "Σίγουρα απεγκατάσταση;" #: thonny/plugins/pip_gui.py:657 msgid "Are you sure you want to uninstall it?" msgstr "Είσαι σίγουρος ότι θέλεις να το απεγκαταστήσεις;" #: thonny/plugins/variables.py:19 msgid "Back to\n" "current frame" msgstr "Πίσω στο τρέχoν πλαίσιο" #: thonny/plugins/variables.py:73 thonny/plugins/variables.py:75 #: thonny/plugins/variables.py:138 msgid "Variables" msgstr "Μεταβλητές" #: thonny/base_file_browser.py:1313 msgid "This computer" msgstr "Αυτός ο υπολογιστής" #: thonny/base_file_browser.py:618 msgid "Refresh" msgstr "Ανανέωση" #: thonny/base_file_browser.py:631 msgid "Focus into" msgstr "Εστίαση σε" #: thonny/base_file_browser.py:1164 msgid "Error" msgstr "Σφάλμα" #: thonny/base_file_browser.py:1164 msgid "You need to select a file!" msgstr "Πρέπει να επιλέξετε ενα αρχείο!" #: thonny/base_file_browser.py:1168 msgid "Overwrite?" msgstr "Αντικατάσταση;" #: thonny/base_file_browser.py:1168 msgid "Do you want to overwrite '%s' ?" msgstr "Θέλετε να αντικαταστήσετε το '%s';" #: thonny/editors.py:552 thonny/editors.py:554 msgid "New" msgstr "Νέο" #: thonny/editors.py:565 msgid "Open..." msgstr "Άνοιγμα" #: thonny/editors.py:567 msgid "Load" msgstr "Φόρτωση" #: thonny/editors.py:576 msgid "Recent files" msgstr "Πρόσφατα αρχεία" #: thonny/editors.py:598 thonny/ui_utils.py:450 msgid "Close all" msgstr "Κλείσιμο όλων" #: thonny/editors.py:608 thonny/editors.py:610 msgid "Save" msgstr "Αποθήκευση" #: thonny/editors.py:633 msgid "Save as..." msgstr "Αποθήκευση ως..." #: thonny/editors.py:644 msgid "Save copy..." msgstr "Αποθήκευση αντιγράφου..." #: thonny/editors.py:653 msgid "Rename..." msgstr "Μετονομασία..." #: thonny/config_ui.py:19 msgid "Thonny options" msgstr "Επιλογές Thonny" #: thonny/running.py:121 msgid "Run current script" msgstr "Εκτέλεση τρέχοντος προγράμματος" #: thonny/running.py:152 msgid "Run current script in terminal" msgstr "Εκτέλεση τρέχοντος προγράμματος στο τερματικό" #: thonny/running.py:165 msgid "Stop/Restart backend" msgstr "Σταμάτημα/Επανεκκίνηση backend" #: thonny/running.py:166 msgid "Stop" msgstr "Σταμάτημα" #: thonny/running.py:177 msgid "Interrupt execution" msgstr "Διακοπή εκτέλεσης" #: thonny/running.py:190 msgid "Send EOF / Soft reboot" msgstr "Αποστολή Τέλους Αρχείου (EOF) / Επανεκκίνηση μέσω λογισμικού" #: thonny/running.py:201 msgid "Disconnect" msgstr "Αποσύνδεση" #: thonny/running_config_page.py:23 msgid "Known interpreters" msgstr "Γνωστοί διερμηνευτές" #: thonny/running_config_page.py:36 msgid "Your interpreter isn't in the list?" msgstr "Ο διερμηνευτής σας δεν είναι στην λίστα;" #: thonny/plugins/cpython/__init__.py:391 msgid "NB! Thonny only supports Python 3.5 and later" msgstr "Υπενθύμιση! Το Thonny υποστηρίζει μόνο Python 3.5 και νεότερη έκδοση" #: thonny/running_config_page.py:56 msgid "Create new virtual environment" msgstr "Δημιουργία νέου εικονικού περιβάλλοντος" #: thonny/running_config_page.py:59 msgid "Select existing or create a new empty directory" msgstr "Επιλογή υπάρχοντος ή δημιουργία νέου καταλόγου" #: thonny/plugins/cpython/__init__.py:419 msgid "Python interpreters" msgstr "Διερμηνευτές Python" #: thonny/plugins/cpython/__init__.py:420 thonny/plugins/pip_gui.py:696 #: thonny/plugins/pip_gui.py:709 msgid "all files" msgstr "όλα τα αρχεία" #: thonny/plugins/cpython/__init__.py:442 msgid "Select empty directory for new virtual environment" msgstr "Επιλέξτε κενό κατάλογο για νέο εικονικό περιβάλλον" #: thonny/plugins/cpython/__init__.py:449 msgid "Bad directory" msgstr "Προβληματικός κατάλογος" #: thonny/plugins/cpython/__init__.py:450 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Ο επιλεγμένος κατάλογος δεν είναι κενός.\n" "Επιλέξτε άλλο ή ακυρώστε." #: thonny/plugins/cpython/__init__.py:467 msgid "Creating virtual environment" msgstr "Δημιουργία εικονικού περιβάλλοντος" #: thonny/shell.py:83 msgid "Clear shell" msgstr "Καθάρισε το κέλυφος" #: thonny/shell.py:138 msgid "Plotter" msgstr "Σχεδιογράφος" #: thonny/shell.py:269 msgid "Clear" msgstr "Καθάρισμα" #: thonny/shell.py:282 msgid "Show Plotter" msgstr "Εμφάνιση σχεδιογράφου" #: thonny/shell.py:1572 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Για λόγους απόδοσης, το κέλυφος αποφεύγει να εμφανίζει πλήρως τις μεγάλες γραμμές (βλ. Εργαλεία=> Επιλογές=> Κέλυφος).\n" "Εδώ μπορείτε να αλληλεπιδράσετε με το αρχικό κειμένο." #: thonny/shell.py:1583 msgid "Wrap text (may be slow)" msgstr "Αναδίπλωση κειμένου (ενδέχεται να είναι αργή)" #: thonny/ui_utils.py:1750 msgid "Copy to clipboard" msgstr "Αντιγραφή στο πρόχειρο" #: thonny/shell.py:1431 msgid "Expand in Shell" msgstr "Επέκτεινε στο Κέλυφος" #: thonny/shell.py:1625 msgid "Squeezed text (%d characters)" msgstr "Συμπιεσμένο κείμενο (%d χαρακτήρες)" #: thonny/shell.py:1794 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Ο σχεδιαστής απεικονίζει μια σειρά από\n" "αριθμούς που εκτυπώνονται στο κέλυφος." #: thonny/shell.py:1796 msgid "See Help for details." msgstr "Ανατρέξτε στη Βοήθεια για λεπτομέρειες." #: thonny/ui_utils.py:449 msgid "Close others" msgstr "Κλείσε τα υπόλοιπα" #: thonny/ui_utils.py:1606 msgid "Copying" msgstr "Αντιγραφή" #: thonny/ui_utils.py:1609 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Αντιγραφή από\n" "  %s\n" "στο\n" "  %s" #: thonny/base_file_browser.py:1133 thonny/config_ui.py:36 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:273 thonny/plugins/pip_gui.py:1146 #: thonny/ui_utils.py:114 thonny/ui_utils.py:1617 thonny/ui_utils.py:1702 #: thonny/workdlg.py:157 thonny/workdlg.py:201 msgid "Cancel" msgstr "Ακύρωση" #: thonny/base_file_browser.py:1130 thonny/config_ui.py:35 thonny/export.py:25 #: thonny/plugins/about.py:120 thonny/plugins/backend_config_page.py:268 #: thonny/ui_utils.py:111 thonny/ui_utils.py:1699 thonny/workdlg.py:198 msgid "OK" msgstr "OK" #: thonny/ui_utils.py:1783 msgid "Cancel the process?" msgstr "Ακύρωση της διαδικασίας;" #: thonny/ui_utils.py:1784 msgid "The process is still running.\n" "Are you sure you want to cancel?" msgstr "Η διεργασία είναι σε εξέλιξη.\n" "Είσαι σίγουρος ότι θέλεις να ακυρώσεις;" #: thonny/ui_utils.py:2182 msgid "Select All" msgstr "Επιλογή Όλων" #: thonny/plugins/shell_config_page.py:73 thonny/workbench.py:158 msgid "Shell" msgstr "Κέλυφος" #: thonny/plugins/cpython/__init__.py:602 msgid "The same interpreter which runs Thonny (default)" msgstr "Τον ίδιο διερμηνευτή που χρησιμοποιεί τοThonny (προεπιλογή)" #: thonny/plugins/cpython/__init__.py:350 msgid "This virtual environment is automatically maintained by Thonny.\n" "" msgstr "Αυτό το εικονικό περιβάλλον συντηρείται αυτόματα από το Thonny." #: thonny/plugins/cpython/__init__.py:351 msgid "Location: " msgstr "Τοποθεσία: " #: thonny/workbench.py:592 msgid "Options..." msgstr "Επιλογές..." #: thonny/workbench.py:599 msgid "Increase font size" msgstr "Αύξηση μεγέθους γραμματοσειράς" #: thonny/workbench.py:664 msgid "Change font size" msgstr "Αλλαγή μεγέθους γραμματοσειράς" #: thonny/workbench.py:665 msgid "Zoom" msgstr "Μεγέθυνση" #: thonny/workbench.py:674 msgid "Exit Thonny" msgstr "Έξοδος από το Thonny" #: thonny/workbench.py:677 msgid "Quit" msgstr "Τερματισμός" #: thonny/workbench.py:1181 thonny/workbench.py:1189 msgid "Overwriting theme '%s'" msgstr "Αντικατάσταση θέματος '%s'" #: thonny/workbench.py:1348 msgid "Program arguments:" msgstr "Παράμετροι προγράμματος:" #: thonny/workbench.py:1402 msgid "Regular mode" msgstr "Κανονική λειτουργία" #: thonny/workbench.py:1403 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Οι ρυθμίσεις έχουν ενημερωθεί. Κάντε επανεκκίνηση του Thonny για να αρχίσετε να εργάζεστε σε κανονική λειτουργία.\n" "\n" "(Δείτε 'Εργαλεία → Επιλογές → Γενικά' αν αλλάξετε γνώμη αργότερα.)" #: thonny/plugins/ast_view.py:210 msgid "Program tree" msgstr "Δέντρο Προγράμματος" #: thonny/plugins/backend_config_page.py:323 msgid "Select interpreter" msgstr "Επιλογή διερμηνευτή" #: thonny/plugins/debugger.py:1280 msgid "Resume" msgstr "Συνέχεια" #: thonny/plugins/debugger.py:1296 msgid "Run / resume" msgstr "Εκτέλεση / Συνέχεια" #: thonny/plugins/debugger.py:1311 msgid "Debug current script" msgstr "Αποσφαλμάτωση τρέχοντος προγράμματος" #: thonny/plugins/debugger.py:1313 msgid "Debug" msgstr "Αποσφαλμάτωση" #: thonny/plugins/debugger.py:1324 msgid "Debug current script (nicer)" msgstr "Αποσφαλμάτωση τρέχοντος προγράμματος (καλύτερη)" #: thonny/plugins/debugger.py:1336 msgid "Debug current script (faster)" msgstr "Αποσφαλμάτωση τρέχοντος προγράμματος (ταχύτερη)" #: thonny/plugins/debugger.py:1347 msgid "Step over" msgstr "Προσπέραση\n" "" #: thonny/plugins/debugger.py:1349 msgid "Over" msgstr "πάνω από" #: thonny/plugins/debugger.py:1360 msgid "Step into" msgstr "Είσοδος" #: thonny/plugins/debugger.py:1362 msgid "Into" msgstr "Πρός" #: thonny/plugins/debugger.py:1373 msgid "Step out" msgstr "Έξοδος" #: thonny/plugins/debugger.py:1375 msgid "Out" msgstr "Έξω" #: thonny/plugins/debugger.py:1410 msgid "Step back" msgstr "Οπισθοδρόμηση" #: thonny/plugins/debugger.py:1412 msgid "Back" msgstr "Πίσω" #: thonny/plugins/debugger.py:1418 msgid "Stack" msgstr "Στοίβα" #: thonny/plugins/debugger.py:1419 msgid "Exception" msgstr "Εξαίρεση" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Καταγραφή συμβάντων κατά την χρήση του προγράμματος" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Λειτουργία εντοπισμού σφαλμάτων (παρέχει πιο λεπτομερή καταγραφή διαγνωστικών)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Λειτουργία περιβάλλοντος χρήστη (UI)" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Παράγοντας κλιμάκωσης περιβάλλοντος χρήστη (UI)" #: thonny/plugins/general_config_page.py:108 msgid "NB! Restart Thonny after changing these options!" msgstr "Yπενθύμιση! Επανεκκινήστε το Thonny μετά την αλλαγή αυτών των επιλογών!" #. αλλαγή 1/11 #: thonny/plugins/general_config_page.py:129 msgid "General" msgstr "Γενικά" #: thonny/plugins/pip_gui.py:129 msgid "INSTALL" msgstr "ΕΓΚΑΤΑΣΤΑΣΗ" #: thonny/plugins/pip_gui.py:365 msgid "Browse the packages" msgstr "Περιήγηση στα πακέτα" #: thonny/plugins/pip_gui.py:368 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Με τον τρέχοντα διερμηνευή μπορείτε μόνο να περιηγηθείτε στα πακέτα.\n" "Μεταβείτε σε: 'Εργαλεία → Άνοιξε το κέλυφος συστήματος ...' για εγκατάσταση, αναβάθμιση ή απεγκατάσταση." #: thonny/plugins/pip_gui.py:376 msgid "Packages' directory" msgstr "Κατάλογος πακέτων" #: thonny/plugins/pip_gui.py:333 msgid "Install from PyPI" msgstr "Εγκατάσταση από PyPI" #: thonny/plugins/pip_gui.py:336 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Εάν δεν γνωρίζετε από πού να κατεβάσετε το πακέτο, τότε κατά πάσα πιθανότητα πρέπει να κάνετε αναζήτηση στον κατάλογο πακέτων Python. Ξεκινήστε εισάγοντας το όνομα του πακέτου στο πλαίσιο αναζήτησης παραπάνω και πατώντας ENTER." #: thonny/plugins/pip_gui.py:352 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "για να εντοπίσετε το αρχείο requirements.txt και να εγκαταστήσετε τα πακέτα που ορίζονται από αυτό." #: thonny/plugins/pip_gui.py:381 msgid "Click" msgstr "Κάντε κλικ" #: thonny/plugins/pip_gui.py:386 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "για να εντοπίσετε και να εγκαταστήσετε το πακέτου(συνήθως με επέκταση .whl, .tar.gz ή .zip)." #: thonny/plugins/micropython/pip_gui.py:243 thonny/plugins/pip_gui.py:393 msgid "Upgrade or uninstall" msgstr "Αναβάθμιση ή απεγκατάσταση" #: thonny/plugins/pip_gui.py:395 msgid "Start by selecting the package from the left." msgstr "Ξεκινήστε επιλέγοντας το πακέτο από τα αριστερά." #: thonny/plugins/pip_gui.py:399 msgid "Target:" msgstr "Στόχος:" #: thonny/plugins/pip_gui.py:401 msgid "virtual environment" msgstr "εικονικό περιβάλλον" #: thonny/plugins/pip_gui.py:403 msgid "user site packages" msgstr "πακέτα ιστότοπου χρήστη" #: thonny/plugins/pip_gui.py:407 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Αυτό το παράθυρο διαλόγου εμφανίζει όλα τα διαθέσιμα πακέτα, αλλά επιτρέπει την αναβάθμιση και την απεγκατάσταση μόνο των πακέτων από" #: thonny/plugins/pip_gui.py:417 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Νέα πακέτα θα εγκατασταθούν επίσης σε αυτόν τον κατάλογο. Οι άλλες τοποθεσίεςα διαχειρίζονται με εναλλακτικά μέσα." #: thonny/plugins/pip_gui.py:441 msgid "Installed version:" msgstr "Εγκατεστημένη έκδοση:" #: thonny/plugins/micropython/pip_gui.py:147 thonny/plugins/pip_gui.py:443 msgid "Installed to:" msgstr "Εγκαταστήθηκε σε:" #: thonny/plugins/pip_gui.py:494 msgid "Please check your spelling!" msgstr "Ελέγξτε την ορθογραφία σας!" #: thonny/plugins/pip_gui.py:512 msgid "You need to enter" msgstr "Πρέπει να εισέλθετε" #: thonny/plugins/pip_gui.py:498 msgid "Could not find the package info from PyPI." msgstr "Δεν ήταν δυνατή η εύρεση των πληροφοριών πακέτου από PyPI." #: thonny/plugins/pip_gui.py:500 thonny/plugins/pip_gui.py:1200 msgid "Error code:" msgstr "Κωδικός σφάλματος:" #: thonny/plugins/pip_gui.py:601 msgid "Can't find package name from the list:" msgstr "Δεν βρέθηκε το όνομα πακέτου από τη λίστα:" #: thonny/plugins/pip_gui.py:653 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Το πακέτο '{}' είναι απαραίτητο για την εγκατάσταση και την απεγκατάσταση άλλων πακέτων." #: thonny/plugins/pip_gui.py:696 msgid "Package" msgstr "Πακέτο" #: thonny/plugins/pip_gui.py:796 msgid "Manage packages for %s" msgstr "Διαχείριση πακέτων για %s" #: thonny/plugins/pip_gui.py:872 msgid "Confirmation" msgstr "Επιβεβαίωση" #: thonny/plugins/pip_gui.py:873 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Φαίνεται ότι εγκαθιστάτε ένα πακέτο που σχετίζεται με το Thonny.\n" "Εάν σκοπεύατε να εγκαταστήσετε ένα πρόσθετο στο Thonny, τότε \n" "θα έπρεπε να επιλέξτε \"Εργαλεία → Διαχείριση πρόσθετων ...\"\n" "\n" "Είστε βέβαιοι ότι θέλετε να εγκαταστήσετε το %s για το back-end;" #: thonny/plugins/pip_gui.py:981 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "Υπενθύμιση! Μπορεί να υπάρχει άλλη διαθέσιμη έκδοση που είναι συμβατή με την τρέχουσα έκδοση του Thonny. Κάντε κλικ στο κουμπί '...' για να επιλέξετε την έκδοση που θα εγκατασταθεί." #: thonny/plugins/pip_gui.py:989 msgid "Thonny plugin without requirements" msgstr "Πρόσθετο του Thonny χωρίς προδιαγραφές" #: thonny/plugins/pip_gui.py:990 msgid "Looks like you are trying to install an outdated Thonny\n" "plug-in (it doesn't specify required Thonny version).\n" "\n" "If you still want it, then please install it from the command line." msgstr "Φαίνεται ότι προσπαθείτε να εγκαταστήσετε ένα ξεπερασμένο πρόσθετο\n" "του Thonny (δεν καθορίζει την απαιτούμενη έκδοση Thonny).\n" "\n" "Εάν το θέλετε ακόμα, τότε εγκαταστήστε το από τη γραμμή εντολών." #: thonny/plugins/pip_gui.py:1004 msgid "Unsuitable requirements" msgstr "Ακατάλληλες προδιαγραφές" #: thonny/plugins/pip_gui.py:1005 msgid "This package requires different Thonny version:" msgstr "Αυτό το πακέτο απαιτεί διαφορετική έκδοση του Thonny:" #: thonny/plugins/pip_gui.py:1009 msgid "If you still want it, then please install it from the command line." msgstr "Εάν το θέλετε ακόμα, τότε εγκαταστήστε το από τη γραμμή εντολών." #: thonny/plugins/pip_gui.py:1052 msgid "(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)" msgstr "(Σε αυτήν την περίπτωση, το back-end του Thonny χρησιμοποιεί τον ίδιο διερμηνευτή, επομένως και τα δύο παράθυρα διαχειρίζονται τα ίδια πακέτα.)" #: thonny/plugins/pip_gui.py:1058 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "Υπενθύμιση! Πρέπει να κάνετε επανεκκίνηση του Thonny μετά την εγκατάσταση / αναβάθμιση / κατάργηση της εγκατάστασης ενός πρόσθετου." #: thonny/plugins/pip_gui.py:1068 msgid "Thonny plug-ins" msgstr "Πρόσθετα του Thonny" #: thonny/plugins/pip_gui.py:1090 msgid "Advanced install / upgrade / downgrade" msgstr "Προχωρημένη εγκατάσταση / αναβάθμιση / υποβάθμιση" #: thonny/plugins/pip_gui.py:1099 msgid "Desired version" msgstr "Επιθυμητή έκδοση" #: thonny/plugins/pip_gui.py:1137 msgid "Upgrade dependencies" msgstr "Αναβάθμιση εξαρτήσεων" #: thonny/plugins/pip_gui.py:1198 msgid "Requires:" msgstr "Απαιτεί:" #: thonny/plugins/pip_gui.py:1202 msgid "Error:" msgstr "Σφάλμα:" #: thonny/plugins/pip_gui.py:1409 msgid "Manage packages..." msgstr "Διαχείριση πακέτων.." #: thonny/plugins/pip_gui.py:1415 msgid "Manage plug-ins..." msgstr "Διαχείριση προσθέτων..." #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "Άνοιγμα αναπαραγωγής..." #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "Αλλαγή από τον τρέχοντα κατάλογο εργασίας στον κατάλογο του προγράμματος κατά την Eκτέλεση/Αποσφαλμάτωση" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Εμφάνιση κλήσεων συναρτήσεων (πλαισίων) σε ξεχωριστά παράθυρα" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "Αποεπιλέξτε εάν θέλετε μια πιο παραδοσιακή εμπειρία." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Αυτόματο άνοιγμα και κλείσιμο της προβολής της Στοίβας" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Ανοίγει την προβολή στοίβας κατά την πρώτη κλήση και κλείνει όταν το πρόγραμμα επιστρέψει στο κυρίως πλαίσιο." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Να επιτρέπεται η μετάβαση σε βιβλιοθήκες (π.χ. εκτός του καταλόγου του κύριου προγράμματος)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Μπορεί να κάνει την αποσφαλμάτωση πιο αργή." #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "Προτιμώμενο πρόγραμμα αποσφαλμάτωσης" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(χρησιμοποιείται όταν κάνετε κλικ στο κουμπί Αποσφαλμάτωση)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Θύρα Birdseye" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(επανεκιννήστε το Thonny μετά από αυτήν την αλλαγή)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Εκτέλεση & Αποσφαλμάτωση" #: thonny/plugins/shell_config_page.py:17 msgid "Terminal emulation" msgstr "Προσομοίωση τερματικού" #: thonny/plugins/shell_config_page.py:19 msgid "supports basic ANSI-colors and styles" msgstr "υποστηρίζει βασικά χρώματα ANSI και στυλ" #: thonny/plugins/shell_config_page.py:31 msgid "Maximum number of lines to keep." msgstr "Μέγιστος αριθμός διατηρητέων γραμμών" #: thonny/plugins/shell_config_page.py:33 msgid "NB! Large values may cause poor performance!" msgstr "Υπενθύμιση! Μεγάλες τιμές μπορεί να προκαλέσουν αργή απόδοση!" #: thonny/plugins/shell_config_page.py:49 msgid "Maximum length of line fragments before squeezing" msgstr "Μέγιστο μήκος τμήματων γραμμής πριν την συμπίεση" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Τρέχον εκτελέσιμο πρόγραμμα στο τερματικό" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Παρουσίαση του Python REPL μετά το τέλος του προγράμματος" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Διατήρησε το τερματικό ανοικτό μετά την ολοκλήρωση της διεργασίας Python" #: thonny/plugins/terminal_config_page.py:31 #, fuzzy msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "Υπενθύμιση! Το αυτόματο κλείσιμο πρέπει να ενεργοποιηθεί στις ρυθμίσεις του τερματικού\n" "(Τερματικό → Προτιμήσεις → Προφίλ → Κέλυφος → Όταν το κέλυφος εξέρχεται)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Τερματικό" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "Θεματικό UI" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Θεματικό σύνταξης" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Γραμματοσειρά επεξεργαστή κειμένου" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "Γραμματοσειρά Ε/Ε (IO)" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Προεπισκόπηση" #: thonny/plugins/theme_and_font_config_page.py:145 msgid "This is a comment" msgstr "Αυτό είναι ένα σχόλιο" #: thonny/plugins/theme_and_font_config_page.py:148 msgid "The answer is" msgstr "Η απάντηση είναι" #: thonny/plugins/theme_and_font_config_page.py:152 msgid "unclosed_string" msgstr "ανοιχτή_συμβολοσειρά" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "blah, blah" msgstr "Μπλα, μπλα" #: thonny/plugins/theme_and_font_config_page.py:177 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "Υπενθύμιση! Ορισμένα στοιχεία στυλ αλλάζουν μόνο μετά την επανεκκίνηση του Thonny!" #: thonny/plugins/theme_and_font_config_page.py:216 msgid "Enter an integer" msgstr "Εισάγετε έναν ακέραιο αριθμό" #: thonny/plugins/theme_and_font_config_page.py:229 msgid "Theme & Font" msgstr "Θέμα & Γραμματοσειρά" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Άνοιξε τον φάκελο προγραμμάτων του Thonny..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Άνοιξε τον φάκελο δεδομένων του Thonny ..." #: thonny/plugins/help/__init__.py:64 msgid "Home" msgstr "Αρχική" #: thonny/plugins/help/__init__.py:75 msgid "Help contents" msgstr "Περιεχόμενα Βοήθειας" #: thonny/plugins/micropython/__init__.py:274 msgid "CircuitPython device" msgstr "Συσκευή CircuitPython" #: thonny/plugins/micropython/__init__.py:278 msgid "MicroPython device" msgstr "Συσκευή MicroPython" #: thonny/plugins/micropython/__init__.py:476 msgid "Connect your device to the computer and select corresponding port below" msgstr "Συνδέστε τη συσκευή σας στον υπολογιστή και επιλέξτε την αντίστοιχη θύρα παρακάτω" #: thonny/plugins/micropython/__init__.py:479 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "αναζητήστε το όνομα της συσκευής σας, \"USB Serial\" ή \"UART\"" #: thonny/plugins/micropython/__init__.py:481 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Αν δεν μπορείτε να το βρείτε, ίσως χρειαστεί να εγκαταστήσετε πρώτα τον κατάλληλο οδηγό USB." #: thonny/plugins/micropython/__init__.py:401 msgid "Port" msgstr "Θύρα" #: thonny/plugins/micropython/__init__.py:411 msgid "Try to detect port automatically" msgstr "Προσπαθήστε να εντοπίσετε αυτόματα τη θύρα" #: thonny/plugins/micropython/__init__.py:954 msgid "MicroPython (generic)" msgstr "MicroPython (γενόσημο)" #: thonny/plugins/printing/__init__.py:82 msgid "Print..." msgstr "Εκτύπωση..." #: thonny/plugins/system_shell/__init__.py:59 msgid "Open system shell..." msgstr "Άνοιξε το κέλυφος συστήματος" #: thonny/plugins/backend_config_page.py:103 msgid "Details" msgstr "Λεπτομέρειες" #: thonny/plugins/pip_gui.py:345 msgid "Install from requirements file" msgstr "Εγκατάσταση από το αρχείο προδιαγραφών" #: thonny/plugins/pip_gui.py:380 msgid "Install from local file" msgstr "Εγκατάσταση από τοπικό αρχείο" #: thonny/plugins/pip_gui.py:1038 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Αυτός ο διάλογος είναι για τη διαχείριση των πρόσθετων του Thonny και των εξαρτήσεων τους.\n" "Αν θέλετε να εγκαταστήσετε πακέτα για τα δικά σας προγράμματα, επιλέξτε \"Εργαλεία → Διαχείριση πακέτων ...\"" #: thonny/plugins/circuitpython/__init__.py:163 msgid "CircuitPython (generic)" msgstr "CircuitPython (γενόσημο)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Αύξηση εσοχής επιλεγμένων γραμμών" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "Μείωση εσοχής επιλεγμένων γραμμών" #: thonny/workbench.py:1391 msgid "Switch to\n" "regular\n" "mode" msgstr "Αλλαγή σε\n" "κανονική\n" "λειτουργία" #: thonny/plugins/microbit/__init__.py:55 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Βεβαιωθείτε ότι το MicroPython έχει εγκατασταθεί στο micro:bit σας." #: thonny/plugins/microbit/__init__.py:57 msgid "Don't forget that main.py only works without embedded main script." msgstr "Μην ξεχνάτε ότι το main.py λειτουργεί μόνο χωρίς ενσωματωμένο κύριο πρόγραμμα." #: thonny/plugins/micropython/uf2dialog.py:45 msgid "please wait" msgstr "Παρακαλώ περιμένετε" #: thonny/plugins/microbit/__init__.py:199 msgid "Done!" msgstr "Ολοκληρώθηκε!" #: thonny/plugins/micropython/__init__.py:298 msgid "Firmware" msgstr "Yλικολογισμικό" #: thonny/misc_utils.py:134 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Δεν ήταν δυνατή η εύρεση του δίσκου '%s'. Θέλετε να τον εντοπίσετε μόνοι σας;" #: thonny/misc_utils.py:137 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Βρέθηκαν διάφοροι δίσκοι '%s'. Θέλετε να επιλέξετε έναν εσείς;" #: thonny/misc_utils.py:153 msgid "Can't find suitable disk" msgstr "Δεν είναι δυνατή η εύρεση κατάλληλου δίσκου" #: thonny/base_file_browser.py:273 msgid "%d items" msgstr "%d στοιχεία" #: thonny/base_file_browser.py:692 msgid "Move to Recycle Bin" msgstr "Μετακίνηση στον Κάδο Ανακύκλωσης" #: thonny/base_file_browser.py:694 msgid "Move to Trash" msgstr "Μετακίνηση στα Άχρηστα" #: thonny/base_file_browser.py:697 msgid "Delete" msgstr "Διαγραφή" #: thonny/base_file_browser.py:700 thonny/base_file_browser.py:834 msgid "New directory" msgstr "Νέος κατάλογος" #: thonny/base_file_browser.py:703 msgid "Properties" msgstr "Ιδιότητες" #: thonny/base_file_browser.py:705 msgid "Storage space" msgstr "Χώρος αποθήκευσης" #: thonny/base_file_browser.py:715 msgid "Path" msgstr "Μονοπάτι" #: thonny/base_file_browser.py:717 msgid "Directory properties" msgstr "Ιδιότητες καταλόγου" #: thonny/base_file_browser.py:719 msgid "File properties" msgstr "Ιδιότητες αρχείου" #: thonny/base_file_browser.py:721 msgid "bytes" msgstr "bytes" #: thonny/base_file_browser.py:724 msgid "Size" msgstr "Μεγέθος" #: thonny/base_file_browser.py:83 thonny/base_file_browser.py:735 msgid "Modified" msgstr "Τροποποιήθηκε" #: thonny/base_file_browser.py:794 msgid "Deleting %s" msgstr "Διαγραφή %s" #: thonny/base_file_browser.py:817 msgid "Moving %s to %s" msgstr "Μετακίνηση του %s στο %s" #: thonny/editors.py:219 msgid "Loading" msgstr "Φόρτωση" #: thonny/editors.py:335 msgid "Saving" msgstr "Αποθήκευση" #: thonny/running.py:1408 msgid "Working..." msgstr "Επεξεργάζεται..." #: thonny/plugins/files.py:199 msgid "Uploading %s to %s" msgstr "Ανέβασμα του %s στο %s" #: thonny/plugins/files.py:216 msgid "Upload to %s" msgstr "Ανέβασμα στο %s" #: thonny/plugins/files.py:362 msgid "Downloading %s to %s" msgstr "Λήψη του %s στο %s" #: thonny/plugins/files.py:275 msgid "Download to %s" msgstr "Μεταφόρτωση στο %s" #: thonny/base_file_browser.py:620 msgid "Open in system file manager" msgstr "Άνοιγμα στο διαχειριστή αρχείων του συστήματος" #: thonny/base_file_browser.py:625 msgid "Hide hidden files" msgstr "Απόκρυψη κρυφών αρχείων" #: thonny/base_file_browser.py:625 msgid "Show hidden files" msgstr "Εμφάνιση κρυφών αρχείων" #: thonny/base_file_browser.py:635 msgid "Open in Thonny" msgstr "Άνοιγμα στο Thonny" #: thonny/base_file_browser.py:640 thonny/base_file_browser.py:661 msgid "Open in system default app" msgstr "Άνοιγμα στην προεπιλεγμένη εφαρμογή του συστήματος" #: thonny/base_file_browser.py:647 thonny/base_file_browser.py:669 msgid "Configure %s files" msgstr "Διαμόρφωση %s αρχείων" #: thonny/base_file_browser.py:670 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Τι να κάνω με ένα %s αρχείο όταν γίνεται διπλό κλικ στον προβολέα αρχείων του Thonny?" #: thonny/base_file_browser.py:1042 thonny/plugins/micropython/pip_gui.py:77 msgid "Deleting" msgstr "Διαγραφή" #: thonny/base_file_browser.py:1049 msgid "Creating directory" msgstr "Δημιουργία φακέλου" #: thonny/editors.py:217 msgid "Loading %s" msgstr "Φόρτωση %s" #: thonny/editors.py:333 msgid "Saving to %s" msgstr "Αποθήκευση στο %s" #: thonny/editors.py:622 thonny/editors.py:624 msgid "Save All files" msgstr "Αποθήκευση Όλων των αρχείων" #: thonny/workbench.py:828 msgid "Configure interpreter..." msgstr "Ρύθμιση διερμηνέα..." #: thonny/workbench.py:1501 msgid "Device" msgstr "Συσκευή" #: thonny/workdlg.py:185 msgid "Cancelling" msgstr "Ακύρωση" #: thonny/workdlg.py:212 msgid "Starting" msgstr "Έναρξη" #: thonny/plugins/backend_config_page.py:234 msgid "Authentication" msgstr "Ταυτοποίηση" #: thonny/plugins/backend_config_page.py:236 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Εισαγωγή συνθηματικού για τα προσωπικο κλειδί για το \n" "{}" #: thonny/plugins/backend_config_page.py:239 msgid "Enter your password for\n" "{}" msgstr "Εισαγωγή κωδικού για\n" "{}" #: thonny/plugins/object_inspector.py:458 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Η παραπάνω αναπαράσταση είναι μια κατά προσέγγιση τιμή αυτού του float. Η ακριβής αποθηκευμένη τιμή είναι %s που είναι περίπου %s" #: thonny/plugins/pip_gui.py:557 msgid "Search results" msgstr "Αναζήτησε αποτελέσματα" #: thonny/plugins/pip_gui.py:558 msgid "Searching" msgstr "Αναζήτηση" #: thonny/plugins/pip_gui.py:639 thonny/plugins/pip_gui.py:729 msgid "Installing '%s'" msgstr "Εγκατάσταση ‘%s’" #: thonny/plugins/pip_gui.py:645 msgid "Upgrading '%s'" msgstr "Αναβάθμιση ‘%s’" #: thonny/plugins/pip_gui.py:650 msgid "Uninstalling '%s'" msgstr "Απεγκατάσταση ‘%s’" #: thonny/plugins/pip_gui.py:663 msgid "Installing" msgstr "Εγκατάσταση" #: thonny/plugins/pip_gui.py:1372 msgid "Package manager is not available for this interpreter" msgstr "Ο διαχειριστής πακέτων δεν είναι διαθέσιμος για αυτόν τον διερμηνέα" #: thonny/plugins/pip_gui.py:1385 msgid "Not supported" msgstr "Δεν υποστηρίζεται" #: thonny/plugins/micropython/pip_gui.py:290 thonny/plugins/pip_gui.py:1390 msgid "Not available" msgstr "Δεν διατίθεται" #: thonny/plugins/pip_gui.py:1391 msgid "You need to stop your program before launching the package manager." msgstr "Πρέπει να σταματήσει το πρόγραμμά σου πριν την έναρξη του διαχειριστή πακέτων" #: thonny/plugins/shell_config_page.py:64 msgid "Open evaluated values in Object inspector" msgstr "Άνοιξε τις εκτιμημένες τιμές στον επιθεωρητή Αντικειμένου" #: thonny/plugins/cpython/__init__.py:370 msgid "Python executable" msgstr "Εκτελέσιμο της python" #: thonny/plugins/cpython/__init__.py:393 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "Σημείωση! Το κουμπί επιλογής αρχείου μπορεί να μην λειτουργεί σωστά όταν επιλέγονται εκτελέσιμα\n" "από εικονικό περιβάλλον. Σε αυτή την περίπτωση να επιλεγεί το σενάριο \"ενεργοποίησης\" (activate script)\n" "αντί για το διερμηνέα (η καταχώρησε το μονοπάτι απευθείας στο πεδίο)! " #: thonny/plugins/cpython_ssh/__init__.py:153 msgid "Remote Python 3 (SSH)" msgstr "Απομακρυσμένη Python 2 (SSH)" #: thonny/plugins/micropython/__init__.py:284 msgid "Not connected" msgstr "Δεν υπάρχει σύνδεση" #: thonny/plugins/micropython/__init__.py:453 msgid "Advanced options" msgstr "Προχωρημένες επιλογές" #: thonny/plugins/micropython/__init__.py:460 msgid "Install or update firmware" msgstr "Εγκατάσταση ή ενημέρωση υλικολογισμικού" #: thonny/plugins/micropython/__init__.py:963 msgid "MicroPython (local)" msgstr "MicroPython (τοπική)" #: thonny/plugins/micropython/__init__.py:973 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #. Module μεταφράζεται επίσημα δομοστοιχείο αλλά φοβάμαι κανένας δεν καταλαβαίνει τι σημαίνει αυτή η λέξη. Νομίζω ενότητα είναι πιο κατανοητό σαν λέξη #: thonny/plugins/micropython/pip_gui.py:134 msgid "Module" msgstr "Ενότητα" #: thonny/plugins/micropython/pip_gui.py:159 msgid "Shadowed items (not importable):" msgstr "Σκιασμένα στοιχεία (με εισακτέα):" #: thonny/plugins/micropython/pip_gui.py:208 msgid "Package is not available at micropython.org. Version at PyPI will be installed." msgstr "Το πακέτο δεν είναι διαθέσιμο στο micropython.org. Θα εγκατασταθεί η έκδοση στο PyPI." #: thonny/plugins/micropython/pip_gui.py:219 msgid "NB! micropython.org has published version %s of this package and this will be installed by default." msgstr "Σημείωση! Το micropython.org έχει δημοσιεύσει την έκδοση %s αυτού του πακέτου και αυτό θα εγκατασταθεί από προεπιλογή." #: thonny/plugins/micropython/pip_gui.py:245 msgid "For upgrading simply install the package again." msgstr "Για αναβάθμιση απλώς να εγκατασταθεί ξανά το πακέτο" #: thonny/plugins/micropython/pip_gui.py:248 msgid "For uninstalling delete corresponding files." msgstr "Για απεγκατάσταση να διαγραφούν τα αντίστοιχα αρχεία" #: thonny/plugins/micropython/pip_gui.py:262 msgid "Scope" msgstr "Πεδίο εφαρμογής" #: thonny/plugins/micropython/pip_gui.py:275 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "Αυτός ο διάλογος αναγράφει τις κορυφαίες ενότητες από τα ακόλουθα ευρετήρια:\n" "\n" "" #: thonny/plugins/micropython/pip_gui.py:284 msgid "New packages will be installed to" msgstr "Τα Νέα πακέτα θα εγκατασταθούν στο/στη" #: thonny/plugins/micropython/pip_gui.py:292 msgid "no absolute lib directory in sys.path" msgstr "δεν υπάρχει απόλυτη βιβλιοθήκη ευρετηρίου στο sys.path" #: thonny/plugins/micropython/uf2dialog.py:40 msgid "Version to be installed" msgstr "Έκδοση προς εγκατάσταση" #: thonny/plugins/micropython/uf2dialog.py:48 msgid "Target device location" msgstr "Στόχευσε την τοποθεσία της συσκευής" #: thonny/plugins/micropython/uf2dialog.py:59 msgid "Target device model" msgstr "Στόχευσε το μοντέλο της συσκευής" #: thonny/plugins/micropython/uf2dialog.py:145 msgid "Please wait" msgstr "Παρακαλώ περιμένετε" #: thonny/plugins/pip_gui.py:67 msgid "Search on PyPI" msgstr "Αναζήτηση στο PyPI" #: thonny/plugins/pip_gui.py:79 msgid "Delete selected" msgstr "Επιλέχθηκε Διαγραφή" #: thonny/base_file_browser.py:662 msgid "Open in Thonny's text editor" msgstr "Άνοιγμα στο επεξεργαστή κειμένου του Thonny" #: thonny/base_file_browser.py:325 msgid "Storage space on this drive or filesystem" msgstr "Μέσα αποθήκευσης στον οδηγό ή στο σύστημα αρχείων" #: thonny/base_file_browser.py:326 msgid "total space" msgstr "συνολικός χώρος" #: thonny/base_file_browser.py:328 msgid "used space" msgstr "χρησιμοποιούμενος χώρος" #: thonny/base_file_browser.py:329 msgid "free space" msgstr "ελεύθερος χώρος" #: thonny/base_file_browser.py:336 msgid "Storage info" msgstr "Πληροφορίες μέσων αποθήκευσης" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "Αντικατάσταση στηλοθετών(tabs) με κενά" #: thonny/plugins/editor_config_page.py:28 msgid "Highlight tab characters" msgstr "Επισήμανση στηλοθετών (tabs)" #: thonny/plugins/editor_config_page.py:47 msgid "Indent with tab characters (not recommended for Python)" msgstr "Εσοχές με στηλοθέτες (tabs) (δεν συνίσταται για την Python)" #: thonny/base_file_browser.py:81 thonny/memory.py:63 msgid "Name" msgstr "Όνομα" #: thonny/base_file_browser.py:85 msgid "Size (bytes)" msgstr "Μέγεθος (bytes)" #: thonny/base_file_browser.py:835 msgid "Enter name for new directory under\n" "%s" msgstr "Εισαγωγή ονόματος για νέο ευρετήριο υπό το \n" "%s" #: thonny/base_file_browser.py:858 msgid "Nothing selected" msgstr "Καμία επιλογή" #: thonny/base_file_browser.py:858 msgid "Select an item and try again!" msgstr "Επέλεξε ένα αντικείμενο και προσπάθησε ξανά!" #: thonny/base_file_browser.py:1105 msgid "Open from %s" msgstr "Άνοιγμα από %s" #: thonny/base_file_browser.py:1108 msgid "Save to %s" msgstr "Αποθήκευση στο %s" #: thonny/base_file_browser.py:1120 msgid "File name:" msgstr "Όνομα αρχείου:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:510 #: thonny/plugins/object_inspector.py:589 msgid "Value ID" msgstr "Ταυτότητα τιμής" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:511 #: thonny/plugins/object_inspector.py:590 msgid "Value" msgstr "Τιμή" #: thonny/plugins/backend_config_page.py:257 msgid "Save password" msgstr "Αποθήκευση κωδικού" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Κλήση συνάρτησης στο %s" #: thonny/plugins/debugger.py:1001 msgid "Local variables" msgstr "Τοπικές μεταβλητές" #: thonny/plugins/debugger.py:1033 msgid "Function" msgstr "Συνάρτηση" #: thonny/plugins/debugger.py:1034 msgid "Location" msgstr "Τοποθεσία" #: thonny/plugins/debugger.py:1110 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Αν η τελευταία εντολή δημιούργησε εξαίρεση, τότε αυτή η προβολή θα δείξει πληροφορίες στοίβας (stacktrace)" #: thonny/plugins/heap.py:22 msgid "ID" msgstr "Ταυτότητα" #: thonny/plugins/object_inspector.py:87 msgid "Data" msgstr "Δεδομένα" #: thonny/plugins/object_inspector.py:88 msgid "Attributes" msgstr "Χαρακτηριστικά" #: thonny/plugins/object_inspector.py:509 msgid "Index" msgstr "Ευρετήριο" #: thonny/plugins/object_inspector.py:587 msgid "Key ID" msgstr "Ταυτότητα κλειδιού" #: thonny/plugins/object_inspector.py:588 msgid "Key" msgstr "Κλειδί" #: thonny/plugins/variables.py:36 msgid "Back to\n" "%s" msgstr "Επιστροφή στο \n" "%s" #: thonny/plugins/micropython/__init__.py:401 msgid "Port or WebREPL" msgstr "Θύρα η WebREPL" #: thonny/plugins/micropython/__init__.py:518 msgid "Password" msgstr "Κωδικός" #: thonny/plugins/debugger.py:959 msgid "Source code" msgstr "Πηγαίος κώδικας" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Χρήση διαλόγων αρχείου Tk αντί για Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Επέλεξε αν ο διάλογος αρχείου καταλήγει πίσω από το κυρίως παράθυρο" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Παράμετροι περιβάλλοντος (ένα KEY=VALUE ανά γραμμή) " ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/thonny/locale/en_US/0000775000175000017500000000000014307363733016447 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6901064 thonny-4.0.1/thonny/locale/en_US/LC_MESSAGES/0000775000175000017500000000000014307363733020234 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/en_US/LC_MESSAGES/thonny.mo0000664000175000017500000000072714276461532022117 0ustar00annamaaannamaa,<<z=~XMade in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: POEditor.com Project-Id-Version: Thonny Language: en-us Made at the University of Tartu, Estonia, with help from the open-source community, Raspberry Pi Foundation and Cybernetica AS././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/en_US/LC_MESSAGES/thonny.po0000664000175000017500000007231714276461532022126 0ustar00annamaaannamaamsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: en-us\n" #: thonny/workbench.py:355 msgid "File" msgstr "" #: thonny/workbench.py:356 msgid "Edit" msgstr "" #: thonny/workbench.py:357 msgid "View" msgstr "" #: thonny/running.py:95 thonny/workbench.py:358 msgid "Run" msgstr "" #: thonny/workbench.py:360 msgid "Tools" msgstr "" #: thonny/plugins/help/__init__.py:68 thonny/workbench.py:361 msgid "Help" msgstr "" #: thonny/workbench.py:522 msgid "Alternative Python 3 interpreter or virtual environment" msgstr "" #: thonny/workbench.py:530 msgid "A special virtual environment (deprecated)" msgstr "" #: thonny/workbench.py:568 msgid "Exit" msgstr "" #: thonny/workbench.py:595 msgid "Decrease font size" msgstr "" #: thonny/workbench.py:607 msgid "Focus editor" msgstr "" #: thonny/workbench.py:616 msgid "Focus shell" msgstr "" #: thonny/workbench.py:627 msgid "Maximize view" msgstr "" #: thonny/workbench.py:639 msgid "Full screen" msgstr "" #: thonny/workbench.py:1250 msgid "Program arguments" msgstr "" #: thonny/plugins/about.py:25 thonny/plugins/about.py:157 msgid "About Thonny" msgstr "" #: thonny/plugins/about.py:77 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Made at the\n" "University of Tartu, Estonia,\n" "with help from the\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" #: thonny/plugins/about.py:103 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "" #: thonny/plugins/about.py:146 msgid "Version history" msgstr "" #: thonny/plugins/about.py:153 msgid "Report problems" msgstr "" #: thonny/plugins/assistant_config_page.py:15 msgid "Open Assistant automatically when program crashes with an exception" msgstr "" #: thonny/plugins/assistant_config_page.py:21 msgid "Open Assistant automatically when it has warnings for your code" msgstr "" #: thonny/plugins/assistant_config_page.py:26 msgid "Perform selected Pylint checks" msgstr "" #: thonny/plugins/assistant_config_page.py:29 msgid "Perform MyPy checks" msgstr "" #: thonny/plugins/assistant_config_page.py:31 msgid "Disabled checks (one id per line)" msgstr "" #: thonny/assistance.py:962 thonny/plugins/assistant_config_page.py:68 msgid "Assistant" msgstr "" #: thonny/plugins/autocomplete.py:316 msgid "Auto-complete" msgstr "" #: thonny/plugins/backend_config_page.py:43 msgid "Which interpreter or device should Thonny use for running your code?" msgstr "" #: thonny/plugins/backend_config_page.py:127 msgid "Interpreter" msgstr "" #: thonny/plugins/birdseye_frontend.py:32 msgid "About Birdseye" msgstr "" #: thonny/plugins/birdseye_frontend.py:33 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "" #: thonny/plugins/birdseye_frontend.py:60 msgid "Debug current script (birdseye)" msgstr "" #: thonny/plugins/commenting_indenting.py:143 msgid "Toggle comment" msgstr "" #: thonny/plugins/commenting_indenting.py:153 msgid "Comment out" msgstr "" #: thonny/plugins/commenting_indenting.py:163 msgid "Uncomment" msgstr "" #: thonny/plugins/common_editing_commands.py:20 msgid "Undo" msgstr "" #: thonny/plugins/common_editing_commands.py:32 msgid "Redo" msgstr "" #: thonny/plugins/common_editing_commands.py:48 thonny/ui_utils.py:2176 msgid "Cut" msgstr "" #: thonny/plugins/common_editing_commands.py:60 thonny/ui_utils.py:2177 msgid "Copy" msgstr "" #: thonny/plugins/common_editing_commands.py:72 thonny/ui_utils.py:2178 msgid "Paste" msgstr "" #: thonny/plugins/common_editing_commands.py:84 thonny/plugins/debugger.py:124 msgid "Select all" msgstr "" #: thonny/plugins/debugger.py:117 thonny/plugins/debugger.py:1276 msgid "Run to cursor" msgstr "" #: thonny/plugins/debugger.py:863 msgid "Can't close yet" msgstr "" #: thonny/plugins/debugger.py:864 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "" #: thonny/plugins/dock_user_windows_frontend.py:27 msgid "Dock user windows" msgstr "" #: thonny/plugins/editor_config_page.py:14 msgid "Highlight matching names" msgstr "" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight local variables" msgstr "" #: thonny/plugins/editor_config_page.py:25 msgid "Highlight parentheses" msgstr "" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight syntax elements" msgstr "" #: thonny/plugins/editor_config_page.py:29 msgid "Highlight current line (requires reopening the editor)" msgstr "" #: thonny/plugins/editor_config_page.py:34 msgid "Allow code completion with Tab-key in editors" msgstr "" #: thonny/plugins/editor_config_page.py:40 msgid "Allow code completion with Tab-key in Shell" msgstr "" #: thonny/plugins/editor_config_page.py:44 msgid "Show line numbers" msgstr "" #: thonny/plugins/editor_config_page.py:47 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "" #: thonny/plugins/editor_config_page.py:68 msgid "Editor" msgstr "" #: thonny/plugins/event_logging.py:197 msgid "Export usage logs..." msgstr "" #: thonny/plugins/event_view.py:38 msgid "Events" msgstr "" #: thonny/plugins/files.py:307 msgid "Files" msgstr "" #: thonny/plugins/find_replace.py:56 thonny/plugins/find_replace.py:412 msgid "Find & Replace" msgstr "" #: thonny/plugins/find_replace.py:62 msgid "Find:" msgstr "" #: thonny/plugins/find_replace.py:73 msgid "Replace with:" msgstr "" #: thonny/plugins/find_replace.py:91 msgid "Case sensitive" msgstr "" #: thonny/plugins/find_replace.py:98 msgid "Up" msgstr "" #: thonny/plugins/find_replace.py:102 msgid "Down" msgstr "" #: thonny/plugins/find_replace.py:111 msgid "Find" msgstr "" #: thonny/plugins/find_replace.py:121 msgid "Replace" msgstr "" #: thonny/plugins/find_replace.py:129 msgid "Replace+Find" msgstr "" #: thonny/plugins/find_replace.py:138 msgid "Replace all" msgstr "" #: thonny/plugins/find_replace.py:232 msgid "Enter string to be replaced." msgstr "" #: thonny/plugins/find_replace.py:316 msgid "The specified text was not found!" msgstr "" #: thonny/plugins/general_config_page.py:13 msgid "Allow only single Thonny instance" msgstr "" #: thonny/plugins/general_config_page.py:20 msgid "Reopen all files from previous session" msgstr "" #: thonny/plugins/general_config_page.py:26 msgid "Disable notification sound" msgstr "" #: thonny/plugins/general_config_page.py:75 msgid "Font scaling mode" msgstr "" #: thonny/plugins/heap.py:35 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "" #: thonny/plugins/heap.py:83 msgid "Heap" msgstr "" #: thonny/plugins/general_config_page.py:42 msgid "Language" msgstr "" #: thonny/plugins/notes.py:33 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "" #: thonny/plugins/notes.py:61 msgid "Notes" msgstr "" #: thonny/plugins/object_inspector.py:108 msgid "Previous object" msgstr "" #: thonny/plugins/object_inspector.py:111 msgid "Next object" msgstr "" #: thonny/plugins/object_inspector.py:601 msgid "Object inspector" msgstr "" #: thonny/plugins/outline.py:137 msgid "Outline" msgstr "" #: thonny/plugins/pgzero_frontend.py:26 msgid "Pygame Zero mode" msgstr "" #: thonny/plugins/pip_gui.py:78 msgid "Find package from PyPI" msgstr "" #: thonny/plugins/pip_gui.py:188 thonny/plugins/pip_gui.py:190 msgid "Uninstall" msgstr "" #: thonny/code.py:548 thonny/plugins/microbit/__init__.py:200 #: thonny/plugins/pip_gui.py:204 thonny/running.py:1457 thonny/ui_utils.py:367 #: thonny/ui_utils.py:1643 msgid "Close" msgstr "" #: thonny/plugins/pip_gui.py:382 msgid "Click " msgstr "" #: thonny/plugins/pip_gui.py:383 thonny/plugins/pip_gui.py:393 msgid "here" msgstr "" #: thonny/plugins/pip_gui.py:181 thonny/plugins/pip_gui.py:478 msgid "Upgrade" msgstr "" #: thonny/plugins/microbit/__init__.py:123 thonny/plugins/pip_gui.py:483 #: thonny/plugins/pip_gui.py:1064 msgid "Install" msgstr "" #: thonny/plugins/pip_gui.py:505 msgid "Could not find the package from PyPI." msgstr "" #: thonny/plugins/pip_gui.py:515 msgid "exact package name" msgstr "" #: thonny/plugins/pip_gui.py:533 msgid "Latest stable version" msgstr "" #: thonny/plugins/pip_gui.py:535 msgid "Latest version" msgstr "" #: thonny/plugins/pip_gui.py:536 msgid "Summary" msgstr "" #: thonny/plugins/pip_gui.py:537 msgid "Author" msgstr "" #: thonny/plugins/pip_gui.py:538 msgid "Homepage" msgstr "" #: thonny/plugins/pip_gui.py:540 msgid "Bugtracker" msgstr "" #: thonny/plugins/pip_gui.py:542 msgid "Documentation" msgstr "" #: thonny/plugins/pip_gui.py:544 msgid "PyPI page" msgstr "" #: thonny/plugins/pip_gui.py:548 msgid "Requires" msgstr "" #: thonny/plugins/pip_gui.py:614 msgid "Really uninstall?" msgstr "" #: thonny/plugins/pip_gui.py:619 msgid "Are you sure you want to uninstall it?" msgstr "" #: thonny/plugins/variables.py:19 msgid "Back to\n" "current frame" msgstr "" #: thonny/plugins/variables.py:131 msgid "Variables" msgstr "" #: thonny/base_file_browser.py:30 msgid "This computer" msgstr "" #: thonny/base_file_browser.py:568 msgid "Refresh" msgstr "" #: thonny/base_file_browser.py:572 msgid "Focus into" msgstr "" #: thonny/base_file_browser.py:1001 msgid "Error" msgstr "" #: thonny/base_file_browser.py:1001 msgid "You need to select a file!" msgstr "" #: thonny/base_file_browser.py:1005 msgid "Overwrite?" msgstr "" #: thonny/base_file_browser.py:1005 msgid "Do you want to overwrite '%s' ?" msgstr "" #: thonny/code.py:513 thonny/code.py:515 msgid "New" msgstr "" #: thonny/code.py:526 msgid "Open..." msgstr "" #: thonny/code.py:528 msgid "Load" msgstr "" #: thonny/code.py:537 msgid "Recent files" msgstr "" #: thonny/code.py:559 thonny/ui_utils.py:369 msgid "Close all" msgstr "" #: thonny/code.py:569 thonny/code.py:571 msgid "Save" msgstr "" #: thonny/code.py:583 msgid "Save as..." msgstr "" #: thonny/code.py:594 msgid "Save copy..." msgstr "" #: thonny/code.py:603 msgid "Rename..." msgstr "" #: thonny/config_ui.py:17 msgid "Thonny options" msgstr "" #: thonny/running.py:94 msgid "Run current script" msgstr "" #: thonny/running.py:125 msgid "Run current script in terminal" msgstr "" #: thonny/running.py:138 msgid "Stop/Restart backend" msgstr "" #: thonny/running.py:139 msgid "Stop" msgstr "" #: thonny/running.py:150 msgid "Interrupt execution" msgstr "" #: thonny/running.py:161 msgid "Send EOF / Soft reboot" msgstr "" #: thonny/running.py:172 msgid "Disconnect" msgstr "" #: thonny/running_config_page.py:23 msgid "Known interpreters" msgstr "" #: thonny/running_config_page.py:36 msgid "Your interpreter isn't in the list?" msgstr "" #: thonny/running_config_page.py:43 msgid "Locate another" msgstr "" #: thonny/running_config_page.py:45 msgid "python executable" msgstr "" #: thonny/running_config_page.py:47 msgid "NB! Thonny only supports Python 3.5 and later" msgstr "" #: thonny/running_config_page.py:56 msgid "Create new virtual environment" msgstr "" #: thonny/running_config_page.py:59 msgid "Select existing or create a new empty directory" msgstr "" #: thonny/running_config_page.py:74 msgid "Python interpreters" msgstr "" #: thonny/plugins/pip_gui.py:657 thonny/plugins/pip_gui.py:669 #: thonny/running_config_page.py:75 msgid "all files" msgstr "" #: thonny/running_config_page.py:89 msgid "Select empty directory for new virtual environment" msgstr "" #: thonny/running_config_page.py:96 msgid "Bad directory" msgstr "" #: thonny/running_config_page.py:97 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "" #: thonny/running_config_page.py:112 msgid "Creating virtual environment" msgstr "" #: thonny/shell.py:72 msgid "Clear shell" msgstr "" #: thonny/shell.py:126 msgid "Plotter" msgstr "" #: thonny/shell.py:245 msgid "Clear" msgstr "" #: thonny/shell.py:258 msgid "Show Plotter" msgstr "" #: thonny/shell.py:1389 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "" #: thonny/shell.py:1400 msgid "Wrap text (may be slow)" msgstr "" #: thonny/shell.py:1425 thonny/ui_utils.py:1639 msgid "Copy to clipboard" msgstr "" #: thonny/shell.py:1431 msgid "Expand in Shell" msgstr "" #: thonny/shell.py:1442 msgid "Squeezed text (%d characters)" msgstr "" #: thonny/shell.py:1611 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "" #: thonny/shell.py:1613 msgid "See Help for details." msgstr "" #: thonny/ui_utils.py:368 msgid "Close others" msgstr "" #: thonny/ui_utils.py:1499 msgid "Copying" msgstr "" #: thonny/ui_utils.py:1502 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "" #: thonny/config_ui.py:31 thonny/plugins/microbit/__init__.py:127 #: thonny/plugins/pip_gui.py:1066 thonny/running.py:1424 #: thonny/ui_utils.py:1510 thonny/ui_utils.py:1712 msgid "Cancel" msgstr "" #: thonny/config_ui.py:30 thonny/ui_utils.py:1764 msgid "OK" msgstr "" #: thonny/ui_utils.py:1783 msgid "Cancel the process?" msgstr "" #: thonny/ui_utils.py:1784 msgid "The process is still running.\n" "Are you sure you want to cancel?" msgstr "" #: thonny/ui_utils.py:2182 msgid "Select All" msgstr "" #: thonny/plugins/shell_config_page.py:61 thonny/workbench.py:162 msgid "Shell" msgstr "" #: thonny/workbench.py:512 msgid "The same interpreter which runs Thonny (default)" msgstr "" #: thonny/workbench.py:531 msgid "This virtual environment is automatically maintained by Thonny.\n" "" msgstr "" #: thonny/workbench.py:532 msgid "Location: " msgstr "" #: thonny/workbench.py:578 msgid "Options..." msgstr "" #: thonny/workbench.py:585 msgid "Increase font size" msgstr "" #: thonny/workbench.py:650 msgid "Change font size" msgstr "" #: thonny/workbench.py:651 msgid "Zoom" msgstr "" #: thonny/workbench.py:660 msgid "Exit Thonny" msgstr "" #: thonny/workbench.py:663 msgid "Quit" msgstr "" #: thonny/workbench.py:1054 thonny/workbench.py:1062 msgid "Overwriting theme '%s'" msgstr "" #: thonny/workbench.py:1221 msgid "Program arguments:" msgstr "" #: thonny/workbench.py:1275 msgid "Regular mode" msgstr "" #: thonny/workbench.py:1276 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "" #: thonny/plugins/ast_view.py:209 msgid "Program tree" msgstr "" #: thonny/plugins/backend_config_page.py:130 msgid "Select interpreter" msgstr "" #: thonny/plugins/debugger.py:1162 msgid "Resume" msgstr "" #: thonny/plugins/debugger.py:1174 msgid "Run / resume" msgstr "" #: thonny/plugins/debugger.py:1189 msgid "Debug current script" msgstr "" #: thonny/plugins/debugger.py:1191 msgid "Debug" msgstr "" #: thonny/plugins/debugger.py:1202 msgid "Debug current script (nicer)" msgstr "" #: thonny/plugins/debugger.py:1214 msgid "Debug current script (faster)" msgstr "" #: thonny/plugins/debugger.py:1225 msgid "Step over" msgstr "" #: thonny/plugins/debugger.py:1227 msgid "Over" msgstr "" #: thonny/plugins/debugger.py:1238 msgid "Step into" msgstr "" #: thonny/plugins/debugger.py:1240 msgid "Into" msgstr "" #: thonny/plugins/debugger.py:1251 msgid "Step out" msgstr "" #: thonny/plugins/debugger.py:1253 msgid "Out" msgstr "" #: thonny/plugins/debugger.py:1288 msgid "Step back" msgstr "" #: thonny/plugins/debugger.py:1290 msgid "Back" msgstr "" #: thonny/plugins/debugger.py:1296 msgid "Stack" msgstr "" #: thonny/plugins/debugger.py:1297 msgid "Exception" msgstr "" #: thonny/plugins/general_config_page.py:16 msgid "Log program usage events" msgstr "" #: thonny/plugins/general_config_page.py:32 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "" #: thonny/plugins/general_config_page.py:56 msgid "UI mode" msgstr "" #: thonny/plugins/general_config_page.py:69 msgid "UI scaling factor" msgstr "" #: thonny/plugins/general_config_page.py:88 msgid "NB! Restart Thonny after changing these options!" msgstr "" #: thonny/plugins/general_config_page.py:102 msgid "General" msgstr "" #: thonny/plugins/pip_gui.py:108 msgid "INSTALL" msgstr "" #: thonny/plugins/pip_gui.py:352 msgid "Browse the packages" msgstr "" #: thonny/plugins/pip_gui.py:355 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "" #: thonny/plugins/pip_gui.py:363 msgid "Packages' directory" msgstr "" #: thonny/plugins/pip_gui.py:368 msgid "Install from PyPI" msgstr "" #: thonny/plugins/pip_gui.py:371 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "" #: thonny/plugins/pip_gui.py:387 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "" #: thonny/plugins/pip_gui.py:392 msgid "Click" msgstr "" #: thonny/plugins/pip_gui.py:397 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "" #: thonny/plugins/pip_gui.py:403 msgid "Upgrade or uninstall" msgstr "" #: thonny/plugins/pip_gui.py:405 msgid "Start by selecting the package from the left." msgstr "" #: thonny/plugins/pip_gui.py:409 msgid "Target:" msgstr "" #: thonny/plugins/pip_gui.py:412 msgid "virtual environment" msgstr "" #: thonny/plugins/pip_gui.py:416 msgid "user site packages" msgstr "" #: thonny/plugins/pip_gui.py:421 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "" #: thonny/plugins/pip_gui.py:431 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "" #: thonny/plugins/pip_gui.py:456 msgid "Installed version:" msgstr "" #: thonny/plugins/pip_gui.py:458 msgid "Installed to:" msgstr "" #: thonny/plugins/pip_gui.py:510 msgid "Please check your spelling!" msgstr "" #: thonny/plugins/pip_gui.py:512 msgid "You need to enter" msgstr "" #: thonny/plugins/pip_gui.py:520 msgid "Could not find the package info from PyPI." msgstr "" #: thonny/plugins/pip_gui.py:522 thonny/plugins/pip_gui.py:1120 msgid "Error code:" msgstr "" #: thonny/plugins/pip_gui.py:581 msgid "Can't find package name from the list:" msgstr "" #: thonny/plugins/pip_gui.py:615 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "" #: thonny/plugins/pip_gui.py:657 msgid "Package" msgstr "" #: thonny/plugins/pip_gui.py:757 msgid "Manage packages for %s" msgstr "" #: thonny/plugins/pip_gui.py:813 msgid "Confirmation" msgstr "" #: thonny/plugins/pip_gui.py:814 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "" #: thonny/plugins/pip_gui.py:912 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "" #: thonny/plugins/pip_gui.py:920 msgid "Thonny plugin without requirements" msgstr "" #: thonny/plugins/pip_gui.py:921 msgid "Looks like you are trying to install an outdated Thonny\n" "plug-in (it doesn't specify required Thonny version).\n" "\n" "If you still want it, then please install it from the command line." msgstr "" #: thonny/plugins/pip_gui.py:935 msgid "Unsuitable requirements" msgstr "" #: thonny/plugins/pip_gui.py:936 msgid "This package requires different Thonny version:" msgstr "" #: thonny/plugins/pip_gui.py:940 msgid "If you still want it, then please install it from the command line." msgstr "" #: thonny/plugins/pip_gui.py:984 msgid "(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)" msgstr "" #: thonny/plugins/pip_gui.py:990 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "" #: thonny/plugins/pip_gui.py:1000 msgid "Thonny plug-ins" msgstr "" #: thonny/plugins/pip_gui.py:1013 msgid "Advanced install / upgrade / downgrade" msgstr "" #: thonny/plugins/pip_gui.py:1022 msgid "Desired version" msgstr "" #: thonny/plugins/pip_gui.py:1060 msgid "Upgrade dependencies" msgstr "" #: thonny/plugins/pip_gui.py:1118 msgid "Requires:" msgstr "" #: thonny/plugins/pip_gui.py:1122 msgid "Error:" msgstr "" #: thonny/plugins/pip_gui.py:1232 msgid "Manage packages..." msgstr "" #: thonny/plugins/pip_gui.py:1238 msgid "Manage plug-ins..." msgstr "" #: thonny/plugins/replayer.py:354 msgid "Open replayer..." msgstr "" #: thonny/plugins/run_debug_config_page.py:12 msgid "Change working directory to script directory on Run / Debug" msgstr "" #: thonny/plugins/run_debug_config_page.py:20 msgid "Show function calls (frames) in separate windows" msgstr "" #: thonny/plugins/run_debug_config_page.py:21 msgid "Uncheck if you want more traditional experience." msgstr "" #: thonny/plugins/run_debug_config_page.py:27 msgid "Open and close Stack view automatically" msgstr "" #: thonny/plugins/run_debug_config_page.py:28 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "" #: thonny/plugins/run_debug_config_page.py:37 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "" #: thonny/plugins/run_debug_config_page.py:38 msgid "May make debugging slower." msgstr "" #: thonny/plugins/run_debug_config_page.py:43 msgid "Preferred debugger" msgstr "" #: thonny/plugins/run_debug_config_page.py:55 msgid "(used when clicking Debug toolbar button)" msgstr "" #: thonny/plugins/run_debug_config_page.py:60 msgid "Birdseye port" msgstr "" #: thonny/plugins/run_debug_config_page.py:64 msgid "(restart Thonny after changing this)" msgstr "" #: thonny/plugins/run_debug_config_page.py:72 msgid "Run & Debug" msgstr "" #: thonny/plugins/shell_config_page.py:16 msgid "Terminal emulation" msgstr "" #: thonny/plugins/shell_config_page.py:18 msgid "supports basic ANSI-colors and styles" msgstr "" #: thonny/plugins/shell_config_page.py:30 msgid "Maximum number of lines to keep." msgstr "" #: thonny/plugins/shell_config_page.py:32 msgid "NB! Large values may cause poor performance!" msgstr "" #: thonny/plugins/shell_config_page.py:47 msgid "Maximum length of line fragments before squeezing" msgstr "" #: thonny/plugins/terminal_config_page.py:10 msgid "Running current script in terminal" msgstr "" #: thonny/plugins/terminal_config_page.py:15 msgid "Present Python REPL after program ends" msgstr "" #: thonny/plugins/terminal_config_page.py:22 msgid "Keep terminal window open after Python process ends" msgstr "" #: thonny/plugins/terminal_config_page.py:29 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "" #: thonny/plugins/terminal_config_page.py:38 msgid "Terminal" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:39 msgid "UI theme" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:52 msgid "Syntax theme" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:84 msgid "Editor font" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:107 msgid "IO font" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:132 msgid "Preview" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:144 msgid "This is a comment" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:147 msgid "The answer is" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:151 msgid "unclosed_string" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:153 msgid "blah, blah" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:176 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:215 msgid "Enter an integer" msgstr "" #: thonny/plugins/theme_and_font_config_page.py:228 msgid "Theme & Font" msgstr "" #: thonny/plugins/thonny_folders.py:18 msgid "Open Thonny program folder..." msgstr "" #: thonny/plugins/thonny_folders.py:23 msgid "Open Thonny data folder..." msgstr "" #: thonny/plugins/help/__init__.py:58 msgid "Home" msgstr "" #: thonny/plugins/help/__init__.py:69 msgid "Help contents" msgstr "" #: thonny/plugins/micropython/__init__.py:175 msgid "CircuitPython device" msgstr "" #: thonny/plugins/micropython/__init__.py:179 msgid "MicroPython device" msgstr "" #: thonny/plugins/micropython/__init__.py:191 msgid "Connect your device to the computer and select corresponding port below" msgstr "" #: thonny/plugins/micropython/__init__.py:194 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "" #: thonny/plugins/micropython/__init__.py:196 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "" #: thonny/plugins/micropython/__init__.py:220 msgid "Port" msgstr "" #: thonny/plugins/micropython/__init__.py:229 msgid "Try to detect port automatically" msgstr "" #: thonny/plugins/micropython/__init__.py:417 msgid "MicroPython (generic)" msgstr "" #: thonny/plugins/printing/__init__.py:79 msgid "Print..." msgstr "" #: thonny/plugins/system_shell/__init__.py:59 msgid "Open system shell..." msgstr "" #: thonny/plugins/backend_config_page.py:61 msgid "Details" msgstr "" #: thonny/plugins/pip_gui.py:380 msgid "Install from requirements file" msgstr "" #: thonny/plugins/pip_gui.py:391 msgid "Install from local file" msgstr "" #: thonny/plugins/pip_gui.py:970 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "" #: thonny/plugins/circuitpython/__init__.py:47 msgid "CircuitPython (generic)" msgstr "" #: thonny/plugins/commenting_indenting.py:123 msgid "Indent selected lines" msgstr "" #: thonny/plugins/commenting_indenting.py:133 msgid "Dedent selected lines" msgstr "" #: thonny/workbench.py:1264 msgid "Switch to\n" "regular\n" "mode" msgstr "" #: thonny/plugins/microbit/__init__.py:54 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "" #: thonny/plugins/microbit/__init__.py:56 msgid "Don't forget that main.py only works without embedded main script." msgstr "" #: thonny/plugins/microbit/__init__.py:102 msgid "Install latest MicroPython to BBC micro:bit" msgstr "" #: thonny/plugins/microbit/__init__.py:104 msgid "micro:bit location:" msgstr "" #: thonny/plugins/microbit/__init__.py:109 msgid "Version to be installed:" msgstr "" #: thonny/plugins/microbit/__init__.py:111 msgid "please wait" msgstr "" #: thonny/plugins/microbit/__init__.py:115 msgid "NB! All files on micro:bit will be deleted!" msgstr "" #: thonny/plugins/microbit/__init__.py:195 msgid "Installing ..." msgstr "" #: thonny/plugins/microbit/__init__.py:199 msgid "Done!" msgstr "" #: thonny/plugins/microbit/__init__.py:199 msgid "You can now close this dialog." msgstr "" #: thonny/plugins/micropython/__init__.py:298 msgid "Firmware" msgstr "" #: thonny/plugins/micropython/__init__.py:301 msgid "Open the dialog for installing or upgrading MicroPython on your device" msgstr "" #: thonny/plugins/microbit/__init__.py:67 msgid "Could not find disk '%s'." msgstr "" #: thonny/plugins/microbit/__init__.py:69 msgid "Make sure you have micro:bit plugged in!" msgstr "" #: thonny/plugins/microbit/__init__.py:71 msgid "Do you want to continue and locate the disk yourself?" msgstr "" #: thonny/misc_utils.py:120 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "" #: thonny/misc_utils.py:123 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "" #: thonny/misc_utils.py:137 msgid "Can't find suitable disk" msgstr "" #: thonny/base_file_browser.py:259 msgid "%d items" msgstr "" #: thonny/base_file_browser.py:581 msgid "Move to Recycle Bin" msgstr "" #: thonny/base_file_browser.py:583 msgid "Move to Trash" msgstr "" #: thonny/base_file_browser.py:586 msgid "Delete" msgstr "" #: thonny/base_file_browser.py:589 msgid "New directory" msgstr "" #: thonny/base_file_browser.py:592 msgid "Properties" msgstr "" #: thonny/base_file_browser.py:593 msgid "Storage space" msgstr "" #: thonny/base_file_browser.py:603 msgid "Path" msgstr "" #: thonny/base_file_browser.py:605 msgid "Directory properties" msgstr "" #: thonny/base_file_browser.py:607 msgid "File properties" msgstr "" #: thonny/base_file_browser.py:609 msgid "bytes" msgstr "" #: thonny/base_file_browser.py:612 msgid "Size" msgstr "" #: thonny/base_file_browser.py:623 msgid "Modified" msgstr "" #: thonny/base_file_browser.py:679 msgid "Deleting %s" msgstr "" #: thonny/base_file_browser.py:701 msgid "Moving %s to %s" msgstr "" #: thonny/code.py:203 msgid "Loading" msgstr "" #: thonny/code.py:297 msgid "Saving" msgstr "" #: thonny/running.py:1408 msgid "Working..." msgstr "" #: thonny/plugins/files.py:199 msgid "Uploading %s to %s" msgstr "" #: thonny/plugins/files.py:206 msgid "Upload to %s" msgstr "" #: thonny/plugins/files.py:261 msgid "Downloading %s to %s" msgstr "" #: thonny/plugins/files.py:267 msgid "Download to %s" msgstr "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/thonny/locale/es_ES/0000775000175000017500000000000014307363733016434 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6901064 thonny-4.0.1/thonny/locale/es_ES/HELP_CONTENT/0000775000175000017500000000000014307363733020356 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/es_ES/HELP_CONTENT/debuggers.rst0000664000175000017500000001100214276461532023052 0ustar00annamaaannamaaUso de depuradores ================== Si quieres ver cómo Python ejecuta tu programa paso a paso, entonces debes ejecutarlo en el "modo de depuración" o "más rápido". También puedes ejecutarlo con `Birdseye `_ y explorar los pasos de ejecución más tarde. Modo "mejor" ------------ Este modo se recomienda para los principiantes totales. Comience seleccionando *Depura el guión actual (mejor)* en el menú *Ejecutar* o pulsando Ctrl+F5 (`en XFCE necesitas usar Shift+Ctrl+F5 `__). Verás que la primera sentencia del programa se resalta y no ocurre nada más. En este modo necesita notificar a Thonny que está listo para dejar que Python haga el siguiente paso. Para ello tienes dos opciones principales: *Ejecutar → Saltando* (o F6) realiza pasos grandes, es decir, ejecuta el código resaltado y resalta la siguiente parte del código. *Ejecutar → Entrando* (o F7) intenta dar pasos más pequeños. Si el código resaltado está hecho de partes más pequeñas (declaraciones o expresiones), entonces la primera de ellas se resalta y Thonny espera el siguiente comando. Si ha llegado a un componente del programa que no tiene subpartes (por ejemplo, un nombre de variable) entonces *Paso a* funciona como *Paso a*, es decir, ejecuta (o evalúa) el código. Si ha entrado en las profundidades de una sentencia o expresión y quiere avanzar más rápido, entonces puede usar *Ejecutar → Saliendo*, que ejecuta el código actualmente resaltado y todas las partes siguientes del programa en el mismo nivel. Hay un comando un poco similar llamado *Reanudar*, que ejecutará el comando sin salirse hasta que se complete (o hasta el siguiente punto de interrupción, ver más abajo). Si accidentalmente hiciste un gran paso y pasaste por encima de una parte interesante del código, puede **retroceder el paso** seleccionando *Ejecutar → Volver atrás*. Thonny mostrará el estado del programa tal y como estaba antes del último paso. Ahora puede continuar con pequeños pasos y hacer zoom en este trozo de código. (¿Cómo funciona? Incluso cuando usted da un gran paso, Thonny guarda todos los estados intermedios del programa, que puede reproducir después de dar el paso atrás). Si quieres llegar a una parte específica del código, entonces puedes acelerar el proceso colocando el cursor en esa línea y seleccionando *Ejecutar → Ejecutar hasta el cursor*. Esto hace que Thonny se desplace automáticamente hasta esa línea. A partir de ahí puede tomar el comando. Si tiene activados los números de línea del editor (Herramientas → Opciones → Editor), entonces puede también usar **puntos de ruptura**. Cuando hace doble clic junto a una sentencia en el margen izquierdo del editor, un punto aparece. Cuando ahora inicie el depurador, no se detendrá antes de la primera sentencia, sino que correrá hasta la declaración marcada con el punto, también conocido como punto de interrupción. Puede colocar tantos puntos de interrupción en sus programas como necesarios. Los puntos de interrupción se pueden eliminar haciendo doble clic en los puntos. Modo "rápido" ------------- Cuando tus programas crecen, puedes notar que dar grandes pasos con el depurador más bonito lleva a veces mucho tiempo. Esto se debe a que las sutilezas (por ejemplo, la posibilidad de pasar por la evaluación de expresiones y dar pasos atrás) requieren una maquinaria pesada y lenta. Con *Depura el script actual (rápidamente)* se pierden las sutilezas pero se puede recorrer el programa mucho más rápido. Puede usar los mismos comandos (excepto "Paso atrás") que con un depurador más agradable. Este es el estilo de depuración al que la mayoría de los programadores programadores profesionales están acostumbrados. Diferentes estilos para mostrar la pila de llamadas --------------------------------------------------- Por defecto, Thonny utiliza ventanas apiladas para presentar la pila de llamadas. Esto da una buena intuición sobre el concepto, pero puede llegar a ser engorroso de usar. Por ello, desde la versión 3.0 se puede elegir entre dos estilos diferentes para presentar la pila de llamadas. En "Herramientas → Opciones → Ejecutar y Depura" se puede cambiar a un estilo más tradicional con una vista separada para presentar y cambiar los marcos de llamadas. Tenga en cuenta que ambos estilos se pueden utilizar con ambos modos de depuración. Birdseye -------- El comando *Depura el script actual (birdseye)* se explica en una `página separada `_ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/es_ES/HELP_CONTENT/debugging.rst0000664000175000017500000001251014276461532023043 0ustar00annamaaannamaaTécnicas de depuración ====================== Si tu programa no funciona correctamente, no te asustes. Tienes varias posibilidades para arreglar la situación. Por ejemplo: * Dejar que otra persona lo arregle. * Cambiar *algo* en el código y volver a intentarlo. * Aborda el problema en dos fases: 1) diagnosticar el problema y 2) solucionarlo. Pedir ayuda puede ser una muy buena idea, pero no te dará esta dulce sensación de logro. De todos modos, es mejor no usar esto sin antes hacer un esfuerzo por tu cuenta. Si tus programas son pequeños, puede que te toque el premio gordo cambiando algo al azar e intentándolo de nuevo (repite muchas veces), pero perderás aunque ganes ya que no aprenderás nada. Si quieres llegar a ser bueno en la programación, entonces realmente necesitas abordar el problema de forma más sistemática. Esto significa, entre otras cosas, que tienes que identificar la razón por la que tu programa se comporta mal antes de intentar arreglarlo. El proceso de encontrar el origen del problema se llama *depuración*. Rastrear el flujo del programa / pensar con Python -------------------------------------------------- Lo más probable es que tu programa no esté del todo mal. Puede haber un error tipográfico en alguna parte o que hayas pasado por alto o malinterpretado algo. *¡NB! No te acostumbres a pensar que Python te ha malinterpretado -- es una máquina que ni siquiera intenta entenderte*. La clave de la depuración es encontrar precisamente dónde y cuándo tus suposiciones sobre el comportamiento del programa divergen del comportamiento real. Si su programa imprime una respuesta final incorrecta, esto le dice algo sobre el comportamiento del programa, pero normalmente no es suficiente para localizar el problema con precisión. También debe comprobar qué **pasos intermedios** se ajustan a sus suposiciones y cuáles no. Una técnica obvia (y muy útil) es añadir **sentencias de impresión adicionales** en el código, que te digan dónde está Python y qué ha logrado hasta ahora, por ejemplo .. code:: print("amigos antes del bucle for", amigos) NOTA. A veces es necesario introducir nuevas variables y dividir expresiones complejas en partes más pequeñas para imprimir información más detallada. Aunque la *depuración con prints* es utilizada incluso por los profesionales (pueden llamarlo *logging*), hay una alternativa, que es más cómoda en la mayoría de los casos. Se llama **recorrer el código** y es el pan de cada día de Thonny. Pasa al capítulo `Uso de depuradores `_ para saber más. Revisión de código ------------------ Otra técnica útil es la revisión del código. Es algo similar a trazar el flujo del programa, pero lo haces en tu cabeza y estás tratando de ver la imagen más grande en lugar de seguir pequeños pasos. Observa cada una de las sentencias de tu código e intenta comprender su propósito y cómo se relaciona con tu tarea. Para cada **variable**, pregúntate: * ¿El nombre de la variable revela su propósito? ¿Es mejor nombrarla en singular o en plural? * ¿Qué tipo de valores puede contener esta variable? ¿Cadenas, enteros, listas de cadenas, listas de flotantes, ...? * ¿Cuál es la función de la variable? ¿Está destinada a actualizarse repetidamente para que eventualmente contenga información útil? ¿Está pensada para utilizar la misma información en varios lugares y reducir el copiado? ¿Algo más? Para cada **bucle**, pregúntate: * ¿Cómo sabes que el bucle es necesario? * ¿Cuántas veces debe ejecutarse el cuerpo del bucle? ¿De qué depende esto? * ¿Qué código debe estar dentro del bucle y cuál fuera? * ¿Qué debe hacerse antes del bucle y qué debe hacerse después? Para cada **expresión** compleja pregúntese * ¿En qué orden deben estar los pasos de evaluación de esta expresión? ¿Está Python de acuerdo con esto? En caso de duda, utilice el depurador o introduzca variables de ayuda y divida la expresión en partes más pequeñas. * ¿Qué tipo de valor debería salir de esta expresión? ¿Cadenas? ¿Lista de cadenas? También es posible que te falten algunas partes importantes en tu programa: * ¿Su tarea requiere tratar diferentes situaciones de forma diferente? Si la respuesta es afirmativa, es probable que necesite una sentencia if. * ¿La tarea requiere hacer algo varias veces? En caso afirmativo, probablemente necesite un bucle. ¿Sigue perdiendo el hilo? ------------------------- "Encuentre el lugar donde se rompen sus suposiciones" - esto es definitivamente más fácil de decir que de hacer. En el caso de programas complejos es fácil llegar a la situación en la que ya no estás seguro de lo que asumes y de por qué empezaste con esto de la programación. En este caso es útil simplificar tu tarea tanto como sea posible y tratar de implementar el problema más simple primero. Toma un nuevo editor y empieza desde cero o copia el código existente y desecha todo lo que no sea esencial para el problema. Por ejemplo, puedes asumir que el usuario es cooperativo y que siempre introduce datos "buenos". Si la tarea requiere hacer algo repetidamente, entonces elimine la parte "repetidamente", si la tarea implica una condición compleja para hacer algo, haga la condición más simple, etc. Después de resolver el problema simplificado, estarás mucho mejor equipado para resolver también la tarea original. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/es_ES/HELP_CONTENT/errors.rst0000664000175000017500000000415414276461532022431 0ustar00annamaaannamaaComprender los errores ====================== Si tu programa da errores o resultados erróneos, no intentes arreglar nada antes de entender el problema. Puedes leer una historia más larga en `otra página `__, aquí tienes una lista de comprobación rápida para poner en marcha tus ideas. ¿Tienes miedo? -------------- No lo tengas. Los mensajes de error están pensados para ayudar. Si recibes un error no significa que seas una mala persona. Y no, no has roto el ordenador. Aunque los mensajes de error pueden parecer un bloque de galimatías al principio, con la práctica es posible extraer información útil de ellos. ¿En qué parte del código se produjo el error? --------------------------------------------- Los mensajes de error en Thonny tienen enlaces que te llevan al lugar del código que causó el error. En el caso de varios enlaces, el último suele ser el más relevante. Si el error ocurrió dentro de una función, entonces el mensaje tiene varios enlaces. Intente hacer clic en ellos uno a uno de arriba a abajo y verá cómo Python llegó al lugar del error. Este conjunto de enlaces se llama *el seguimiento de la pila*. ¿Qué significa el error? ------------------------ La última línea del bloque de error dice cuál fue el problema para Python. Cuando intentes comprender el mensaje, no olvides el contexto y trata de relacionar algunas partes del mensaje con el lugar vinculado en el código. A veces el Asistente de Thonny puede explicar el error en términos más sencillos, a veces hay que hacer una búsqueda en internet del mensaje (no olvides añadir "Python" a la búsqueda). ¿Qué había dentro de las variables en el momento del error? ----------------------------------------------------------- ¡Abre la vista de variables y mira tú mismo! Si el error ocurrió dentro de una función, entonces puedes ver las variables locales haciendo clic en el seguimiento de la pila. ¿Cómo llegó el programa a este estado? -------------------------------------- Vea `la página sobre depuración `_ o `la página sobre el uso de los depuradores de Thonny `_. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6901064 thonny-4.0.1/thonny/locale/es_ES/LC_MESSAGES/0000775000175000017500000000000014307363733020221 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/es_ES/LC_MESSAGES/thonny.mo0000664000175000017500000010304014276461532022074 0ustar00annamaaannamaa $)   /&<c!tD&  & -.;0j2  x { &  ;*f~G   - 9   G !Q!V!h!p!!<!%!*"-"<"O"l"p"u"{""""3"#2#H#O# X#d#t#|####!# #%#L$f$($)$$ $B$<%A%P%e%j% q%}%%%%%/%&.+&Z& `&l&s& z&& &&&&& & &&'' '' !' .' 9'E'W'=' 3(?(H(\( d( o(}(0(( ((6()))B)X)r)))))){)L(*mu*F**+m+C`,,,7,- --%-=-\- w-- -- --$--3-1.5.<.E.[. j.v.{. ....%.3./z/;j0000 010 #1D1_1q111111 111n 2z2,O30|3<33,~4U455 55n!5!5 5 5 5 55556?6CS666'6)6 "7/7>7[7x7777767T8 i8t8x88 888H858.9B9K9 Q9^9c9w99 99:9:::&):P:X:h:q:y:: : : ::: :(:;-;2; D;BQ;;; ;;; ;&;; << +< 9<F<)V<+<< <+<<< < =="= A="O=r=w= = = = = == ==== => > (>3>2Q>8>:>>? ?0"?S?e?w?? ? ???-?? @ @@ !@+@0@ E@ R@)`@@@@@$@ @@ AA&A/A BAnPA!A AA B:B 8CFCbC@ND^DD/E0EEE" F,FG MG2ZG%G!GGG GGGHHL#HBpHHCI[ICvII I II II1I%J BJ%NJVtJIJ K!K 1KM>NMNNN NNNNaOuOOO7O*OP (P3PJPQdPPPP]PPQ`QfQlQ sQ QQQQnRR R^R SS+S4SKSDeS-S1S T"T5TOTVT\TdT"|T&TT=T!$U&FUmUvU UUU UUU'U, V :V$FV_kVV0V0WKWjWGyWWWWWW WX0XPX!hX;XX1XYY/Y6Y >YIYOY_Y|YYYYYYY YZ Z &Z 3Z@ZOZjZB[_[q[z[[[[[H[\\5\=Q\\%\\#\!]3]:]L]O] X]f]j^pq^Z^=_x_9c``"`C`a'a0aDa)aa!a aa aa aa: bHbFObb bbbbbbb bc c($c%Mc0sccd?eXeueee;e&e*fAfSfkff ffffffXgjg3jh9hKh$i1i[iQjXjgj xjxj(j(k 9k Gk Tkakgkyk|kJkQk.l!Ml(ol2l ll%l+ m29mlmmmm@mcn lnxn~nnnnnHnFoMo dopovooo0o"oo p=pSpZpkpFp pp pp&p q9q MqYqiqzqq7qqqq r[rzr r rr rr8r s s'sDsTsis4s6ss s4t5t>tGtZtnt%tt*tttu&u6uKu _u luvuuuuuuuu.u>*vZivFv w'w/wB?www*wwwwx 'x14x fx px~xxxxxxx>x4yAbout BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...HeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLine numberLoadLoadingLoading %sLocal variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...ProblemProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyVersion to be installedViewWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentMIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: POEditor.com Project-Id-Version: Thonny Language: es %d ítemes(Reinicia Thonny luego de cambiar esto)(utilizado al hacer clic en el botón Depurar de la barra de herramientas)Sobre BirdseyeAcerca de ThonnyInstalación / Actualización / Desactualización avanzadasOpciones avanzadasPermitir solamente una instancia de ThonnyPermitir entrar en librerías fuera del directorio principal del script.¿Está seguro de que desea desinstalarlo?AsistenteAtributosAutenticaciónAutorAutocompletarProponer automáticamente las compleciones mientras se escribeMostrar automáticamente la documentación de las complecionesMostrar automáticamente la información de parámetros luego de escribir '('AtrásVolver a %sVolver al marco actualDirectorio incorrectoBirdseye es un depurador de Python que debe instalarse por separado. ¿Desea abrir la página de ayuda y obtener más información?Puerto para BirdsyeNavegar por los paquetesRastreador de erroresAún no se puede cerrarNo se pudo encontrar el nombre del paquete en la lista:No es posible encontrar un disco apropiadoCancelarCancelandoSensible a mayúsculasCambiar tamaño de fuenteCambia directorio de trabajo a directorio del script en la Ejecución/DepuraciónCircuitPython (genérico)Dispositivo CircuitPythonLimpiarLimpiar Consola antes de iniciar un nuevo proceso (Ejecutar, Depurar, Detener/Reiniciar, ...)Limpiar consolaClickClic CerrarCerrar todosCerrar otrosComando no disponibleConvertir en comentarioLa configuración ha sido actualizada. Reinicia Thonny para empezar a trabajar de manera normal. (Ver 'Herramientas → Opciones → General' si cambias de opinión más tarde.)Configurando %s archivosConfigurar interprete...ConfirmaciónConecte su dispositivo a la computadora y seleccione el puerto correspondiente a continuaciónCopiarCopiar al portapapelesCopiandoCopiando %s a %sDefinición no encontradaNo se pudo encontrar el disco '%s'. ¿Quieres localizarlo tú mismo?No se ha podido encontrar el paquete en PyPI.No se encontró información del paquete en PyPI.No se ha podido guardarCreando directorioCreando ambiente virtual.CortarDatosDepurarDepura el script actualDepura el script actual (birdseye)Depura el script actual (rápidamente)Depura el guión actual (mejor)Modo de depuración (con diagnóstico detallado de registros)Disminuir el tamaño de la fuenteDes-indentar las líneas seleccionadasEliminarBorrandoBorrando %sVersión deseadaDetallesDispositivo ¿Quisiste decir '%s'? Propiedades del directorioDesactivar los sonidos de notificaciónDesactivar comprobaciones (un id por línea)Desconectar¿Quieres cerrar también el editor?¿Quieres descartar el contenido actual del editor y volver a cargar el archivo desde el disco?¿Quieres sobreescribir '%s'?¿Desea guardar los archivos antes de cerrarlos?¿Desea guardar los archivos antes de cerrarlos?Anclar las ventanas de usuarioDocumentaciónNo olvide que main.py solo funciona sin un script principal incrustado.AbajoDescargar a %sDescargando %s a %sEditarEditorLetra editorIngresa un número enteroIngrese el nombre para el nuevo directorio en %sIngresa un nuevo nombreIntroducir la cadena a sustituir.Ingrese la frase de contraseña de su clave privada para {}Ingrese su contraseña para {}Variables de Entorno (una CLAVE=VALOR por línea)ErrorCódigo de error:Error:EventosExcepciónSalirSalir de ThonnyExportar registros de uso...Modificación externaFicheroEl archivo ya existeEl archivo no estáNombre de archivo:Propiedades del archivoArchivosEncontrarEncontrar y reemplazar…Encontrar:Ir al editorCentrarse enIr al terminalModo de escalado de fuentePor razones de rendimiento, la consola evita mostrar líneas muy largas (ver Herramientas → Opciones → Consola). Aquí puedes interactuar con el fragmento de texto original.Se encontraron varios discos '%s'. ¿Quieres elegir uno tú mismo?Pantalla completaFunciónLlamada de función en %sGeneralIr a la líneaIr a la línea...Montículo (heap)Modo heap (montículo) activado. Seleccione "Vista heap" para cerrarlo. AyudaContenidos de la AyudaNo mostrar archivos ocultosResaltar la línea actual (requiere abrir de nuevo el editor)Resaltar las variables localesResaltar las coincidencias de nombresResaltar los paréntesisResaltar los elementos sintácticosResaltar los caracteres tabuladorInicioPágina principalIDINSTALARLetra Ent/SalSi se trata de un archivo de texto, puede configurarlo para que se abra en Thonny haciendo clic con el botón derecho y seleccionando "Configurar... archivos".Si el último comando generó una excepción, esta vista mostrará el seguimiento de la pila (stacktrace).Si el archivo debe abrirse en una aplicación externa, descárgalo en un directorio local y ábrelo desde allí.Si no puede encontrarlo, es posible que primero deba instalar el controlador USB adecuado.Si no sabes dónde está el paquete, probablemente querrás buscarlo en Python Package Index. Entonces introduce el nombre del paquete en la caja de búsqueda y pulsa ENTERSi se entrecomilla el valor de una variable de entorno, las mismas formarán parte del valor. ¿Es esto lo que querías?Si aún lo desea, instálelo desde la línea de comandos.Aumentar tamaño de fuenteIndentar las líneas seleccionadasSangría con caracteres de tabulación (no recomendado para Python)ÍndiceInstalarInstalar desde PyPIInstalar desde archivo localInstalar desde archivo "requirements.txt"Instalar o actualizar el firmwareInstalado en:Versión instalada:InstalandoInstalando '%s'IntérpreteInterrumpir ejecuciónInterrumpir el programa de en funcionamiento al conectarseDentroMantener la terminal abierta luego de que el proceso de Python termineLlaveID de LlaveIdiomaÚltima versión estableÚltima versiónNúmero de líneaCargarCargandoCargando %sVariables localesUbicaciónRegistra los eventos de uso del programaParece que '%s' fue borrado o movido.Parece que '%s' fue modificado fuera del editor.Parece que estás instalando un paquete relacionado con Thonny. Si lo que querías es instalar un plugin de Thonny, entonces deberías elegir 'Herramientas → Administrar plugins…' ¿Seguro que quieres instalar %s para el back-end?Hecho en la Universidad de Tartu, Estonia, con la ayuda de la comunidad de código abierto, la Raspberry Pi Foundation y Cybernetica ASAsegúrese de que MicroPython se haya instalado en su micro:bitAdministrar paquetes para %sGestionar paquetes...Administra plug-ings…Maximizar vistaMaxima longitud de un fragmento de texto antes de condensarNúmero máximo de líneas a mantener.Tal vez haga de la depuración más lenta.MicroPython (SSH)MicroPython (genérico)MicroPython (local)Dispositivo MicroPythonModificado¿Mover %s a la papelera?Mover / renombrar...Mover al basureroMoviendo %s a la papeleraMover a la papelera¡Aviso! El cierre automático debe estar habilitado en la configuración de la TerminalNB: El botón de selección de ficheros puede que no funcione bien cuando se seleccionen ejecutables de un entorno virtual. En este caso elegir el script 'activar' en vez del intérprete (o entrar el path –camino del fichero– directamente en la caja)¡Aviso! ¡Valores grandes degradan el rendimiento!NB! ¡Reinicia Thonny después de cambiar estas opciones!¡Aviso! ¡Algunos elementos de estilo cambiaran luego de reiniciar Thonny!¡NB! Debe haber otra versión disponible que sea compatible con la versión actual de Thonny. Click en el botón '…' para elegir la versión e instalarla.Nota: Thonny solo soporta Python %s y posteriores¡NB! Debe reiniciar Thonny después de instalar / actualizar / desinstalar un complemento.NombreNuevo programaNuevo DirectorioArchivo nuevoTambién se instalarán nuevos paquetes en este directorio. Otras ubicaciones deben gestionarse por medios alternativos.Los nuevos paquetes serán instalados enObjeto siguienteNo disponibleNo conectadoNo soportadoNotasNada seleccionadoOkInspector de objetosAbrir el asistente automáticamente cuando haya advertencias en tu códigoAbrir el asistente automáticamente cuando el programa falle y dé una excepciónAbre la carpeta Thonny data…Abre la carpeta Thonny program…Abrir y cerrar el Stack automáticamenteAbrir valores evaluados en el inspector de objetosAbrir de %sAbrir en ThonnyAbrir en el editor de texto de ThonnyAbrir en la aplicación externa por defectoAbrir en la aplicación predeterminada del sistemaAbrir en gestor de archivosAbrir moviola…Abre el shell del sistema…Abrir fichero...No es posible abrir archivos remotos en una aplicación externa.Abre la vista Pila en la primera llamada y la cierra cuando el programa regresa al marco principal.Opciones...SalirEsquemaSaltar¿Sobreescribir?Sobrescribir tema '%s PaqueteEl paquete '{}' es requerido para instalar y desinstalar otros paquetes.El administrador de paquetes no está disponible para este intérpreteDirectorio de paquetesContraseñaPegarFallo de pegadoRutaRealizar comprobaciones MyPyRealizar las comprobaciones Pylint seleccionadas¡Por favor revisa tu ortografía!Espere por favorPlóterPlóter visualiza series de números mostradas en la consola.PuertoPuerto o WebREPLDepurador preferidoContinuar con el REPL de Python luego de la finalización del programaPrevisualizarObjeto anteriorImprimir...ProblemaParámetros de ejecución del programaArgumentos del programa:Árbol del programaPropiedadesPágina de PyPIModo Pygame ZeroEjecutable de PythonArchivos PythonLos archivos de Python suelen llevar la extensión .py.Intérpretes de PythonSalir¿Desea desinstalarlo?Archivos recientesLongitud de línea máxima recomendada (establecer a 0 para desactivar el margen de línea)RehacerRefrescarModo regularPython 3 Remoto (SSH)RenombrarRenombrar '%s'Volver a abrir todos los archivos de la sesión anteriorReemplazarReemplazar todoReemplazar los tabuladores por espaciosReemplazar por:Reemplazar+EncontrarInformar de un problemaPedir que se complete con la tecla Tab en la consolaPedir que se complete con la tecla Tab en los editoresRequiereRequiere:Reiniciar el intérprete antes de ejecutar un scriptReanudarEjecutarEjecutar y DepurarEjecutar / reanudarEjecutar el script actualEjecutar el script actual en terminalEjecutar hasta el cursorEjecutando el script actual en la terminalGuardarSalvar todos los ficherosGuardar al cerrarGuardar como...Guardar una copia...Guardar contraseñaGuardar a %sGuardandoGuardando a %sAlcanceBuscar en PyPIResultados de la búsquedaBuscandoVea Ayuda para detalles.Seleccionar todoSeleccionar todoSeleccione un artículo y vuelva a intentarlo.Seleccione un directorio vacío para el nuevo entorno virtual.Seleccione si los cuadros de diálogo del archivo terminan detrás de la ventana principalEl directorio seleccionado no está vacío. Seleccione otro o cancele.Envía EOF / Reinicio suaveConsolaMuestra PlotterMuestra en ventanas separadas los entornos cada llamada a funciónMostrar archivos ocultosMostrar números de líneaMostrar información sobre los parámetrosTamañoTamaño (bytes)Código fuenteTexto reducido (%d caracteres)Pila (stack)Comience seleccionando el paquete de la izquierdaIniciandoVolver atrásEntrandoSaliendoSaltandoDetenerDetener/Reiniciar back-endInformación de almacenamientoEspacio de almacenamientoEspacio de almacenamiento en esta unidad o sistema de archivosResumenSoporteApoya a UcraniaCambiar a modo regularSincronizar el reloj de tiempo real del dispositivoColor SintaxisUbicación del dispositivo de destinoModelo de dispositivo de destinoObjetivo:TerminalEmulación de terminalLa respuesta esLa representación de arriba es un valor aproximado de este 'float'. El valor almacenado exacto es %s, que es aproximadamente %sNo se ha encontrado el texto especificadoTemas y FuentesHay carpetas con conflictosEsta casilla es para sus notas de trabajo -- instrucciones de asignación, fragmentos de código, o similares. Todo se guardará automáticamente y se cargará cuando abra Thonny la próxima vez. Sírvase borrar este texto para hacer sitio a sus propias notas.Este comando no está disponible si Thonny se ejecuta a través de FlatpakEste computadorEste cuadro de diálogo es para administrar los complementos de Thonny y sus dependencias. Si desea instalar paquetes para sus propios programas, elija 'Herramientas → Administrar paquetes ...'Este diálogo lista todos los paquetes disponibles, pero sólo actualiza y desinstala paquetes deEste cuadro de diálogo enumera los módulos de nivel superior de los siguientes directorios:Esto no se parece al paquete MicroPython/CircuitPython. ¿Está seguro de que quiere instalarlo?Este es un comentarioEste paquete requiere una versión diferente de Thonny:Este programa viene completamente sin garantía. Es software libre, por lo que puede redistribuirse bajo unas determinadas condiciones: véase https://opensource.org/licenses/MIT para más detallesOpciones de ThonnyPlug-ins de ThonnyPlugin the Thonny sin requisitosEl Python de ThonnyActivar/desactivar como comentarioHerramientasIntenta detectar el puerto automáticamenteModo Interfaz Usuario (IU)Factor de escalado de IUAspectoNo marcar si quiere una experiencia más tradicional.Desactivar como comentarioDeshacerDesinstalarDesinstalando '%s'Requisitos inadecuadosArribaActualizarActualizar dependenciasActualiza o desinstalaActualizando '%s'Subir a %sUtiliza la orden "Stop" si desea cancelar la depuraciónUse cuadros de diálogo de archivos Tk en lugar de ZenityUtilizar la hora local en el reloj de tiempo real ValorID de valorVariablesHistorial de versionesVersión a ser instaladaVisualizaciónAdvertencia¿Qué hacer con un archivo %s cuando hace doble clic en él en el explorador de archivos de Thonny?¿Qué tipo de intérprete debe utilizar Thonny para ejecutar su código? Con el intérprete actual sólo puedes visualizar los paquetes aquí. Use 'Herramientas -> Abrir consola del sistema...' para instalar, actualizar o desinstalar.Ajustar texto (puede ser lento)¡Debes seleccionar un archivo!Debe detener su programa antes de iniciar el administrador de paquetes.Zoomtodos los archivosbla, blabytesespacio libreaquíbuscar por un nombre de dispositivo, "USB Serial" o "UART"Sin directorio lib absoluto en 'sys.path'por favor esperesoporte para colores y estilos básicos ANSIpara localizar e instalar el fichero del paquete (usualmente con extensión .whl o .tar.gz o .zip)para localizar el fichero requirements.txt e instalar los paquetes allí especificadosespacio totalstring_sin_cerrarespacio ocupadopaquetes del sitio del usuarioentorno virtual././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/es_ES/LC_MESSAGES/thonny.po0000664000175000017500000015376214276461532022117 0ustar00annamaaannamaamsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: es\n" #: thonny/workbench.py:361 msgid "File" msgstr "Fichero" #: thonny/workbench.py:362 msgid "Edit" msgstr "Editar" #: thonny/workbench.py:363 msgid "View" msgstr "Visualización" #: thonny/running.py:116 thonny/workbench.py:364 msgid "Run" msgstr "Ejecutar" #: thonny/workbench.py:365 msgid "Tools" msgstr "Herramientas" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:366 msgid "Help" msgstr "Ayuda" #: thonny/workbench.py:583 msgid "Exit" msgstr "Salir" #: thonny/workbench.py:610 msgid "Decrease font size" msgstr "Disminuir el tamaño de la fuente" #: thonny/workbench.py:622 msgid "Focus editor" msgstr "Ir al editor" #: thonny/workbench.py:631 msgid "Focus shell" msgstr "Ir al terminal" #: thonny/workbench.py:642 msgid "Maximize view" msgstr "Maximizar vista" #: thonny/workbench.py:654 msgid "Full screen" msgstr "Pantalla completa" #: thonny/workbench.py:1457 msgid "Program arguments" msgstr "Parámetros de ejecución del programa" #: thonny/plugins/about.py:21 thonny/plugins/about.py:140 msgid "About Thonny" msgstr "Acerca de Thonny" #: thonny/plugins/about.py:66 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Hecho en la Universidad de Tartu, Estonia, con la ayuda de la comunidad de código abierto, la Raspberry Pi Foundation y Cybernetica AS" #: thonny/plugins/about.py:86 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Este programa viene completamente sin garantía. Es software libre, por lo que puede redistribuirse bajo unas determinadas condiciones: véase https://opensource.org/licenses/MIT para más detalles" #: thonny/plugins/about.py:129 msgid "Version history" msgstr "Historial de versiones" #: thonny/plugins/about.py:136 msgid "Report problems" msgstr "Informar de un problema" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Abrir el asistente automáticamente cuando el programa falle y dé una excepción" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Abrir el asistente automáticamente cuando haya advertencias en tu código" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Realizar las comprobaciones Pylint seleccionadas" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Realizar comprobaciones MyPy" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Desactivar comprobaciones (un id por línea)" #: thonny/assistance.py:985 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Asistente" #: thonny/plugins/autocomplete.py:512 msgid "Auto-complete" msgstr "Autocompletar" #: thonny/plugins/backend_config_page.py:337 msgid "Interpreter" msgstr "Intérprete" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Sobre Birdseye" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye es un depurador de Python que debe instalarse por separado.\n" "\n" "¿Desea abrir la página de ayuda y obtener más información?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Depura el script actual (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Activar/desactivar como comentario" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "Convertir en comentario" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "Desactivar como comentario" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Deshacer" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Rehacer" #: thonny/base_file_browser.py:721 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2294 msgid "Cut" msgstr "Cortar" #: thonny/base_file_browser.py:722 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2295 msgid "Copy" msgstr "Copiar" #: thonny/base_file_browser.py:724 thonny/base_file_browser.py:730 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2296 msgid "Paste" msgstr "Pegar" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Seleccionar todo" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1401 msgid "Run to cursor" msgstr "Ejecutar hasta el cursor" #: thonny/plugins/debugger.py:982 msgid "Can't close yet" msgstr "Aún no se puede cerrar" #: thonny/plugins/debugger.py:983 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Utiliza la orden \"Stop\" si desea cancelar la depuración" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Anclar las ventanas de usuario" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Resaltar las coincidencias de nombres" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Resaltar las variables locales" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Resaltar los paréntesis" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Resaltar los elementos sintácticos" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Resaltar la línea actual (requiere abrir de nuevo el editor)" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Mostrar números de línea" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Longitud de línea máxima recomendada (establecer a 0 para desactivar el margen de línea)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Editor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Exportar registros de uso..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Eventos" #: thonny/plugins/files.py:606 msgid "Files" msgstr "Archivos" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:430 msgid "Find & Replace" msgstr "Encontrar y reemplazar…" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Encontrar:" #: thonny/plugins/find_replace.py:87 msgid "Replace with:" msgstr "Reemplazar por:" #: thonny/plugins/find_replace.py:105 msgid "Case sensitive" msgstr "Sensible a mayúsculas" #: thonny/plugins/find_replace.py:112 msgid "Up" msgstr "Arriba" #: thonny/plugins/find_replace.py:116 msgid "Down" msgstr "Abajo" #: thonny/plugins/find_replace.py:125 msgid "Find" msgstr "Encontrar" #: thonny/plugins/find_replace.py:135 msgid "Replace" msgstr "Reemplazar" #: thonny/plugins/find_replace.py:143 msgid "Replace+Find" msgstr "Reemplazar+Encontrar" #: thonny/plugins/find_replace.py:153 msgid "Replace all" msgstr "Reemplazar todo" #: thonny/plugins/find_replace.py:249 msgid "Enter string to be replaced." msgstr "Introducir la cadena a sustituir." #: thonny/plugins/find_replace.py:333 msgid "The specified text was not found!" msgstr "No se ha encontrado el texto especificado" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Permitir solamente una instancia de Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Volver a abrir todos los archivos de la sesión anterior" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Desactivar los sonidos de notificación" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Modo de escalado de fuente" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Modo heap (montículo) activado. Seleccione \"Vista heap\" para cerrarlo.\n" "" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Montículo (heap)" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Idioma" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "Esta casilla es para sus notas de trabajo -- instrucciones de asignación, fragmentos de código, o similares.\n" "\n" "Todo se guardará automáticamente y se cargará cuando abra Thonny la próxima vez.\n" "\n" "Sírvase borrar este texto para hacer sitio a sus propias notas." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Notas" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Objeto anterior" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Objeto siguiente" #: thonny/plugins/object_inspector.py:733 msgid "Object inspector" msgstr "Inspector de objetos" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Esquema" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Modo Pygame Zero" #: thonny/plugins/pip_gui.py:79 msgid "Uninstall" msgstr "Desinstalar" #: thonny/editors.py:667 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:491 #: thonny/ui_utils.py:1871 thonny/workdlg.py:162 msgid "Close" msgstr "Cerrar" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Clic " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "aquí" #: thonny/plugins/pip_gui.py:76 msgid "Upgrade" msgstr "Actualizar" #: thonny/plugins/esp/__init__.py:349 #: thonny/plugins/micropython/uf2dialog.py:348 thonny/plugins/pip_gui.py:73 msgid "Install" msgstr "Instalar" #: thonny/plugins/pip_gui.py:535 msgid "Could not find the package from PyPI." msgstr "No se ha podido encontrar el paquete en PyPI." #: thonny/plugins/pip_gui.py:557 msgid "Latest stable version" msgstr "Última versión estable" #: thonny/plugins/pip_gui.py:559 msgid "Latest version" msgstr "Última versión" #: thonny/plugins/pip_gui.py:561 msgid "Summary" msgstr "Resumen" #: thonny/plugins/pip_gui.py:563 msgid "Author" msgstr "Autor" #: thonny/plugins/pip_gui.py:565 msgid "Homepage" msgstr "Página principal" #: thonny/plugins/pip_gui.py:567 msgid "Bugtracker" msgstr "Rastreador de errores" #: thonny/plugins/pip_gui.py:569 msgid "Documentation" msgstr "Documentación" #: thonny/plugins/pip_gui.py:571 msgid "PyPI page" msgstr "Página de PyPI" #: thonny/plugins/pip_gui.py:611 msgid "Requires" msgstr "Requiere" #: thonny/plugins/pip_gui.py:743 msgid "Really uninstall?" msgstr "¿Desea desinstalarlo?" #: thonny/plugins/pip_gui.py:748 msgid "Are you sure you want to uninstall it?" msgstr "¿Está seguro de que desea desinstalarlo?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Volver al marco actual" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Variables" #: thonny/base_file_browser.py:1558 msgid "This computer" msgstr "Este computador" #: thonny/base_file_browser.py:641 msgid "Refresh" msgstr "Refrescar" #: thonny/base_file_browser.py:650 msgid "Focus into" msgstr "Centrarse en" #: thonny/base_file_browser.py:1393 thonny/base_file_browser.py:1405 #: thonny/plugins/autocomplete.py:300 thonny/plugins/highlight_names.py:87 msgid "Error" msgstr "Error" #: thonny/base_file_browser.py:1393 thonny/base_file_browser.py:1405 msgid "You need to select a file!" msgstr "¡Debes seleccionar un archivo!" #: thonny/base_file_browser.py:1409 msgid "Overwrite?" msgstr "¿Sobreescribir?" #: thonny/base_file_browser.py:1409 msgid "Do you want to overwrite '%s' ?" msgstr "¿Quieres sobreescribir '%s'?" #: thonny/editors.py:632 thonny/editors.py:634 msgid "New" msgstr "Nuevo programa" #: thonny/editors.py:645 msgid "Open..." msgstr "Abrir fichero..." #: thonny/editors.py:647 msgid "Load" msgstr "Cargar" #: thonny/editors.py:656 msgid "Recent files" msgstr "Archivos recientes" #: thonny/editors.py:678 thonny/ui_utils.py:493 msgid "Close all" msgstr "Cerrar todos" #: thonny/editors.py:688 thonny/editors.py:690 msgid "Save" msgstr "Guardar" #: thonny/editors.py:713 msgid "Save as..." msgstr "Guardar como..." #: thonny/editors.py:724 msgid "Save copy..." msgstr "Guardar una copia..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Opciones de Thonny" #: thonny/running.py:115 msgid "Run current script" msgstr "Ejecutar el script actual" #: thonny/running.py:146 msgid "Run current script in terminal" msgstr "Ejecutar el script actual en terminal" #: thonny/running.py:159 msgid "Stop/Restart backend" msgstr "Detener/Reiniciar back-end" #: thonny/running.py:160 msgid "Stop" msgstr "Detener" #: thonny/running.py:171 msgid "Interrupt execution" msgstr "Interrumpir ejecución" #: thonny/running.py:184 msgid "Send EOF / Soft reboot" msgstr "Envía EOF / Reinicio suave" #: thonny/running.py:195 msgid "Disconnect" msgstr "Desconectar" #: thonny/plugins/cpython_frontend/cp_front.py:268 msgid "Python interpreters" msgstr "Intérpretes de Python" #: thonny/editors.py:36 thonny/plugins/cpython_frontend/cp_front.py:269 #: thonny/plugins/pip_gui.py:789 thonny/plugins/pip_gui.py:802 msgid "all files" msgstr "todos los archivos" #: thonny/plugins/cpython_frontend/cp_front.py:297 msgid "Select empty directory for new virtual environment" msgstr "Seleccione un directorio vacío para el nuevo entorno virtual." #: thonny/plugins/cpython_frontend/cp_front.py:304 msgid "Bad directory" msgstr "Directorio incorrecto" #: thonny/plugins/cpython_frontend/cp_front.py:305 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "El directorio seleccionado no está vacío.\n" "Seleccione otro o cancele." #: thonny/plugins/cpython_frontend/cp_front.py:322 msgid "Creating virtual environment" msgstr "Creando ambiente virtual." #: thonny/shell.py:100 msgid "Clear shell" msgstr "Limpiar consola" #: thonny/shell.py:174 msgid "Plotter" msgstr "Plóter" #: thonny/shell.py:306 msgid "Clear" msgstr "Limpiar" #: thonny/shell.py:319 msgid "Show Plotter" msgstr "Muestra Plotter" #: thonny/shell.py:1648 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Por razones de rendimiento, la consola evita mostrar líneas muy largas (ver Herramientas → Opciones → Consola).\n" "Aquí puedes interactuar con el fragmento de texto original." #: thonny/shell.py:1659 msgid "Wrap text (may be slow)" msgstr "Ajustar texto (puede ser lento)" #: thonny/ui_utils.py:1866 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" #: thonny/shell.py:1701 msgid "Squeezed text (%d characters)" msgstr "Texto reducido (%d caracteres)" #: thonny/shell.py:1871 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Plóter visualiza series de números mostradas en la consola." #: thonny/shell.py:1873 msgid "See Help for details." msgstr "Vea Ayuda para detalles." #: thonny/ui_utils.py:492 msgid "Close others" msgstr "Cerrar otros" #: thonny/ui_utils.py:1722 msgid "Copying" msgstr "Copiando" #: thonny/ui_utils.py:1725 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Copiando\n" " %s\n" "a\n" " %s" #: thonny/base_file_browser.py:1364 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:290 thonny/plugins/pip_gui.py:1256 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1733 thonny/ui_utils.py:1818 #: thonny/workdlg.py:164 thonny/workdlg.py:209 msgid "Cancel" msgstr "Cancelar" #: thonny/base_file_browser.py:1355 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:100 thonny/plugins/backend_config_page.py:285 #: thonny/ui_utils.py:154 thonny/ui_utils.py:1815 thonny/workdlg.py:206 msgid "OK" msgstr "Ok" #: thonny/ui_utils.py:2300 msgid "Select All" msgstr "Seleccionar todo" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:155 #: thonny/workbench.py:162 msgid "Shell" msgstr "Consola" #: thonny/workbench.py:593 msgid "Options..." msgstr "Opciones..." #: thonny/workbench.py:600 msgid "Increase font size" msgstr "Aumentar tamaño de fuente" #: thonny/workbench.py:665 msgid "Change font size" msgstr "Cambiar tamaño de fuente" #: thonny/workbench.py:666 msgid "Zoom" msgstr "Zoom" #: thonny/workbench.py:675 msgid "Exit Thonny" msgstr "Salir de Thonny" #: thonny/workbench.py:678 msgid "Quit" msgstr "Salir" #: thonny/workbench.py:1236 thonny/workbench.py:1244 msgid "Overwriting theme '%s'" msgstr "Sobrescribir tema '%s " #: thonny/workbench.py:1428 msgid "Program arguments:" msgstr "Argumentos del programa:" #: thonny/workbench.py:1482 msgid "Regular mode" msgstr "Modo regular" #: thonny/workbench.py:1483 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "La configuración ha sido actualizada. Reinicia Thonny para empezar a trabajar de manera normal.\n" "\n" "(Ver 'Herramientas → Opciones → General' si cambias de opinión más tarde.)" #: thonny/plugins/ast_view.py:212 msgid "Program tree" msgstr "Árbol del programa" #: thonny/plugins/debugger.py:1283 msgid "Resume" msgstr "Reanudar" #: thonny/plugins/debugger.py:1299 msgid "Run / resume" msgstr "Ejecutar / reanudar" #: thonny/plugins/debugger.py:1314 msgid "Debug current script" msgstr "Depura el script actual" #: thonny/plugins/debugger.py:1316 msgid "Debug" msgstr "Depurar" #: thonny/plugins/debugger.py:1327 msgid "Debug current script (nicer)" msgstr "Depura el guión actual (mejor)" #: thonny/plugins/debugger.py:1339 msgid "Debug current script (faster)" msgstr "Depura el script actual (rápidamente)" #: thonny/plugins/debugger.py:1350 msgid "Step over" msgstr "Saltando" #: thonny/plugins/debugger.py:1352 msgid "Over" msgstr "Saltar" #: thonny/plugins/debugger.py:1363 msgid "Step into" msgstr "Entrando" #: thonny/plugins/debugger.py:1365 msgid "Into" msgstr "Dentro" #: thonny/plugins/debugger.py:1376 msgid "Step out" msgstr "Saliendo" #: thonny/plugins/debugger.py:1378 msgid "Out" msgstr "Salir" #: thonny/plugins/debugger.py:1413 msgid "Step back" msgstr "Volver atrás" #: thonny/plugins/debugger.py:1415 msgid "Back" msgstr "Atrás" #: thonny/plugins/debugger.py:1421 msgid "Stack" msgstr "Pila (stack)" #: thonny/plugins/debugger.py:1422 msgid "Exception" msgstr "Excepción" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Registra los eventos de uso del programa" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Modo de depuración (con diagnóstico detallado de registros)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Modo Interfaz Usuario (IU)" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Factor de escalado de IU" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "NB! ¡Reinicia Thonny después de cambiar estas opciones!" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "General" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INSTALAR" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Navegar por los paquetes" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Con el intérprete actual sólo puedes visualizar los paquetes aquí.\n" "Use 'Herramientas -> Abrir consola del sistema...' para instalar, actualizar o desinstalar." #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Directorio de paquetes" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Instalar desde PyPI" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Si no sabes dónde está el paquete, probablemente querrás buscarlo en Python Package Index. Entonces introduce el nombre del paquete en la caja de búsqueda y pulsa ENTER" #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "para localizar el fichero requirements.txt e instalar los paquetes allí especificados" #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Click" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "para localizar e instalar el fichero del paquete (usualmente con extensión .whl o .tar.gz o .zip)" #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Actualiza o desinstala" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Comience seleccionando el paquete de la izquierda" #: thonny/plugins/pip_gui.py:410 msgid "Target:" msgstr "Objetivo:" #: thonny/plugins/pip_gui.py:414 msgid "virtual environment" msgstr "entorno virtual" #: thonny/plugins/pip_gui.py:412 msgid "user site packages" msgstr "paquetes del sitio del usuario" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Este diálogo lista todos los paquetes disponibles, pero sólo actualiza y desinstala paquetes de" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "También se instalarán nuevos paquetes en este directorio. Otras ubicaciones deben gestionarse por medios alternativos." #: thonny/plugins/pip_gui.py:485 msgid "Installed version:" msgstr "Versión instalada:" #: thonny/plugins/pip_gui.py:487 msgid "Installed to:" msgstr "Instalado en:" #: thonny/plugins/pip_gui.py:538 msgid "Please check your spelling!" msgstr "¡Por favor revisa tu ortografía!" #: thonny/plugins/pip_gui.py:542 msgid "Could not find the package info from PyPI." msgstr "No se encontró información del paquete en PyPI." #: thonny/plugins/pip_gui.py:544 thonny/plugins/pip_gui.py:1326 msgid "Error code:" msgstr "Código de error:" #: thonny/plugins/pip_gui.py:689 msgid "Can't find package name from the list:" msgstr "No se pudo encontrar el nombre del paquete en la lista:" #: thonny/plugins/pip_gui.py:744 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "El paquete '{}' es requerido para instalar y desinstalar otros paquetes." #: thonny/plugins/pip_gui.py:789 msgid "Package" msgstr "Paquete" #: thonny/plugins/pip_gui.py:902 msgid "Manage packages for %s" msgstr "Administrar paquetes para %s" #: thonny/editors.py:571 thonny/plugins/micropython/pip_gui.py:23 #: thonny/plugins/pip_gui.py:953 msgid "Confirmation" msgstr "Confirmación" #: thonny/plugins/pip_gui.py:954 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Parece que estás instalando un paquete relacionado con Thonny. Si lo que querías es instalar un plugin de Thonny, entonces deberías elegir 'Herramientas → Administrar plugins…'\n" "\n" "¿Seguro que quieres instalar %s para el back-end?" #: thonny/plugins/pip_gui.py:1059 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "¡NB! Debe haber otra versión disponible que sea compatible con la versión actual de Thonny. Click en el botón '…' para elegir la versión e instalarla." #: thonny/plugins/pip_gui.py:1067 msgid "Thonny plugin without requirements" msgstr "Plugin the Thonny sin requisitos" #: thonny/plugins/pip_gui.py:1083 msgid "Unsuitable requirements" msgstr "Requisitos inadecuados" #: thonny/plugins/pip_gui.py:1084 msgid "This package requires different Thonny version:" msgstr "Este paquete requiere una versión diferente de Thonny:" #: thonny/plugins/pip_gui.py:1088 msgid "If you still want it, then please install it from the command line." msgstr "Si aún lo desea, instálelo desde la línea de comandos." #: thonny/plugins/pip_gui.py:1125 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "¡NB! Debe reiniciar Thonny después de instalar / actualizar / desinstalar un complemento." #: thonny/plugins/pip_gui.py:1135 msgid "Thonny plug-ins" msgstr "Plug-ins de Thonny" #: thonny/plugins/pip_gui.py:1171 msgid "Advanced install / upgrade / downgrade" msgstr "Instalación / Actualización / Desactualización avanzadas" #: thonny/plugins/pip_gui.py:1180 msgid "Desired version" msgstr "Versión deseada" #: thonny/plugins/pip_gui.py:1239 msgid "Upgrade dependencies" msgstr "Actualizar dependencias" #: thonny/plugins/pip_gui.py:1324 msgid "Requires:" msgstr "Requiere:" #: thonny/plugins/pip_gui.py:1328 msgid "Error:" msgstr "Error:" #: thonny/plugins/pip_gui.py:1541 msgid "Manage packages..." msgstr "Gestionar paquetes..." #: thonny/plugins/pip_gui.py:1547 msgid "Manage plug-ins..." msgstr "Administra plug-ings…" #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "Abrir moviola…" #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "Cambia directorio de trabajo a directorio del script en la Ejecución/Depuración" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Muestra en ventanas separadas los entornos cada llamada a función" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "No marcar si quiere una experiencia más tradicional." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Abrir y cerrar el Stack automáticamente" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Abre la vista Pila en la primera llamada y la cierra cuando el programa regresa al marco principal." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Permitir entrar en librerías fuera del directorio principal del script." #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Tal vez haga de la depuración más lenta." #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "Depurador preferido" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(utilizado al hacer clic en el botón Depurar de la barra de herramientas)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Puerto para Birdsye" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(Reinicia Thonny luego de cambiar esto)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Ejecutar y Depurar" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Emulación de terminal" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "soporte para colores y estilos básicos ANSI" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Número máximo de líneas a mantener." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "¡Aviso! ¡Valores grandes degradan el rendimiento!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maxima longitud de un fragmento de texto antes de condensar" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Ejecutando el script actual en la terminal" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Continuar con el REPL de Python luego de la finalización del programa" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Mantener la terminal abierta luego de que el proceso de Python termine" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "¡Aviso! El cierre automático debe estar habilitado en la configuración de la Terminal" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminal" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "Aspecto" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Color Sintaxis" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Letra editor" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "Letra Ent/Sal" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Previsualizar" #: thonny/plugins/theme_and_font_config_page.py:151 msgid "This is a comment" msgstr "Este es un comentario" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "The answer is" msgstr "La respuesta es" #: thonny/plugins/theme_and_font_config_page.py:158 msgid "unclosed_string" msgstr "string_sin_cerrar" #: thonny/plugins/theme_and_font_config_page.py:160 msgid "blah, blah" msgstr "bla, bla" #: thonny/plugins/theme_and_font_config_page.py:184 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "¡Aviso! ¡Algunos elementos de estilo cambiaran luego de reiniciar Thonny!" #: thonny/plugins/theme_and_font_config_page.py:223 msgid "Enter an integer" msgstr "Ingresa un número entero" #: thonny/plugins/theme_and_font_config_page.py:236 msgid "Theme & Font" msgstr "Temas y Fuentes" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Abre la carpeta Thonny program…" #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Abre la carpeta Thonny data…" #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Inicio" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Contenidos de la Ayuda" #: thonny/plugins/micropython/mp_front.py:300 msgid "CircuitPython device" msgstr "Dispositivo CircuitPython" #: thonny/plugins/micropython/mp_front.py:304 msgid "MicroPython device" msgstr "Dispositivo MicroPython" #: thonny/plugins/micropython/mp_front.py:541 msgid "Connect your device to the computer and select corresponding port below" msgstr "Conecte su dispositivo a la computadora y seleccione el puerto correspondiente a continuación" #: thonny/plugins/micropython/mp_front.py:544 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "buscar por un nombre de dispositivo, \"USB Serial\" o \"UART\"" #: thonny/plugins/micropython/mp_front.py:546 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Si no puede encontrarlo, es posible que primero deba instalar el controlador USB adecuado." #: thonny/plugins/micropython/mp_front.py:439 msgid "Port" msgstr "Puerto" #: thonny/plugins/micropython/mp_front.py:449 msgid "Try to detect port automatically" msgstr "Intenta detectar el puerto automáticamente" #: thonny/plugins/micropython/__init__.py:25 msgid "MicroPython (generic)" msgstr "MicroPython (genérico)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Imprimir..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Abre el shell del sistema…" #: thonny/plugins/backend_config_page.py:110 msgid "Details" msgstr "Detalles" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Instalar desde archivo \"requirements.txt\"" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Instalar desde archivo local" #: thonny/plugins/pip_gui.py:1118 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "Este cuadro de diálogo es para administrar los complementos de Thonny y sus dependencias.\n" "Si desea instalar paquetes para sus propios programas, elija 'Herramientas → Administrar paquetes ...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (genérico)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Indentar las líneas seleccionadas" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "Des-indentar las líneas seleccionadas" #: thonny/workbench.py:1471 msgid "Switch to\n" "regular\n" "mode" msgstr "Cambiar a modo regular" #: thonny/plugins/microbit/__init__.py:58 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Asegúrese de que MicroPython se haya instalado en su micro:bit" #: thonny/plugins/microbit/__init__.py:60 msgid "Don't forget that main.py only works without embedded main script." msgstr "No olvide que main.py solo funciona sin un script principal incrustado." #: thonny/plugins/micropython/uf2dialog.py:44 msgid "please wait" msgstr "por favor espere" #: thonny/misc_utils.py:151 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "No se pudo encontrar el disco '%s'. ¿Quieres localizarlo tú mismo?" #: thonny/misc_utils.py:154 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Se encontraron varios discos '%s'. ¿Quieres elegir uno tú mismo?" #: thonny/misc_utils.py:170 msgid "Can't find suitable disk" msgstr "No es posible encontrar un disco apropiado" #: thonny/base_file_browser.py:287 msgid "%d items" msgstr "%d ítemes" #: thonny/base_file_browser.py:736 msgid "Move to Trash" msgstr "Mover al basurero" #: thonny/base_file_browser.py:739 msgid "Delete" msgstr "Eliminar" #: thonny/base_file_browser.py:718 thonny/base_file_browser.py:869 msgid "New directory" msgstr "Nuevo Directorio" #: thonny/base_file_browser.py:742 msgid "Properties" msgstr "Propiedades" #: thonny/base_file_browser.py:744 msgid "Storage space" msgstr "Espacio de almacenamiento" #: thonny/base_file_browser.py:754 msgid "Path" msgstr "Ruta" #: thonny/base_file_browser.py:756 msgid "Directory properties" msgstr "Propiedades del directorio" #: thonny/base_file_browser.py:758 msgid "File properties" msgstr "Propiedades del archivo" #: thonny/base_file_browser.py:760 msgid "bytes" msgstr "bytes" #: thonny/base_file_browser.py:763 msgid "Size" msgstr "Tamaño" #: thonny/base_file_browser.py:93 thonny/base_file_browser.py:774 msgid "Modified" msgstr "Modificado" #: thonny/base_file_browser.py:833 msgid "Deleting %s" msgstr "Borrando %s" #: thonny/editors.py:253 msgid "Loading" msgstr "Cargando" #: thonny/editors.py:382 msgid "Saving" msgstr "Guardando" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Subir a %s" #: thonny/plugins/files.py:417 msgid "Downloading %s to %s" msgstr "Descargando %s a %s" #: thonny/plugins/files.py:323 msgid "Download to %s" msgstr "Descargar a %s" #: thonny/base_file_browser.py:643 msgid "Open in system file manager" msgstr "Abrir en gestor de archivos" #: thonny/base_file_browser.py:671 msgid "Hide hidden files" msgstr "No mostrar archivos ocultos" #: thonny/base_file_browser.py:671 msgid "Show hidden files" msgstr "Mostrar archivos ocultos" #: thonny/base_file_browser.py:654 msgid "Open in Thonny" msgstr "Abrir en Thonny" #: thonny/base_file_browser.py:685 msgid "Open in system default app" msgstr "Abrir en la aplicación predeterminada del sistema" #: thonny/base_file_browser.py:666 thonny/base_file_browser.py:693 msgid "Configure %s files" msgstr "Configurando %s archivos" #: thonny/base_file_browser.py:694 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "¿Qué hacer con un archivo %s cuando hace doble clic en él en el explorador de archivos de Thonny?" #: thonny/base_file_browser.py:1240 thonny/editors.py:953 thonny/editors.py:955 msgid "Deleting" msgstr "Borrando" #: thonny/base_file_browser.py:1247 msgid "Creating directory" msgstr "Creando directorio" #: thonny/editors.py:251 msgid "Loading %s" msgstr "Cargando %s" #: thonny/editors.py:377 msgid "Saving to %s" msgstr "Guardando a %s" #: thonny/editors.py:702 thonny/editors.py:704 msgid "Save All files" msgstr "Salvar todos los ficheros" #: thonny/plugins/backend_config_page.py:340 thonny/workbench.py:869 msgid "Configure interpreter..." msgstr "Configurar interprete..." #: thonny/workbench.py:1581 msgid "Device" msgstr "Dispositivo" #: thonny/workdlg.py:193 msgid "Cancelling" msgstr "Cancelando" #: thonny/workdlg.py:220 msgid "Starting" msgstr "Iniciando" #: thonny/plugins/backend_config_page.py:251 msgid "Authentication" msgstr "Autenticación" #: thonny/plugins/backend_config_page.py:253 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Ingrese la frase de contraseña de su clave privada para\n" "{}" #: thonny/plugins/backend_config_page.py:256 msgid "Enter your password for\n" "{}" msgstr "Ingrese su contraseña para\n" "{}" #: thonny/plugins/object_inspector.py:487 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "La representación de arriba es un valor aproximado de este 'float'. El valor almacenado exacto es %s, que es aproximadamente %s" #: thonny/plugins/pip_gui.py:645 msgid "Search results" msgstr "Resultados de la búsqueda" #: thonny/plugins/pip_gui.py:646 msgid "Searching" msgstr "Buscando" #: thonny/plugins/pip_gui.py:728 thonny/plugins/pip_gui.py:817 msgid "Installing '%s'" msgstr "Instalando '%s'" #: thonny/plugins/pip_gui.py:734 msgid "Upgrading '%s'" msgstr "Actualizando '%s'" #: thonny/plugins/pip_gui.py:741 msgid "Uninstalling '%s'" msgstr "Desinstalando '%s'" #: thonny/plugins/pip_gui.py:755 msgid "Installing" msgstr "Instalando" #: thonny/plugins/pip_gui.py:1502 msgid "Package manager is not available for this interpreter" msgstr "El administrador de paquetes no está disponible para este intérprete" #: thonny/base_file_browser.py:1191 thonny/plugins/pip_gui.py:1516 msgid "Not supported" msgstr "No soportado" #: thonny/plugins/micropython/pip_gui.py:100 thonny/plugins/pip_gui.py:1521 msgid "Not available" msgstr "No disponible" #: thonny/plugins/pip_gui.py:1522 msgid "You need to stop your program before launching the package manager." msgstr "Debe detener su programa antes de iniciar el administrador de paquetes." #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Abrir valores evaluados en el inspector de objetos" #: thonny/plugins/cpython_frontend/cp_front.py:208 msgid "Python executable" msgstr "Ejecutable de Python" #: thonny/plugins/cpython_frontend/cp_front.py:231 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "NB: El botón de selección de ficheros puede que no funcione bien cuando se seleccionen ejecutables de un entorno virtual. En este caso elegir el script 'activar' en vez del intérprete (o entrar el path –camino del fichero– directamente en la caja)" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Python 3 Remoto (SSH)" #: thonny/plugins/micropython/mp_front.py:310 msgid "Not connected" msgstr "No conectado" #: thonny/plugins/micropython/mp_front.py:515 msgid "Advanced options" msgstr "Opciones avanzadas" #: thonny/plugins/micropython/mp_front.py:547 msgid "Install or update firmware" msgstr "Instalar o actualizar el firmware" #: thonny/plugins/micropython/__init__.py:36 msgid "MicroPython (local)" msgstr "MicroPython (local)" #: thonny/plugins/micropython/__init__.py:47 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:77 msgid "Scope" msgstr "Alcance" #: thonny/plugins/micropython/pip_gui.py:90 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "Este cuadro de diálogo enumera los módulos de nivel superior de los siguientes directorios:" #: thonny/plugins/micropython/pip_gui.py:99 msgid "New packages will be installed to" msgstr "Los nuevos paquetes serán instalados en" #: thonny/plugins/micropython/pip_gui.py:102 msgid "no absolute lib directory in sys.path" msgstr "Sin directorio lib absoluto en 'sys.path'" #: thonny/plugins/micropython/uf2dialog.py:39 msgid "Version to be installed" msgstr "Versión a ser instalada" #: thonny/plugins/micropython/uf2dialog.py:47 msgid "Target device location" msgstr "Ubicación del dispositivo de destino" #: thonny/plugins/micropython/uf2dialog.py:58 msgid "Target device model" msgstr "Modelo de dispositivo de destino" #: thonny/plugins/micropython/uf2dialog.py:146 msgid "Please wait" msgstr "Espere por favor" #: thonny/plugins/pip_gui.py:70 msgid "Search on PyPI" msgstr "Buscar en PyPI" #: thonny/base_file_browser.py:686 msgid "Open in Thonny's text editor" msgstr "Abrir en el editor de texto de Thonny" #: thonny/base_file_browser.py:339 msgid "Storage space on this drive or filesystem" msgstr "Espacio de almacenamiento en esta unidad o sistema de archivos" #: thonny/base_file_browser.py:340 msgid "total space" msgstr "espacio total" #: thonny/base_file_browser.py:342 msgid "used space" msgstr "espacio ocupado" #: thonny/base_file_browser.py:343 msgid "free space" msgstr "espacio libre" #: thonny/base_file_browser.py:350 msgid "Storage info" msgstr "Información de almacenamiento" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "Reemplazar los tabuladores por espacios" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Resaltar los caracteres tabulador" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Sangría con caracteres de tabulación (no recomendado para Python)" #: thonny/base_file_browser.py:91 thonny/memory.py:63 msgid "Name" msgstr "Nombre" #: thonny/base_file_browser.py:95 msgid "Size (bytes)" msgstr "Tamaño (bytes)" #: thonny/base_file_browser.py:870 msgid "Enter name for new directory under\n" "%s" msgstr "Ingrese el nombre para el nuevo directorio en\n" "%s" #: thonny/base_file_browser.py:893 msgid "Nothing selected" msgstr "Nada seleccionado" #: thonny/base_file_browser.py:893 msgid "Select an item and try again!" msgstr "Seleccione un artículo y vuelva a intentarlo." #: thonny/base_file_browser.py:1311 msgid "Open from %s" msgstr "Abrir de %s" #: thonny/base_file_browser.py:1314 msgid "Save to %s" msgstr "Guardar a %s" #: thonny/base_file_browser.py:1333 msgid "File name:" msgstr "Nombre de archivo:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value ID" msgstr "ID de valor" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:540 #: thonny/plugins/object_inspector.py:619 msgid "Value" msgstr "Valor" #: thonny/plugins/backend_config_page.py:274 msgid "Save password" msgstr "Guardar contraseña" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Llamada de función en %s" #: thonny/plugins/debugger.py:1003 msgid "Local variables" msgstr "Variables locales" #: thonny/plugins/debugger.py:1035 msgid "Function" msgstr "Función" #: thonny/plugins/debugger.py:1036 msgid "Location" msgstr "Ubicación" #: thonny/plugins/debugger.py:1112 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Si el último comando generó una excepción, esta vista mostrará el seguimiento de la pila (stacktrace)." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Datos" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Atributos" #: thonny/plugins/object_inspector.py:538 msgid "Index" msgstr "Índice" #: thonny/plugins/object_inspector.py:616 msgid "Key ID" msgstr "ID de Llave" #: thonny/plugins/object_inspector.py:617 msgid "Key" msgstr "Llave" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Volver a\n" "%s" #: thonny/plugins/micropython/mp_front.py:439 msgid "Port or WebREPL" msgstr "Puerto o WebREPL" #: thonny/plugins/micropython/mp_front.py:583 msgid "Password" msgstr "Contraseña" #: thonny/plugins/debugger.py:961 msgid "Source code" msgstr "Código fuente" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Use cuadros de diálogo de archivos Tk en lugar de Zenity" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Seleccione si los cuadros de diálogo del archivo terminan detrás de la ventana principal" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Variables de Entorno (una CLAVE=VALOR por línea)" #: thonny/base_file_browser.py:715 msgid "New file" msgstr "Archivo nuevo" #: thonny/base_file_browser.py:733 msgid "Rename" msgstr "Renombrar" #: thonny/base_file_browser.py:919 msgid "Rename '%s'" msgstr "Renombrar '%s'" #: thonny/base_file_browser.py:919 msgid "Enter new name" msgstr "Ingresa un nuevo nombre" #: thonny/base_file_browser.py:1007 msgid "Paste failed" msgstr "Fallo de pegado" #: thonny/base_file_browser.py:1007 msgid "There are conflicting folders" msgstr "Hay carpetas con conflictos" #: thonny/base_file_browser.py:1129 msgid "File already exists" msgstr "El archivo ya existe" #: thonny/base_file_browser.py:1194 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Si se trata de un archivo de texto, puede configurarlo para que se abra en Thonny haciendo clic con el botón derecho y seleccionando \"Configurar... archivos\"." #: thonny/editors.py:35 msgid "Python files" msgstr "Archivos Python" #: thonny/editors.py:119 thonny/editors.py:182 msgid "" msgstr "" #: thonny/editors.py:146 msgid "File is gone" msgstr "El archivo no está" #: thonny/editors.py:149 msgid "Do you want to also close the editor?" msgstr "¿Quieres cerrar también el editor?" #: thonny/editors.py:165 msgid "External modification" msgstr "Modificación externa" #: thonny/editors.py:168 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "¿Quieres descartar el contenido actual del editor y volver a cargar el archivo desde el disco?" #: thonny/editors.py:572 msgid "Python files usually have .py extension." msgstr "Los archivos de Python suelen llevar la extensión .py." #: thonny/editors.py:574 msgid "Did you mean '%s'?" msgstr " ¿Quisiste decir '%s'? " #: thonny/editors.py:733 msgid "Move / rename..." msgstr "Mover / renombrar..." #: thonny/editors.py:742 msgid "Go to line..." msgstr "Ir a la línea..." #: thonny/editors.py:977 msgid "Line number" msgstr "Número de línea" #: thonny/editors.py:1123 msgid "Do you want to save files before closing?" msgstr "¿Desea guardar los archivos antes de cerrarlos?" #: thonny/editors.py:1125 msgid "Do you want to save file before closing?" msgstr "¿Desea guardar los archivos antes de cerrarlos?" #: thonny/editors.py:1128 msgid "Save On Close" msgstr "Guardar al cerrar" #: thonny/misc_utils.py:513 msgid "Command not available" msgstr "Comando no disponible" #: thonny/misc_utils.py:514 msgid "This command is not available if Thonny is run via Flatpak" msgstr "Este comando no está disponible si Thonny se ejecuta a través de Flatpak" #: thonny/workbench.py:686 thonny/workbench.py:786 msgid "Support Ukraine" msgstr "Apoya a Ucrania" #: thonny/plugins/backend_config_page.py:91 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "¿Qué tipo de intérprete debe utilizar Thonny para ejecutar su código? " #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Mostrar información sobre los parámetros" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Mostrar automáticamente la información de parámetros luego de escribir '('" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Proponer automáticamente las compleciones mientras se escribe" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Mostrar automáticamente la documentación de las compleciones" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Pedir que se complete con la tecla Tab en los editores" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Pedir que se complete con la tecla Tab en la consola" #: thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Problema" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Definición no encontrada" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Limpiar Consola antes de iniciar un nuevo proceso (Ejecutar, Depurar, Detener/Reiniciar, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:170 msgid "Thonny's Python" msgstr "El Python de Thonny" #: thonny/plugins/micropython/mp_front.py:487 msgid "Interrupt working program on connect" msgstr "Interrumpir el programa de en funcionamiento al conectarse" #: thonny/plugins/micropython/mp_front.py:494 msgid "Synchronize device's real time clock" msgstr "Sincronizar el reloj de tiempo real del dispositivo" #: thonny/plugins/micropython/mp_front.py:500 msgid "Use local time in real time clock" msgstr "Utilizar la hora local en el reloj de tiempo real " #: thonny/plugins/micropython/mp_front.py:506 msgid "Restart interpreter before running a script" msgstr "Reiniciar el intérprete antes de ejecutar un script" #: thonny/plugins/micropython/pip_gui.py:24 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "Esto no se parece al paquete MicroPython/CircuitPython.\n" "¿Está seguro de que quiere instalarlo?" #: thonny/base_file_browser.py:844 msgid "Moving to Trash" msgstr "Mover a la papelera" #: thonny/base_file_browser.py:845 msgid "Move %s to Trash?" msgstr "¿Mover %s a la papelera?" #: thonny/base_file_browser.py:852 msgid "Moving %s to Trash" msgstr "Moviendo %s a la papelera" #: thonny/base_file_browser.py:659 msgid "Open in default external app" msgstr "Abrir en la aplicación externa por defecto" #: thonny/base_file_browser.py:1192 msgid "Opening remote files in external app is not supported." msgstr "No es posible abrir archivos remotos en una aplicación externa." #: thonny/base_file_browser.py:1199 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Si el archivo debe abrirse en una aplicación externa, descárgalo en un directorio local y ábrelo desde allí." #: thonny/editors.py:147 msgid "Looks like '%s' was deleted or moved." msgstr "Parece que '%s' fue borrado o movido." #: thonny/editors.py:166 msgid "Looks like '%s' was modified outside of the editor." msgstr "Parece que '%s' fue modificado fuera del editor." #: thonny/plugins/cpython_frontend/cp_front.py:229 msgid "NB! Thonny only supports Python %s and later" msgstr "Nota: Thonny solo soporta Python %s y posteriores" #: thonny/editors.py:977 msgid "Go to line" msgstr "Ir a la línea" #: thonny/workbench.py:689 msgid "Support" msgstr "Soporte" #: thonny/editors.py:386 thonny/editors.py:401 msgid "Could not save" msgstr "No se ha podido guardar" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Advertencia" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Si se entrecomilla el valor de una variable de entorno, las mismas formarán parte del valor.\n" "¿Es esto lo que querías?" #: thonny/workbench.py:859 msgid "Install MicroPython" msgstr "" #: thonny/workbench.py:863 msgid "Install CircuitPython" msgstr "" #: thonny/plugins/backend_config_page.py:212 msgid "Make uploaded shebang scripts executable" msgstr "" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "" #: thonny/plugins/micropython/pip_gui.py:77 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "" #: thonny/plugins/todo_view.py:42 msgid "Line" msgstr "" #: thonny/plugins/todo_view.py:43 msgid "Info" msgstr "" #: thonny/plugins/todo_view.py:121 msgid "No line marked with #todo found" msgstr "" #: thonny/plugins/todo_view.py:141 msgid "TODO" msgstr "" #: thonny/plugins/circuitpython/cirpy_front.py:98 #: thonny/plugins/micropython/mp_front.py:530 msgid "Install or update %s" msgstr "" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "" #: thonny/plugins/cpython_frontend/cp_front.py:239 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "" #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/thonny/locale/et_EE/0000775000175000017500000000000014307363733016417 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6901064 thonny-4.0.1/thonny/locale/et_EE/LC_MESSAGES/0000775000175000017500000000000014307363733020204 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662903732.0 thonny-4.0.1/thonny/locale/et_EE/LC_MESSAGES/thonny.mo0000664000175000017500000010145114307362664022064 0ustar00annamaaannamaa|$)  5@ O\&y!D& ? ITc j.x02   1x?  & 5 < G V ;g    G !*!0!7! =! G!T! j!v! " " 9"GF""""""<"%#*?#j#y######## $3($\$o$$$$ $$$$$$$!% 6%%A%Lg%%(%)%'& 9&BG&&&&&& &&%&''/.'^'.y'' ''' '' '''(( '( 4(?(O(U(Z(i( o( |( ((.((=r) )))) ) ))0)0* 5*C*6U******+ +++!+{)+L+m+F`,,mo-C-!.4.7J... ......./)/ D/R/ e/p/ //$//3//0 00(070 <0H0M0 U0`0o000%0300z1%K2;q2(2223 31!3 S3t33333333 44+4n;44,505<56,6U61767 :7H7nQ7!7 77 8 8 *888>8O8R8?c8C889' 9)H9 r9999999:%:6-:Td: :::: :::H:5H;~;;; ;;;;; <<:<Q<V<f<$y<&<<<<<<= = = +=5=F= X=(e==== =B= >> >#>9> @>&L>s> {>> > >>)>+>!? *?+4?`?g? k? w??? ?"??? ? @ @ !@ /@:@ A@N@T@c@ r@|@ @ @@2@8@:2AmAA A0AAAAB B BBVUV\VcVhV#V!V"V7V"W9W PW\WdW mWyWWWWWW6W XXN6XX+X,XXYP%YvY{YY YYYY!YYZ)&ZPZ3hZZZZ ZZZZZZZ[[ )[5[D[K[P[_[e[ w[[[*[[Bu\ \ \\\ \ \ ]<]O]W]h]~]]]]]] ^^^^(^~=^I^k_Hr__uS`B` a#a6:aqaxa }aaaaaaa b$bCbYb obybbb'bbAbc c)c.cIcZc _cjcnc uccccc3c2c(dsd/De:te/eeeff4)f^f vfffffffg*g>gVggkgg2h8hHhkFi5iRi;j@j DjNj\Wjjjjkk $k2k;kQk Wk@ek2kkk$l4lTl elqlllll"lm7"m`Zm mm mmm m nAn8Sn nnnnnnn,n o*o92oloqoo'o/ooo ppp,p BpOp Xpbpvpp*pppppEq%Lq rq }qq qq0qq r r.r6rEr7Yr8rrr5rss s+sAbout BirdseyeAbout ThonnyActivate virtual environmentAdvanced install / upgrade / downgradeAdvanced optionsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Are you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeAutomatically propose completions while typingAutomatically show documentation for completionsAutomatically show parameter info after typing '('BackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear Shell before starting new process (Run, Debug, Stop/Restart, ...)Clear shellClickClick CloseClose allClose othersCommand not availableComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find definitionCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Could not saveCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDefault passwordDeleteDeletingDeleting %sDesired versionDetailsDeviceDid you mean '%s'?Directory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to also close the editor?Do you want to discard current editor content and reload the file from disk?Do you want to overwrite '%s' ?Do you want to save file before closing?Do you want to save files before closing?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter new nameEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExport usage logs...External modificationFileFile already existsFile is goneFile name:File propertiesFilesFindFind & ReplaceFind:Focus editorFocus intoFocus shellFont scaling modeFor debugging the program must be saved first.For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralGo to lineGo to line...HeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'.If last command raised an exception then this view will show the stacktrace.If the file needs to be opened in external app, then download it to a local directory and open it from there!If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you quote the value of an environment variable, the quotes will be part of the value. Did you intend this?If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInfoInformationInstallInstall CircuitPythonInstall MicroPythonInstall from PyPIInstall from local fileInstall from requirements fileInstall or update %sInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionInterrupt working program on connectIntoKeep terminal window open after Python process endsKeyKey IDLanguageLatest stable versionLatest versionLineLine numberLoadLoadingLoading %sLocal Python 3Local variablesLocationLog program usage eventsLooks like '%s' was deleted or moved.Looks like '%s' was modified outside of the editor.Looks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake saved shebang scripts executableMake sure MicroPython has been installed to your micro:bit.Make uploaded shebang scripts executableManage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedMove %s to Trash?Move / rename...Move to TrashMoving %s to TrashMoving to TrashNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python %s and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NameNewNew directoryNew fileNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNo line marked with #todo foundNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in default external appOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opening remote files in external app is not supported.Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package manager is not available for this interpreterPackages' directoryPasswordPastePaste failedPathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPreparations (skip the VS Code part)Present Python REPL after program endsPreviewPrevious objectPrint...ProblemProgram argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython filesPython files usually have .py extension.Python interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)RenameRename '%s'Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequest completions with Tab-key in ShellRequest completions with Tab-key in editorsRequiresRequires:Restart interpreter before running a scriptResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave On CloseSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect if the file dialogs end up behind the main windowSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersShow parameter infoSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySupportSupport UkraineSwitch to regular modeSynchronize device's real time clockSyntax themeTODOTargetTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe representation above is an approximate value of this float. The exact stored value is %s which is about %sThe specified text was not found!Theme & FontThere are conflicting foldersThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This command is not available if Thonny is run via FlatpakThis computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This doesn't look like MicroPython/CircuitPython package. Are you sure you want to install it?This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThonny optionsThonny plug-insThonny plugin without requirementsThonny's PythonToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityUse local time in real time clockValueValue IDVariablesVersion historyVersion to be installedViewVisualize current script at Python TutorWarningWhat to do with a %s file when you double-click it in Thonny's file browser?Which kind of interpreter should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Wrap text (may be slow)You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside.You need to select a file!You need to stop your program before launching the package manager.Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentMIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: POEditor.com Project-Id-Version: Thonny Language: et %d üksust(taaskäivita Thonny peale selle muutmist)(rakendatakse "Silur" tööriistariba nupu klõpsamisel)Birdseye kohtaInfo Thonny kohtaAktiveeri virtuaalkeskkondTäpsem install / versiooni valikLisaseadedLuba korraga ainult üks ThonnyLuba teegifunktsioonide sisse astumine (väljaspool skripti kausta)Kas oled kindel, et soovid seda desinstallida?JuhendajaAtribuudidAutentimineAutorLõpeta sõna automaatseltPaku sõnade lõpetamist tippimisel automaatseltNäita pakkumiste dokumentatsiooni automaatseltNäita parameetrite infot automaatselt peale '(' tippimistTagasiTagasi %sTagasi aktiivsesse raamiHalb kaustBirdseye on Pythoni silur, mis tuleb eraldi paigaldada. Kas soovid avada vastava abiinfo lehe, et rohkem teada saada?Birdseye portVaata pakkeVigade registerEi saa veel sulgedaEi leia paki nime nimekirjast:Ei leia sobivat draivi.TühistaTühistanTõstutundlikMuuda kirja suurustMuuda jooksutamisel / silumisel automaatselt jooksvat kaustaCircuitPython (üldine)CircuitPythoni seadePuhastaTühjenda Käsurida enne uue protsessi käivitamist (Jooksuta, Silu, Peata/taaskäivita, ...)Puhasta käsuridaKlõpsaKlõpsa SulgeSulge kõikSulge ülejäänudKäsk pole saadavalKommenteeriSeaded on muudetud. Tavarežiimis alustamiseks taaskäivita Thonny. (Vaata 'Tööriistad → Seaded → Üldine', kui Sa mõtled hiljem ümber.)Seadista %s failidSeadista interpretaator...KinnitusÜhenda seade arvutiga ja vali allpoolt selle portKopeeriKopeeri lõikepuhvrisseKopeerinKopeerin %s => %sEi leidnud definitsiooniEi leia draivi nimega '%s'. Kas soovid selle ise valida?Ei leidnud PyPI-st sellist pakkiEi leidnud sellist pakki PyPI-stSalvestamine ei õnnestunudLoon kaustaLoon virtuaalkeskkondaLõikaAndmedSiluSilu käesolevat skriptiSilu käesolevat skripti (birdseye)Silu käesolevat skripti (kiirem)Silu käesolevat skripti (ägedam)Arendusrežiim (annab detailsemat diagnostilised logid)Vähenda fondi suurustVähenda ridade taanetVaikeparoolKustutaKustutanKustutan %sSoovitud versioonDetailidSeadeKas mõtlesid '%s'?Kausta omadusedKeela teavitushelidTühistatud kontrollid (üks identifikaator rea kohta)Ühenda lahtiKas soovid redaktorit sulgeda?Kas soovid redaktori praeguse sisu tühistada ja laadida faili kettalt uuesti?Kas soovid '%s' üle kirjutada?Kas soovid enne sulgemist faili salvestada?Kas soovid enne sulgemist failid salvestada?Kinnita kasutaja aknadDokumentatsioonÄra unusta, et main.py toimib ainult siis kui MicroPython on ilma peaskriptita.AllaLaadi alla kausta %sLaadi %s alla kausta %sRedigeeriRedaktorRedaktori fontSisesta täisarvSisesta uue kausta nimi (%s all)Sisesta uus nimiSisesta asendatav sõneSisesta oma privaatvõtme parool {} jaoksSisesta parool {} jaoksKeskkonnamuutujad (üks VÕTI=VÄÄRTUS ühel real)VigaVeakood:Viga:SündmusedErindVäljuVälju ThonnystEkspordi kasutuslogiVäline muudatusFailFail juba eksisteeribFaili ei leitudFaili nimi:Faili omadusedFailidOtsiOtsi ja asendaOtsi:Mine redaktorisseMine sisseMine käsurealeFondi suuruse režiimSilumiseks tuleb programm enne salvestada.Parema jõudluse nimel ei näidata Käsureal väga pikki ridu (vaata Tööriistad => Seaded => Käsurida). Siin saad Sa algset tekstifragmenti täielikult näha.Leidsin mitu draivi nimega '%s'. Kas soovid ühe neist ise valida?TäisekraanFunktsioonFunktsiooni väljakutse (%s)ÜldineMine realeMine reale...KuhiKuhja režiim on sees. Väljalülitamiseks sulge Kuhja vaadeAbiinfoAbiinfo sisukordPeida varjatud failidToo esile jooksev ridaToo esile lokaalsed muutujadToo esile samad nimedToo esile sulupaaridTee kood värviliseksToo tab-sümbolid esileAvalehtKodulehtIDINSTALLISisend/väljund fontKui tegemist on tekstifailiga, siis Sa saad seadistada Thonny seda avama kui teed paremklõpsu ja valid 'Seadista ... failid'.Kui viimane käsk tekitas erindi, siis siin näidatakse selle pinujälge.Kui faili on vaja avada välises rakenduses, siis lae see kõigepealt alla lokaalsesse kausta ja ava sealt!Kui sa ei leia seda, siis pead võibolla installima sobiva USB draiveri.Kui Sa ei tea, kust pakki saada, siis on mõistlik otsida seda Pythoni pakiregistrist (PyPI), Alustuseks sisest paki nimi otsingukasti ja vajuta ENTER.Kui Sa paned keskkonnamuutuja väärtuse jutumärkidesse, siis jutumärgid saavad väärtuse osaks. Kas soovisid nii?Kui sa ikkagi tahad seda, siis installi see süsteemi käsurealt..Suurenda kirja suurustSuurenda ridade taanetTaanda tab-sümbolitega (mittesoovitav Pythoni koodis)IndeksInfoInformatsioonInstalliInstalli CircuitPythonInstalli MicroPythonInstalli PyPI-stInstalli lokaalsest failistInstalli sõltuvusfaili järgiInstalli või uuenda %sPaigalda või uuenda püsivaraInstallimise asukoht:Installitud versioon:InstallinInstallin '%s'InterpretaatorKatkesta programmKatkesta ühendumisel töötav programmSisseHoia terminali aken avatuna ka peale Pythoni protsessi lõppemistVõtiVõtme IDKeelViimane stabiilne versioonViimane versioonRidaRea numberLaeLaadinLaadin %sKohalik Python 3Lokaalsed muutujadAsukohtLogi kasutussündmusiNäib, et '%s' on kustutatud või ümberpaigutatud.Näib, et '%s' on muudetud väljaspool redaktorit.Paistab, et soovid installida Thonny pistikprogrammi. Õige oleks seda teha 'Tööriistad → Halda pistikprogramme' alt. Oled sa kindel, et tahad installida %s siin?Loodud Tartu Ülikoolis, Eestis. Abiks on olnud avatud tarkvara kogukond, Raspberry Pi Foundation ja Cybernetica ASTee salvestatud shebang-skriptid käivitatavaksVeendu, et MicroPython oleks su micro:bit-ile installitud.Tee üleslaetud shebang-skriptid käivitatavaksHalda %s pakkeHalda lisapakke...Halda pistikprogramme...Suurenda vaadeMaksimaalne realõigu pikkus enne "kokkupigistamist"Maksimaalne ridade arv.Võib teha silumise aeglasemaks.MicroPython (SSH)MicroPython (üldine)MicroPython (lokaalne)MicroPythoni seadeMuudetudKas liigutan %s Prügikasti?Liiguta / nimeta ümber...Liiguta PrügikastiLiigutan %s PrügikastiLiigutan PrügikastiNB! Automaatset sulgemist tuleb lubada Terminali seadetes (Profiles → Shell → When the shell exits)NB! Faili valimise nupp ei pruugi korralikult toimida, kui valida käivitusfaile virtuaalkeskkonnas. Sel juhul vali hoopis 'activate' skript (või sisesta failitee sisestuskasti käsitsi)!NB! Suurte väärtustega võib jõudlus halveneda!NB! Need seaded rakenduvad peale Thonny taaskäivitamistNB! Mõned stiilielemendid muutuvad alles peale Thonny taaskäivitamist!NB! Mõni muu versioon võib selle Thonny versiooniga klappida. Klõpsa '...' nupule versiooni valimiseks.NB! Thonny toetab ainult Python %s ja sellest uuemaidNB! Äsja installitud pistikprogramm rakendub alles peale Thonny taaskäivitamist.NimiUusUus kaustUus failUued pakid installitakse ka sellesse kausta. Teisi asukohti tuleb hallata teiste vahenditegaUued pakid installitakse kaustaJärgmine objektEi leidnud ühtki #todo ridaPole kättesaadavPole ühendatudPole toetatudMärkmedMidagi pole märgitudSobibObjektivaaturAva Juhendaja automaatselt, kui tal on hoiatusi Sinu koodi kohtaAva Juhendaja automaatselt, kui programm annab veaAva Thonny andmekaust...Ava Thonny programmikaust...Ava ja sulge Pinu vaade automaatseltAva väärtused ObjektivaaturisAva asukohast %sAva ThonnysAva Thonny tekstiredaktorisAva välises vaikerakendusesAva süsteemi vaikerakendusegaAva süsteemi failihaldurisAva Taasesitaja...Ava süsteemi käsurida / terminalAva...Välises rakenduses ei saa avada mittelokaalseid faile.Avab Pinu vaate esimesel funktsiooni väljakutsel ja sulgeb, kui programm jõuab tagasi pearaamiSeaded...VäljaStruktuurÜleKirjutada üle?Kirjutan üle teemat nimega '%s'PakkPakk '{}' on vajalik teiste pakkide installimiseks ja uuendamisksPakihaldur pole selle interpretaatori jaoks kättesaadavPakkide kaustParoolKleebiKleepimine ebaõnnestusTeeTeosta MyPy kontrolleTeosta Pylint kontrolleKontrolli kas kirjutasid paki nime õigesti!Palun ootaPlotterPlotter visualiseerib käsureale prinditud numbrijadasid.PortPort või WebREPLEelistatud silurEttevalmistused (ignoreeri VS Code osa)Näita peale programmi lõppu Pythoni käsuridaEelvaadeEelmine objektPrindi...ProbleemProgrammi argumendidProgrammi argumendid:ProgrammipuuOmadusedPyPI lehtPygame Zero režiimPythoni käivitusfailPythoni failidPythoni failidel on tavaliselt .py laiend.Pythoni interpretaatordVäljuDesinstallida?Hiljutised failidSoovitatav maksimaalne reapikkus (0 lülitab serva näitamise välja)Rakenda tagasivõetud muudatus uuestiVärskendaTavarežiimPython 3 teises masinas (SSH)Nimeta ümberNimeta '%s' ümberAva käivitumisel kõik eelmise sessiooni failidAsendaAsenda kõikAsenda tab-sümbolid tühikutegaAsenda:Otsi ja asendaTeata probleemidestLuba küsida sõnade lõpetamisi Tab-klahviga KäsurealLuba küsida sõnade lõpetamisi Tab-klahviga redaktorisNõuabNõuab:Taaskäivita interpretaator enne skripti jooksutamistNaaseKäivitaKäivitamineJooksuta / naaseJooksuta käesolev skriptJooksuta käesolev skript terminalisJooksuta kursoriniSkripti käivitamine terminalisSalvestaSalvesta kõik failidSulgemisel salvestamineSalvesta nimega...Salvesta koopia...Salvesta paroolSalvesta %s allaSalvestanSalvestan %sSkoopOtsi PyPI-stOtsingutulemusedOtsinTäpsemalt vaata abiinfost.Vali kõikVali kõikMärgi midagi ja proovi uuestiVali uue virtuaalkeskkonna jaoks tühi kaustVali kui failidialoogid satuvad peaakna tahaValitud kaust pole tühi. Vali mõni muu või tühista.Saada EOF / Soft rebootKäsuridaAva PlotterNäita funktsiooni väljakutseid (raame) eraldi akendesNäita varjatud faileNäita reanumbreidNäita parameetrite infotSuurusSuurus (baitides)LähtekoodKokkupressitud tekst (%d sümbolit)PinuAlustuseks vali vasakult huvipakkuv pakkAlustanAstu tagasiAsti sisseAstu väljaAstu ülePeataPeata/taaskäivita interpretaatorSalvestusruumi infoSalvestusruumSalvestusruum sellel kettal või failisüsteemisKokkuvõteToetaToeta UkrainatMine tavalisse režiimiSünkroniseeri seadme kellSüntaksi stiilTODOSihtkohtSeadme asukohtSeadme mudelSihtkoht:TerminalTerminali emuleerimineVastus onÜlaltoodud esitus on antud ujukomaarvu ligikaudne väärtus. Täpne mälus hoitav väärtus on %s, mis on umbes %sOtsitavat teksti ei leitud!Stiil & fontKaustades on konflikteSee kast on mõeldud Sinu märkmeteks -- tööjuhenditeks, koodijuppideks, ... Tekst salvestub automaatselt ja laetakse uuesti kui Sa avad Thonny uuesti. Võid vabalt selle teksti kustutada, et enda märkmetele ruumi teha.See käsk pole saadaval, kui Thonny jooksutatakse Flatpak-i kauduSee arvutiSee dialoog on mõeldud Thonny pistiprogrammide haldamiseks. Kui soovid installida pakke enda programmide jaoks, siis kasuta 'Tööriistad → Halda lisapakke...'Selles dialoogis näidatakse kõiki pakke, aga uuendada ja desinstallida lubatakse ainult pakke asukohastSelles dialoogis näidatakse ülemtaseme mooduleid järgnevatest kaustadest:See ei paista olevat MicroPythoni või CircuitPythoni pakk. Oled kindel, et soovid seda installida?See on kommentaarSee pakk vajab teistsugust Thonny versiooni:Selle programmi toimimise kohta ei anta mingeid garantiisid. See on avatud tarkvara ja seda võib teatud tingimustel levitada. Vaata täpsemalt https://opensource.org/licenses/MITThonny seadedThonny pistikprogrammidThonny pistikprogramm ilma sõltuvustetaThonny PyhtonLülita kommentaar sisse/väljaTööriistadProovi tuvastada port automaatseltKasutajaliidese režiimKasutajaliidese suurendamineKasutajaliidese stiilÄra vali, kui soovid tavapärast (vähem intuitiivset) esitusviisi.Eemalda kommentaarVõta muudatus tagasiDesinstalliDeinstallin '%s'Ebasobivad sõltuvusedÜlesUuendaUuenda sõltuvusedUuenda või desinstalliUendan '%s'Laadi üles kausta %sKui soovid silumist lõpetada, siis kasuta "Stop" käskuKasuta Tk failidialooge Zenity asemelKasuta seadme kellas lokaalset aegaVäärtusVäärtuse IDMuutujadVersioonide ajaluguInstallitav versioonVaatedVisualiseeri käesolev skript Python Tutor-isHoiatusMida tuleks teha %s failiga, kui sa topeltklõpsad seda Thonny failibrauseris?Millist tüüpi interpretaatoriga peaks Thonny Su koodi jooksutama?Käesoleva interpretaatoriga saad Sa siin pakke ainult vaadata. Installimiseks, kustutamiseks ja uuendamiseks on vaja kasutada muid vahendeidMurra rida (võib olla aeglane)Virtuaalkeskkonna saab aktiveerida ka paremklõpsuga failibrauseris keskkonna kaustal või pyvenv.cfg faililSa peand valima faili!Enne pakihalduri avamist pead oma programmi töö lõpetamaSuuruskõik failidblaa, blaabaitivaba ruumsiiaotsi oma seadme nime või fraase "USB Serial" või "UART"sys.path ei sisalda absoluutset lib kaustapalun ootatoetab põhilisi ANSI värvikoode ja stiileet valida ja installida pakifail (harilikult .whl, .tar.gz või .zip laiendiga)et valida requirements.txt fail ja installida seal näidatud pakid.koguruumsulgemata_stringkasutatud ruumkasutaja "site-packages"virtuaalkeskkond././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1662903732.0 thonny-4.0.1/thonny/locale/et_EE/LC_MESSAGES/thonny.po0000664000175000017500000015116414307362664022075 0ustar00annamaaannamaamsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: et\n" #: thonny/workbench.py:369 msgid "File" msgstr "Fail" #: thonny/workbench.py:370 msgid "Edit" msgstr "Redigeeri" #: thonny/workbench.py:371 msgid "View" msgstr "Vaated" #: thonny/running.py:116 thonny/workbench.py:372 msgid "Run" msgstr "Käivita" #: thonny/workbench.py:373 msgid "Tools" msgstr "Tööriistad" #: thonny/plugins/help/__init__.py:80 thonny/workbench.py:374 msgid "Help" msgstr "Abiinfo" #: thonny/workbench.py:591 msgid "Exit" msgstr "Välju" #: thonny/workbench.py:618 msgid "Decrease font size" msgstr "Vähenda fondi suurust" #: thonny/workbench.py:630 msgid "Focus editor" msgstr "Mine redaktorisse" #: thonny/workbench.py:639 msgid "Focus shell" msgstr "Mine käsureale" #: thonny/workbench.py:650 msgid "Maximize view" msgstr "Suurenda vaade" #: thonny/workbench.py:662 msgid "Full screen" msgstr "Täisekraan" #: thonny/workbench.py:1465 msgid "Program arguments" msgstr "Programmi argumendid" #: thonny/plugins/about.py:24 thonny/plugins/about.py:151 msgid "About Thonny" msgstr "Info Thonny kohta" #: thonny/plugins/about.py:77 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "Loodud\n" "Tartu Ülikoolis, Eestis.\n" "Abiks on olnud\n" "avatud tarkvara kogukond,\n" "Raspberry Pi Foundation\n" "ja Cybernetica AS" #: thonny/plugins/about.py:97 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "Selle programmi toimimise\n" "kohta ei anta mingeid garantiisid.\n" "See on avatud tarkvara ja seda\n" "võib teatud tingimustel levitada.\n" "Vaata täpsemalt\n" "https://opensource.org/licenses/MIT" #: thonny/plugins/about.py:140 msgid "Version history" msgstr "Versioonide ajalugu" #: thonny/plugins/about.py:147 msgid "Report problems" msgstr "Teata probleemidest" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "Ava Juhendaja automaatselt, kui programm annab vea" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "Ava Juhendaja automaatselt, kui tal on hoiatusi Sinu koodi kohta" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "Teosta Pylint kontrolle" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "Teosta MyPy kontrolle" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "Tühistatud kontrollid (üks identifikaator rea kohta)" #: thonny/assistance.py:985 thonny/plugins/assistant_config_page.py:74 msgid "Assistant" msgstr "Juhendaja" #: thonny/plugins/autocomplete.py:522 msgid "Auto-complete" msgstr "Lõpeta sõna automaatselt" #: thonny/plugins/backend_config_page.py:337 msgid "Interpreter" msgstr "Interpretaator" #: thonny/plugins/birdseye_frontend.py:55 msgid "About Birdseye" msgstr "Birdseye kohta" #: thonny/plugins/birdseye_frontend.py:56 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye on Pythoni silur, mis tuleb eraldi paigaldada.\n" "\n" "Kas soovid avada vastava abiinfo lehe, et rohkem teada saada?" #: thonny/plugins/birdseye_frontend.py:84 msgid "Debug current script (birdseye)" msgstr "Silu käesolevat skripti (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "Lülita kommentaar sisse/välja" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "Kommenteeri" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "Eemalda kommentaar" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "Võta muudatus tagasi" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "Rakenda tagasivõetud muudatus uuesti" #: thonny/base_file_browser.py:724 thonny/plugins/common_editing_commands.py:49 #: thonny/ui_utils.py:2295 msgid "Cut" msgstr "Lõika" #: thonny/base_file_browser.py:725 thonny/plugins/common_editing_commands.py:61 #: thonny/ui_utils.py:2296 msgid "Copy" msgstr "Kopeeri" #: thonny/base_file_browser.py:727 thonny/base_file_browser.py:733 #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2297 msgid "Paste" msgstr "Kleebi" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "Vali kõik" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1401 msgid "Run to cursor" msgstr "Jooksuta kursorini" #: thonny/plugins/debugger.py:982 msgid "Can't close yet" msgstr "Ei saa veel sulgeda" #: thonny/plugins/debugger.py:983 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "Kui soovid silumist lõpetada, siis kasuta \"Stop\" käsku" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "Kinnita kasutaja aknad" #: thonny/plugins/editor_config_page.py:20 msgid "Highlight matching names" msgstr "Too esile samad nimed" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight local variables" msgstr "Too esile lokaalsed muutujad" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight parentheses" msgstr "Too esile sulupaarid" #: thonny/plugins/editor_config_page.py:32 msgid "Highlight syntax elements" msgstr "Tee kood värviliseks" #: thonny/plugins/editor_config_page.py:36 msgid "Highlight current line (requires reopening the editor)" msgstr "Too esile jooksev rida" #: thonny/plugins/editor_config_page.py:73 msgid "Show line numbers" msgstr "Näita reanumbreid" #: thonny/plugins/editor_config_page.py:76 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "Soovitatav maksimaalne reapikkus\n" "(0 lülitab serva näitamise välja)" #: thonny/plugins/editor_config_page.py:104 msgid "Editor" msgstr "Redaktor" #: thonny/plugins/event_logging.py:207 msgid "Export usage logs..." msgstr "Ekspordi kasutuslogi" #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "Sündmused" #: thonny/plugins/files.py:609 msgid "Files" msgstr "Failid" #: thonny/plugins/find_replace.py:60 thonny/plugins/find_replace.py:437 msgid "Find & Replace" msgstr "Otsi ja asenda" #: thonny/plugins/find_replace.py:66 msgid "Find:" msgstr "Otsi:" #: thonny/plugins/find_replace.py:87 msgid "Replace with:" msgstr "Asenda:" #: thonny/plugins/find_replace.py:105 msgid "Case sensitive" msgstr "Tõstutundlik" #: thonny/plugins/find_replace.py:112 msgid "Up" msgstr "Üles" #: thonny/plugins/find_replace.py:116 msgid "Down" msgstr "Alla" #: thonny/plugins/find_replace.py:125 msgid "Find" msgstr "Otsi" #: thonny/plugins/find_replace.py:135 msgid "Replace" msgstr "Asenda" #: thonny/plugins/find_replace.py:143 msgid "Replace+Find" msgstr "Otsi ja asenda" #: thonny/plugins/find_replace.py:153 msgid "Replace all" msgstr "Asenda kõik" #: thonny/plugins/find_replace.py:253 msgid "Enter string to be replaced." msgstr "Sisesta asendatav sõne" #: thonny/plugins/find_replace.py:338 msgid "The specified text was not found!" msgstr "Otsitavat teksti ei leitud!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "Luba korraga ainult üks Thonny" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "Ava käivitumisel kõik eelmise sessiooni failid" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "Keela teavitushelid" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "Fondi suuruse režiim" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "Kuhja režiim on sees.\n" "Väljalülitamiseks sulge Kuhja vaade" #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "Kuhi" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "Keel" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "See kast on mõeldud Sinu märkmeteks -- tööjuhenditeks, koodijuppideks, ...\n" "\n" "Tekst salvestub automaatselt ja laetakse uuesti kui Sa avad Thonny uuesti.\n" "\n" "Võid vabalt selle teksti kustutada, et enda märkmetele ruumi teha." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "Märkmed" #: thonny/plugins/object_inspector.py:116 msgid "Previous object" msgstr "Eelmine objekt" #: thonny/plugins/object_inspector.py:119 msgid "Next object" msgstr "Järgmine objekt" #: thonny/plugins/object_inspector.py:733 msgid "Object inspector" msgstr "Objektivaatur" #: thonny/plugins/outline.py:148 msgid "Outline" msgstr "Struktuur" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "Pygame Zero režiim" #: thonny/plugins/pip_gui.py:79 msgid "Uninstall" msgstr "Desinstalli" #: thonny/editors.py:685 thonny/plugins/pip_gui.py:251 thonny/ui_utils.py:491 #: thonny/ui_utils.py:1872 thonny/workdlg.py:162 msgid "Close" msgstr "Sulge" #: thonny/plugins/pip_gui.py:397 msgid "Click " msgstr "Klõpsa " #: thonny/plugins/pip_gui.py:398 thonny/plugins/pip_gui.py:409 msgid "here" msgstr "siia" #: thonny/plugins/pip_gui.py:76 msgid "Upgrade" msgstr "Uuenda" #: thonny/plugins/esp/__init__.py:349 #: thonny/plugins/micropython/uf2dialog.py:410 thonny/plugins/pip_gui.py:73 msgid "Install" msgstr "Installi" #: thonny/plugins/pip_gui.py:535 msgid "Could not find the package from PyPI." msgstr "Ei leidnud PyPI-st sellist pakki" #: thonny/plugins/pip_gui.py:557 msgid "Latest stable version" msgstr "Viimane stabiilne versioon" #: thonny/plugins/pip_gui.py:559 msgid "Latest version" msgstr "Viimane versioon" #: thonny/plugins/pip_gui.py:561 msgid "Summary" msgstr "Kokkuvõte" #: thonny/plugins/pip_gui.py:563 msgid "Author" msgstr "Autor" #: thonny/plugins/pip_gui.py:565 msgid "Homepage" msgstr "Koduleht" #: thonny/plugins/pip_gui.py:567 msgid "Bugtracker" msgstr "Vigade register" #: thonny/plugins/pip_gui.py:569 msgid "Documentation" msgstr "Dokumentatsioon" #: thonny/plugins/pip_gui.py:571 msgid "PyPI page" msgstr "PyPI leht" #: thonny/plugins/pip_gui.py:611 msgid "Requires" msgstr "Nõuab" #: thonny/plugins/pip_gui.py:743 msgid "Really uninstall?" msgstr "Desinstallida?" #: thonny/plugins/pip_gui.py:748 msgid "Are you sure you want to uninstall it?" msgstr "Kas oled kindel, et soovid seda desinstallida?" #: thonny/plugins/variables.py:22 msgid "Back to\n" "current frame" msgstr "Tagasi\n" "aktiivsesse raami" #: thonny/plugins/variables.py:80 thonny/plugins/variables.py:82 #: thonny/plugins/variables.py:145 msgid "Variables" msgstr "Muutujad" #: thonny/base_file_browser.py:1572 msgid "This computer" msgstr "See arvuti" #: thonny/base_file_browser.py:644 msgid "Refresh" msgstr "Värskenda" #: thonny/base_file_browser.py:653 msgid "Focus into" msgstr "Mine sisse" #: thonny/base_file_browser.py:1407 thonny/base_file_browser.py:1419 #: thonny/plugins/autocomplete.py:300 thonny/plugins/highlight_names.py:87 msgid "Error" msgstr "Viga" #: thonny/base_file_browser.py:1407 thonny/base_file_browser.py:1419 msgid "You need to select a file!" msgstr "Sa peand valima faili!" #: thonny/base_file_browser.py:1423 msgid "Overwrite?" msgstr "Kirjutada üle?" #: thonny/base_file_browser.py:1423 msgid "Do you want to overwrite '%s' ?" msgstr "Kas soovid '%s' üle kirjutada?" #: thonny/editors.py:650 thonny/editors.py:652 msgid "New" msgstr "Uus" #: thonny/editors.py:663 msgid "Open..." msgstr "Ava..." #: thonny/editors.py:665 msgid "Load" msgstr "Lae" #: thonny/editors.py:674 msgid "Recent files" msgstr "Hiljutised failid" #: thonny/editors.py:696 thonny/ui_utils.py:493 msgid "Close all" msgstr "Sulge kõik" #: thonny/editors.py:706 thonny/editors.py:708 msgid "Save" msgstr "Salvesta" #: thonny/editors.py:731 msgid "Save as..." msgstr "Salvesta nimega..." #: thonny/editors.py:742 msgid "Save copy..." msgstr "Salvesta koopia..." #: thonny/config_ui.py:18 msgid "Thonny options" msgstr "Thonny seaded" #: thonny/running.py:115 msgid "Run current script" msgstr "Jooksuta käesolev skript" #: thonny/running.py:146 msgid "Run current script in terminal" msgstr "Jooksuta käesolev skript terminalis" #: thonny/running.py:159 msgid "Stop/Restart backend" msgstr "Peata/taaskäivita interpretaator" #: thonny/running.py:160 msgid "Stop" msgstr "Peata" #: thonny/running.py:171 msgid "Interrupt execution" msgstr "Katkesta programm" #: thonny/running.py:184 msgid "Send EOF / Soft reboot" msgstr "Saada EOF / Soft reboot" #: thonny/running.py:195 msgid "Disconnect" msgstr "Ühenda lahti" #: thonny/plugins/cpython_frontend/cp_front.py:269 msgid "Python interpreters" msgstr "Pythoni interpretaatord" #: thonny/editors.py:36 thonny/plugins/cpython_frontend/cp_front.py:270 #: thonny/plugins/pip_gui.py:789 thonny/plugins/pip_gui.py:802 msgid "all files" msgstr "kõik failid" #: thonny/plugins/cpython_frontend/cp_front.py:298 msgid "Select empty directory for new virtual environment" msgstr "Vali uue virtuaalkeskkonna jaoks tühi kaust" #: thonny/plugins/cpython_frontend/cp_front.py:305 msgid "Bad directory" msgstr "Halb kaust" #: thonny/plugins/cpython_frontend/cp_front.py:306 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "Valitud kaust pole tühi.\n" "Vali mõni muu või tühista." #: thonny/plugins/cpython_frontend/cp_front.py:323 msgid "Creating virtual environment" msgstr "Loon virtuaalkeskkonda" #: thonny/shell.py:101 msgid "Clear shell" msgstr "Puhasta käsurida" #: thonny/shell.py:185 msgid "Plotter" msgstr "Plotter" #: thonny/shell.py:317 msgid "Clear" msgstr "Puhasta" #: thonny/shell.py:330 msgid "Show Plotter" msgstr "Ava Plotter" #: thonny/shell.py:1659 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "Parema jõudluse nimel ei näidata Käsureal väga pikki ridu\n" "(vaata Tööriistad => Seaded => Käsurida).\n" "Siin saad Sa algset tekstifragmenti täielikult näha." #: thonny/shell.py:1670 msgid "Wrap text (may be slow)" msgstr "Murra rida (võib olla aeglane)" #: thonny/ui_utils.py:1867 msgid "Copy to clipboard" msgstr "Kopeeri lõikepuhvrisse" #: thonny/shell.py:1712 msgid "Squeezed text (%d characters)" msgstr "Kokkupressitud tekst (%d sümbolit)" #: thonny/shell.py:1882 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "Plotter visualiseerib käsureale\n" "prinditud numbrijadasid." #: thonny/shell.py:1884 msgid "See Help for details." msgstr "Täpsemalt vaata abiinfost." #: thonny/ui_utils.py:492 msgid "Close others" msgstr "Sulge ülejäänud" #: thonny/ui_utils.py:1722 msgid "Copying" msgstr "Kopeerin" #: thonny/ui_utils.py:1725 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "Kopeerin\n" " %s\n" "=> \n" " %s" #: thonny/base_file_browser.py:1378 thonny/config_ui.py:42 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:290 thonny/plugins/pip_gui.py:1256 #: thonny/ui_utils.py:157 thonny/ui_utils.py:1733 thonny/ui_utils.py:1819 #: thonny/workdlg.py:164 thonny/workdlg.py:209 msgid "Cancel" msgstr "Tühista" #: thonny/base_file_browser.py:1369 thonny/config_ui.py:41 thonny/export.py:25 #: thonny/plugins/about.py:111 thonny/plugins/backend_config_page.py:285 #: thonny/ui_utils.py:154 thonny/ui_utils.py:1816 thonny/workdlg.py:206 msgid "OK" msgstr "Sobib" #: thonny/ui_utils.py:2301 msgid "Select All" msgstr "Vali kõik" #: thonny/plugins/shell_config_page.py:82 thonny/shell.py:149 #: thonny/workbench.py:162 msgid "Shell" msgstr "Käsurida" #: thonny/workbench.py:601 msgid "Options..." msgstr "Seaded..." #: thonny/workbench.py:608 msgid "Increase font size" msgstr "Suurenda kirja suurust" #: thonny/workbench.py:673 msgid "Change font size" msgstr "Muuda kirja suurust" #: thonny/workbench.py:674 msgid "Zoom" msgstr "Suurus" #: thonny/workbench.py:683 msgid "Exit Thonny" msgstr "Välju Thonnyst" #: thonny/workbench.py:686 msgid "Quit" msgstr "Välju" #: thonny/workbench.py:1244 thonny/workbench.py:1252 msgid "Overwriting theme '%s'" msgstr "Kirjutan üle teemat nimega '%s'" #: thonny/workbench.py:1436 msgid "Program arguments:" msgstr "Programmi argumendid:" #: thonny/workbench.py:1490 msgid "Regular mode" msgstr "Tavarežiim" #: thonny/workbench.py:1491 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "Seaded on muudetud. Tavarežiimis alustamiseks taaskäivita Thonny.\n" "\n" "(Vaata 'Tööriistad → Seaded → Üldine', kui Sa mõtled hiljem ümber.)" #: thonny/plugins/ast_view.py:212 msgid "Program tree" msgstr "Programmipuu" #: thonny/plugins/debugger.py:1283 msgid "Resume" msgstr "Naase" #: thonny/plugins/debugger.py:1299 msgid "Run / resume" msgstr "Jooksuta / naase" #: thonny/plugins/debugger.py:1314 msgid "Debug current script" msgstr "Silu käesolevat skripti" #: thonny/plugins/debugger.py:1316 msgid "Debug" msgstr "Silu" #: thonny/plugins/debugger.py:1327 msgid "Debug current script (nicer)" msgstr "Silu käesolevat skripti (ägedam)" #: thonny/plugins/debugger.py:1339 msgid "Debug current script (faster)" msgstr "Silu käesolevat skripti (kiirem)" #: thonny/plugins/debugger.py:1350 msgid "Step over" msgstr "Astu üle" #: thonny/plugins/debugger.py:1352 msgid "Over" msgstr "Üle" #: thonny/plugins/debugger.py:1363 msgid "Step into" msgstr "Asti sisse" #: thonny/plugins/debugger.py:1365 msgid "Into" msgstr "Sisse" #: thonny/plugins/debugger.py:1376 msgid "Step out" msgstr "Astu välja" #: thonny/plugins/debugger.py:1378 msgid "Out" msgstr "Välja" #: thonny/plugins/debugger.py:1413 msgid "Step back" msgstr "Astu tagasi" #: thonny/plugins/debugger.py:1415 msgid "Back" msgstr "Tagasi" #: thonny/plugins/debugger.py:1421 msgid "Stack" msgstr "Pinu" #: thonny/plugins/debugger.py:1422 msgid "Exception" msgstr "Erind" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "Logi kasutussündmusi" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "Arendusrežiim (annab detailsemat diagnostilised logid)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "Kasutajaliidese režiim" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "Kasutajaliidese suurendamine" #: thonny/plugins/general_config_page.py:114 msgid "NB! Restart Thonny after changing these options!" msgstr "NB! Need seaded rakenduvad peale Thonny taaskäivitamist" #: thonny/plugins/general_config_page.py:148 msgid "General" msgstr "Üldine" #: thonny/plugins/pip_gui.py:142 msgid "INSTALL" msgstr "INSTALLI" #: thonny/plugins/pip_gui.py:367 msgid "Browse the packages" msgstr "Vaata pakke" #: thonny/plugins/pip_gui.py:370 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "Käesoleva interpretaatoriga saad Sa siin pakke ainult vaadata.\n" "Installimiseks, kustutamiseks ja uuendamiseks on vaja kasutada\n" "muid vahendeid" #: thonny/plugins/pip_gui.py:378 msgid "Packages' directory" msgstr "Pakkide kaust" #: thonny/plugins/pip_gui.py:382 msgid "Install from PyPI" msgstr "Installi PyPI-st" #: thonny/plugins/pip_gui.py:385 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "Kui Sa ei tea, kust pakki saada, siis on mõistlik otsida\n" "seda Pythoni pakiregistrist (PyPI), Alustuseks sisest\n" "paki nimi otsingukasti ja vajuta ENTER." #: thonny/plugins/pip_gui.py:402 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "et valida requirements.txt fail ja installida seal näidatud pakid." #: thonny/plugins/pip_gui.py:408 msgid "Click" msgstr "Klõpsa" #: thonny/plugins/pip_gui.py:413 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "et valida ja installida pakifail (harilikult .whl, .tar.gz või .zip laiendiga)" #: thonny/plugins/pip_gui.py:420 msgid "Upgrade or uninstall" msgstr "Uuenda või desinstalli" #: thonny/plugins/pip_gui.py:422 msgid "Start by selecting the package from the left." msgstr "Alustuseks vali vasakult huvipakkuv pakk" #: thonny/plugins/pip_gui.py:410 msgid "Target:" msgstr "Sihtkoht:" #: thonny/plugins/pip_gui.py:414 msgid "virtual environment" msgstr "virtuaalkeskkond" #: thonny/plugins/pip_gui.py:412 msgid "user site packages" msgstr "kasutaja \"site-packages\"" #: thonny/plugins/pip_gui.py:430 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "Selles dialoogis näidatakse kõiki pakke, aga uuendada ja desinstallida\n" "lubatakse ainult pakke asukohast" #: thonny/plugins/pip_gui.py:440 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "Uued pakid installitakse ka sellesse kausta. Teisi asukohti\n" "tuleb hallata teiste vahenditega" #: thonny/plugins/pip_gui.py:485 msgid "Installed version:" msgstr "Installitud versioon:" #: thonny/plugins/pip_gui.py:487 msgid "Installed to:" msgstr "Installimise asukoht:" #: thonny/plugins/pip_gui.py:538 msgid "Please check your spelling!" msgstr "Kontrolli kas kirjutasid paki nime õigesti!" #: thonny/plugins/pip_gui.py:542 msgid "Could not find the package info from PyPI." msgstr "Ei leidnud sellist pakki PyPI-st" #: thonny/plugins/pip_gui.py:544 thonny/plugins/pip_gui.py:1326 msgid "Error code:" msgstr "Veakood:" #: thonny/plugins/pip_gui.py:689 msgid "Can't find package name from the list:" msgstr "Ei leia paki nime nimekirjast:" #: thonny/plugins/pip_gui.py:744 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "Pakk '{}' on vajalik teiste pakkide installimiseks ja uuendamisks" #: thonny/plugins/pip_gui.py:789 msgid "Package" msgstr "Pakk" #: thonny/plugins/pip_gui.py:902 msgid "Manage packages for %s" msgstr "Halda %s pakke" #: thonny/editors.py:579 thonny/plugins/micropython/pip_gui.py:23 #: thonny/plugins/pip_gui.py:953 msgid "Confirmation" msgstr "Kinnitus" #: thonny/plugins/pip_gui.py:954 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "Paistab, et soovid installida Thonny pistikprogrammi.\n" "Õige oleks seda teha 'Tööriistad → Halda pistikprogramme' alt.\n" "\n" "Oled sa kindel, et tahad installida %s siin?" #: thonny/plugins/pip_gui.py:1059 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "NB! Mõni muu versioon võib selle Thonny versiooniga klappida. \n" "Klõpsa '...' nupule versiooni valimiseks." #: thonny/plugins/pip_gui.py:1067 msgid "Thonny plugin without requirements" msgstr "Thonny pistikprogramm ilma sõltuvusteta" #: thonny/plugins/pip_gui.py:1083 msgid "Unsuitable requirements" msgstr "Ebasobivad sõltuvused" #: thonny/plugins/pip_gui.py:1084 msgid "This package requires different Thonny version:" msgstr "See pakk vajab teistsugust Thonny versiooni:" #: thonny/plugins/pip_gui.py:1088 msgid "If you still want it, then please install it from the command line." msgstr "Kui sa ikkagi tahad seda, siis installi see süsteemi käsurealt.." #: thonny/plugins/pip_gui.py:1125 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "NB! Äsja installitud pistikprogramm rakendub alles peale Thonny taaskäivitamist." #: thonny/plugins/pip_gui.py:1135 msgid "Thonny plug-ins" msgstr "Thonny pistikprogrammid" #: thonny/plugins/pip_gui.py:1171 msgid "Advanced install / upgrade / downgrade" msgstr "Täpsem install / versiooni valik" #: thonny/plugins/pip_gui.py:1180 msgid "Desired version" msgstr "Soovitud versioon" #: thonny/plugins/pip_gui.py:1239 msgid "Upgrade dependencies" msgstr "Uuenda sõltuvused" #: thonny/plugins/pip_gui.py:1324 msgid "Requires:" msgstr "Nõuab:" #: thonny/plugins/pip_gui.py:1328 msgid "Error:" msgstr "Viga:" #: thonny/plugins/pip_gui.py:1541 msgid "Manage packages..." msgstr "Halda lisapakke..." #: thonny/plugins/pip_gui.py:1547 msgid "Manage plug-ins..." msgstr "Halda pistikprogramme..." #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "Ava Taasesitaja..." #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "Muuda jooksutamisel / silumisel automaatselt jooksvat kausta" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "Näita funktsiooni väljakutseid (raame) eraldi akendes" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "Ära vali, kui soovid tavapärast (vähem intuitiivset) esitusviisi." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "Ava ja sulge Pinu vaade automaatselt" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "Avab Pinu vaate esimesel funktsiooni väljakutsel ja sulgeb, kui programm jõuab tagasi pearaami" #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "Luba teegifunktsioonide sisse astumine (väljaspool skripti kausta)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "Võib teha silumise aeglasemaks." #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "Eelistatud silur" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(rakendatakse \"Silur\" tööriistariba nupu klõpsamisel)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "Birdseye port" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(taaskäivita Thonny peale selle muutmist)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "Käivitamine" #: thonny/plugins/shell_config_page.py:26 msgid "Terminal emulation" msgstr "Terminali emuleerimine" #: thonny/plugins/shell_config_page.py:28 msgid "supports basic ANSI-colors and styles" msgstr "toetab põhilisi ANSI värvikoode ja stiile" #: thonny/plugins/shell_config_page.py:40 msgid "Maximum number of lines to keep." msgstr "Maksimaalne ridade arv." #: thonny/plugins/shell_config_page.py:42 msgid "NB! Large values may cause poor performance!" msgstr "NB! Suurte väärtustega võib jõudlus halveneda!" #: thonny/plugins/shell_config_page.py:58 msgid "Maximum length of line fragments before squeezing" msgstr "Maksimaalne realõigu pikkus enne \"kokkupigistamist\"" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "Skripti käivitamine terminalis" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "Näita peale programmi lõppu Pythoni käsurida" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "Hoia terminali aken avatuna ka peale Pythoni protsessi lõppemist" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "NB! Automaatset sulgemist tuleb lubada Terminali seadetes\n" "(Profiles → Shell → When the shell exits)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "Terminal" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "Kasutajaliidese stiil" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "Süntaksi stiil" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "Redaktori font" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "Sisend/väljund font" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "Eelvaade" #: thonny/plugins/theme_and_font_config_page.py:151 msgid "This is a comment" msgstr "See on kommentaar" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "The answer is" msgstr "Vastus on" #: thonny/plugins/theme_and_font_config_page.py:158 msgid "unclosed_string" msgstr "sulgemata_string" #: thonny/plugins/theme_and_font_config_page.py:160 msgid "blah, blah" msgstr "blaa, blaa" #: thonny/plugins/theme_and_font_config_page.py:184 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "NB! Mõned stiilielemendid muutuvad alles peale Thonny taaskäivitamist!" #: thonny/plugins/theme_and_font_config_page.py:223 msgid "Enter an integer" msgstr "Sisesta täisarv" #: thonny/plugins/theme_and_font_config_page.py:236 msgid "Theme & Font" msgstr "Stiil & font" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "Ava Thonny programmikaust..." #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "Ava Thonny andmekaust..." #: thonny/plugins/help/__init__.py:70 msgid "Home" msgstr "Avaleht" #: thonny/plugins/help/__init__.py:81 msgid "Help contents" msgstr "Abiinfo sisukord" #: thonny/plugins/micropython/mp_front.py:303 msgid "CircuitPython device" msgstr "CircuitPythoni seade" #: thonny/plugins/micropython/mp_front.py:307 msgid "MicroPython device" msgstr "MicroPythoni seade" #: thonny/plugins/micropython/mp_front.py:547 msgid "Connect your device to the computer and select corresponding port below" msgstr "Ühenda seade arvutiga ja vali allpoolt selle port" #: thonny/plugins/micropython/mp_front.py:550 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "otsi oma seadme nime või fraase \"USB Serial\" või \"UART\"" #: thonny/plugins/micropython/mp_front.py:552 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "Kui sa ei leia seda, siis pead võibolla installima sobiva USB draiveri." #: thonny/plugins/micropython/mp_front.py:444 msgid "Port" msgstr "Port" #: thonny/plugins/micropython/mp_front.py:454 msgid "Try to detect port automatically" msgstr "Proovi tuvastada port automaatselt" #: thonny/plugins/micropython/__init__.py:25 msgid "MicroPython (generic)" msgstr "MicroPython (üldine)" #: thonny/plugins/printing/__init__.py:98 msgid "Print..." msgstr "Prindi..." #: thonny/plugins/system_shell/__init__.py:63 msgid "Open system shell..." msgstr "Ava süsteemi käsurida / terminal" #: thonny/plugins/backend_config_page.py:110 msgid "Details" msgstr "Detailid" #: thonny/plugins/pip_gui.py:395 msgid "Install from requirements file" msgstr "Installi sõltuvusfaili järgi" #: thonny/plugins/pip_gui.py:407 msgid "Install from local file" msgstr "Installi lokaalsest failist" #: thonny/plugins/pip_gui.py:1118 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "See dialoog on mõeldud Thonny pistiprogrammide haldamiseks.\n" "Kui soovid installida pakke enda programmide jaoks, siis kasuta 'Tööriistad → Halda lisapakke...'" #: thonny/plugins/circuitpython/__init__.py:10 msgid "CircuitPython (generic)" msgstr "CircuitPython (üldine)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "Suurenda ridade taanet" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "Vähenda ridade taanet" #: thonny/workbench.py:1479 msgid "Switch to\n" "regular\n" "mode" msgstr "Mine\n" "tavalisse\n" "režiimi" #: thonny/plugins/microbit/__init__.py:58 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "Veendu, et MicroPython oleks su micro:bit-ile installitud." #: thonny/plugins/microbit/__init__.py:60 msgid "Don't forget that main.py only works without embedded main script." msgstr "Ära unusta, et main.py toimib ainult siis kui MicroPython on ilma peaskriptita." #: thonny/plugins/micropython/uf2dialog.py:44 msgid "please wait" msgstr "palun oota" #: thonny/misc_utils.py:151 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "Ei leia draivi nimega '%s'. Kas soovid selle ise valida?" #: thonny/misc_utils.py:154 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "Leidsin mitu draivi nimega '%s'. Kas soovid ühe neist ise valida?" #: thonny/misc_utils.py:170 msgid "Can't find suitable disk" msgstr "Ei leia sobivat draivi." #: thonny/base_file_browser.py:290 msgid "%d items" msgstr "%d üksust" #: thonny/base_file_browser.py:739 msgid "Move to Trash" msgstr "Liiguta Prügikasti" #: thonny/base_file_browser.py:742 msgid "Delete" msgstr "Kustuta" #: thonny/base_file_browser.py:721 thonny/base_file_browser.py:874 msgid "New directory" msgstr "Uus kaust" #: thonny/base_file_browser.py:745 msgid "Properties" msgstr "Omadused" #: thonny/base_file_browser.py:747 msgid "Storage space" msgstr "Salvestusruum" #: thonny/base_file_browser.py:757 msgid "Path" msgstr "Tee" #: thonny/base_file_browser.py:759 msgid "Directory properties" msgstr "Kausta omadused" #: thonny/base_file_browser.py:761 msgid "File properties" msgstr "Faili omadused" #: thonny/base_file_browser.py:763 msgid "bytes" msgstr "baiti" #: thonny/base_file_browser.py:766 msgid "Size" msgstr "Suurus" #: thonny/base_file_browser.py:93 thonny/base_file_browser.py:777 msgid "Modified" msgstr "Muudetud" #: thonny/base_file_browser.py:838 msgid "Deleting %s" msgstr "Kustutan %s" #: thonny/editors.py:260 msgid "Loading" msgstr "Laadin" #: thonny/editors.py:389 msgid "Saving" msgstr "Salvestan" #: thonny/plugins/files.py:219 msgid "Upload to %s" msgstr "Laadi üles kausta %s" #: thonny/plugins/files.py:420 msgid "Downloading %s to %s" msgstr "Laadi %s alla kausta %s" #: thonny/plugins/files.py:326 msgid "Download to %s" msgstr "Laadi alla kausta %s" #: thonny/base_file_browser.py:646 msgid "Open in system file manager" msgstr "Ava süsteemi failihalduris" #: thonny/base_file_browser.py:674 msgid "Hide hidden files" msgstr "Peida varjatud failid" #: thonny/base_file_browser.py:674 msgid "Show hidden files" msgstr "Näita varjatud faile" #: thonny/base_file_browser.py:657 msgid "Open in Thonny" msgstr "Ava Thonnys" #: thonny/base_file_browser.py:688 msgid "Open in system default app" msgstr "Ava süsteemi vaikerakendusega" #: thonny/base_file_browser.py:669 thonny/base_file_browser.py:696 msgid "Configure %s files" msgstr "Seadista %s failid" #: thonny/base_file_browser.py:697 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "Mida tuleks teha %s failiga, kui sa topeltklõpsad seda Thonny failibrauseris?" #: thonny/base_file_browser.py:1254 thonny/editors.py:979 thonny/editors.py:981 msgid "Deleting" msgstr "Kustutan" #: thonny/base_file_browser.py:1261 msgid "Creating directory" msgstr "Loon kausta" #: thonny/editors.py:258 msgid "Loading %s" msgstr "Laadin %s" #: thonny/editors.py:384 msgid "Saving to %s" msgstr "Salvestan %s" #: thonny/editors.py:720 thonny/editors.py:722 msgid "Save All files" msgstr "Salvesta kõik failid" #: thonny/plugins/backend_config_page.py:340 thonny/workbench.py:877 msgid "Configure interpreter..." msgstr "Seadista interpretaator..." #: thonny/workbench.py:1589 msgid "Device" msgstr "Seade" #: thonny/workdlg.py:193 msgid "Cancelling" msgstr "Tühistan" #: thonny/workdlg.py:220 msgid "Starting" msgstr "Alustan" #: thonny/plugins/backend_config_page.py:251 msgid "Authentication" msgstr "Autentimine" #: thonny/plugins/backend_config_page.py:253 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "Sisesta oma privaatvõtme parool {} jaoks" #: thonny/plugins/backend_config_page.py:256 msgid "Enter your password for\n" "{}" msgstr "Sisesta parool {} jaoks" #: thonny/plugins/object_inspector.py:487 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "Ülaltoodud esitus on antud ujukomaarvu ligikaudne väärtus. Täpne mälus hoitav väärtus on %s, mis on umbes %s" #: thonny/plugins/pip_gui.py:645 msgid "Search results" msgstr "Otsingutulemused" #: thonny/plugins/pip_gui.py:646 msgid "Searching" msgstr "Otsin" #: thonny/plugins/pip_gui.py:728 thonny/plugins/pip_gui.py:817 msgid "Installing '%s'" msgstr "Installin '%s'" #: thonny/plugins/pip_gui.py:734 msgid "Upgrading '%s'" msgstr "Uendan '%s'" #: thonny/plugins/pip_gui.py:741 msgid "Uninstalling '%s'" msgstr "Deinstallin '%s'" #: thonny/plugins/pip_gui.py:755 msgid "Installing" msgstr "Installin" #: thonny/plugins/pip_gui.py:1502 msgid "Package manager is not available for this interpreter" msgstr "Pakihaldur pole selle interpretaatori jaoks kättesaadav" #: thonny/base_file_browser.py:1205 thonny/plugins/pip_gui.py:1516 msgid "Not supported" msgstr "Pole toetatud" #: thonny/plugins/micropython/pip_gui.py:100 thonny/plugins/pip_gui.py:1521 msgid "Not available" msgstr "Pole kättesaadav" #: thonny/plugins/pip_gui.py:1522 msgid "You need to stop your program before launching the package manager." msgstr "Enne pakihalduri avamist pead oma programmi töö lõpetama" #: thonny/plugins/shell_config_page.py:73 msgid "Open evaluated values in Object inspector" msgstr "Ava väärtused Objektivaaturis" #: thonny/plugins/cpython_frontend/cp_front.py:209 msgid "Python executable" msgstr "Pythoni käivitusfail" #: thonny/plugins/cpython_frontend/cp_front.py:232 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "NB! Faili valimise nupp ei pruugi korralikult toimida, kui valida\n" "käivitusfaile virtuaalkeskkonnas. Sel juhul vali hoopis 'activate' \n" "skript (või sisesta failitee sisestuskasti käsitsi)!" #: thonny/plugins/cpython_ssh/__init__.py:17 msgid "Remote Python 3 (SSH)" msgstr "Python 3 teises masinas (SSH)" #: thonny/plugins/micropython/mp_front.py:313 msgid "Not connected" msgstr "Pole ühendatud" #: thonny/plugins/micropython/mp_front.py:521 msgid "Advanced options" msgstr "Lisaseaded" #: thonny/plugins/micropython/mp_front.py:547 msgid "Install or update firmware" msgstr "Paigalda või uuenda püsivara" #: thonny/plugins/micropython/__init__.py:36 msgid "MicroPython (local)" msgstr "MicroPython (lokaalne)" #: thonny/plugins/micropython/__init__.py:47 msgid "MicroPython (SSH)" msgstr "MicroPython (SSH)" #: thonny/plugins/micropython/pip_gui.py:77 msgid "Scope" msgstr "Skoop" #: thonny/plugins/micropython/pip_gui.py:90 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "Selles dialoogis näidatakse ülemtaseme mooduleid järgnevatest kaustadest:" #: thonny/plugins/micropython/pip_gui.py:99 msgid "New packages will be installed to" msgstr "Uued pakid installitakse kausta" #: thonny/plugins/micropython/pip_gui.py:102 msgid "no absolute lib directory in sys.path" msgstr "sys.path ei sisalda absoluutset lib kausta" #: thonny/plugins/micropython/uf2dialog.py:39 msgid "Version to be installed" msgstr "Installitav versioon" #: thonny/plugins/micropython/uf2dialog.py:47 msgid "Target device location" msgstr "Seadme asukoht" #: thonny/plugins/micropython/uf2dialog.py:58 msgid "Target device model" msgstr "Seadme mudel" #: thonny/plugins/micropython/uf2dialog.py:146 msgid "Please wait" msgstr "Palun oota" #: thonny/plugins/pip_gui.py:70 msgid "Search on PyPI" msgstr "Otsi PyPI-st" #: thonny/base_file_browser.py:689 msgid "Open in Thonny's text editor" msgstr "Ava Thonny tekstiredaktoris" #: thonny/base_file_browser.py:342 msgid "Storage space on this drive or filesystem" msgstr "Salvestusruum sellel kettal või failisüsteemis" #: thonny/base_file_browser.py:343 msgid "total space" msgstr "koguruum" #: thonny/base_file_browser.py:345 msgid "used space" msgstr "kasutatud ruum" #: thonny/base_file_browser.py:346 msgid "free space" msgstr "vaba ruum" #: thonny/base_file_browser.py:353 msgid "Storage info" msgstr "Salvestusruumi info" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "Asenda tab-sümbolid tühikutega" #: thonny/plugins/editor_config_page.py:33 msgid "Highlight tab characters" msgstr "Too tab-sümbolid esile" #: thonny/plugins/editor_config_page.py:68 msgid "Indent with tab characters (not recommended for Python)" msgstr "Taanda tab-sümbolitega (mittesoovitav Pythoni koodis)" #: thonny/base_file_browser.py:91 thonny/memory.py:63 msgid "Name" msgstr "Nimi" #: thonny/base_file_browser.py:95 msgid "Size (bytes)" msgstr "Suurus (baitides)" #: thonny/base_file_browser.py:875 msgid "Enter name for new directory under\n" "%s" msgstr "Sisesta uue kausta nimi \n" "(%s all)" #: thonny/base_file_browser.py:898 msgid "Nothing selected" msgstr "Midagi pole märgitud" #: thonny/base_file_browser.py:898 msgid "Select an item and try again!" msgstr "Märgi midagi ja proovi uuesti" #: thonny/base_file_browser.py:1325 msgid "Open from %s" msgstr "Ava asukohast %s" #: thonny/base_file_browser.py:1328 msgid "Save to %s" msgstr "Salvesta %s alla" #: thonny/base_file_browser.py:1347 msgid "File name:" msgstr "Faili nimi:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:539 #: thonny/plugins/object_inspector.py:618 msgid "Value ID" msgstr "Väärtuse ID" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:540 #: thonny/plugins/object_inspector.py:619 msgid "Value" msgstr "Väärtus" #: thonny/plugins/backend_config_page.py:274 msgid "Save password" msgstr "Salvesta parool" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "Funktsiooni väljakutse (%s)" #: thonny/plugins/debugger.py:1003 msgid "Local variables" msgstr "Lokaalsed muutujad" #: thonny/plugins/debugger.py:1035 msgid "Function" msgstr "Funktsioon" #: thonny/plugins/debugger.py:1036 msgid "Location" msgstr "Asukoht" #: thonny/plugins/debugger.py:1112 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "Kui viimane käsk tekitas erindi, siis siin näidatakse selle pinujälge." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "ID" #: thonny/plugins/object_inspector.py:92 msgid "Data" msgstr "Andmed" #: thonny/plugins/object_inspector.py:93 msgid "Attributes" msgstr "Atribuudid" #: thonny/plugins/object_inspector.py:538 msgid "Index" msgstr "Indeks" #: thonny/plugins/object_inspector.py:616 msgid "Key ID" msgstr "Võtme ID" #: thonny/plugins/object_inspector.py:617 msgid "Key" msgstr "Võti" #: thonny/plugins/variables.py:39 msgid "Back to\n" "%s" msgstr "Tagasi\n" "%s" #: thonny/plugins/micropython/mp_front.py:444 msgid "Port or WebREPL" msgstr "Port või WebREPL" #: thonny/plugins/micropython/mp_front.py:589 msgid "Password" msgstr "Parool" #: thonny/plugins/debugger.py:961 msgid "Source code" msgstr "Lähtekood" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "Kasuta Tk failidialooge Zenity asemel" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "Vali kui failidialoogid satuvad peaakna taha" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "Keskkonnamuutujad (üks VÕTI=VÄÄRTUS ühel real)" #: thonny/base_file_browser.py:718 msgid "New file" msgstr "Uus fail" #: thonny/base_file_browser.py:736 msgid "Rename" msgstr "Nimeta ümber" #: thonny/base_file_browser.py:924 msgid "Rename '%s'" msgstr "Nimeta '%s' ümber" #: thonny/base_file_browser.py:924 msgid "Enter new name" msgstr "Sisesta uus nimi" #: thonny/base_file_browser.py:1012 msgid "Paste failed" msgstr "Kleepimine ebaõnnestus" #: thonny/base_file_browser.py:1012 msgid "There are conflicting folders" msgstr "Kaustades on konflikte" #: thonny/base_file_browser.py:1140 msgid "File already exists" msgstr "Fail juba eksisteerib" #: thonny/base_file_browser.py:1208 msgid "If it is a text file, then you can configure it to open in Thonny by right-clicking it and selecting 'Configure ... files'." msgstr "Kui tegemist on tekstifailiga, siis Sa saad seadistada Thonny seda avama kui teed paremklõpsu ja valid 'Seadista ... failid'." #: thonny/editors.py:35 msgid "Python files" msgstr "Pythoni failid" #: thonny/editors.py:122 thonny/editors.py:189 msgid "" msgstr "" #: thonny/editors.py:149 msgid "File is gone" msgstr "Faili ei leitud" #: thonny/editors.py:152 msgid "Do you want to also close the editor?" msgstr "Kas soovid redaktorit sulgeda?" #: thonny/editors.py:168 msgid "External modification" msgstr "Väline muudatus" #: thonny/editors.py:171 msgid "Do you want to discard current editor content and reload the file from disk?" msgstr "Kas soovid redaktori praeguse sisu tühistada ja laadida faili kettalt uuesti?" #: thonny/editors.py:580 msgid "Python files usually have .py extension." msgstr "Pythoni failidel on tavaliselt .py laiend." #: thonny/editors.py:582 msgid "Did you mean '%s'?" msgstr "Kas mõtlesid '%s'?" #: thonny/editors.py:751 msgid "Move / rename..." msgstr "Liiguta / nimeta ümber..." #: thonny/editors.py:760 msgid "Go to line..." msgstr "Mine reale..." #: thonny/editors.py:1003 msgid "Line number" msgstr "Rea number" #: thonny/editors.py:1149 msgid "Do you want to save files before closing?" msgstr "Kas soovid enne sulgemist failid salvestada?" #: thonny/editors.py:1151 msgid "Do you want to save file before closing?" msgstr "Kas soovid enne sulgemist faili salvestada?" #: thonny/editors.py:1154 msgid "Save On Close" msgstr "Sulgemisel salvestamine" #: thonny/misc_utils.py:513 msgid "Command not available" msgstr "Käsk pole saadaval" #: thonny/misc_utils.py:514 msgid "This command is not available if Thonny is run via Flatpak" msgstr "See käsk pole saadaval, kui Thonny jooksutatakse Flatpak-i kaudu" #: thonny/workbench.py:694 thonny/workbench.py:794 msgid "Support Ukraine" msgstr "Toeta Ukrainat" #: thonny/plugins/backend_config_page.py:91 msgid "Which kind of interpreter should Thonny use for running your code?" msgstr "Millist tüüpi interpretaatoriga peaks Thonny Su koodi jooksutama?" #: thonny/plugins/calltip.py:159 msgid "Show parameter info" msgstr "Näita parameetrite infot" #: thonny/plugins/editor_config_page.py:41 msgid "Automatically show parameter info after typing '('" msgstr "Näita parameetrite infot automaatselt peale '(' tippimist" #: thonny/plugins/editor_config_page.py:47 msgid "Automatically propose completions while typing" msgstr "Paku sõnade lõpetamist tippimisel automaatselt" #: thonny/plugins/editor_config_page.py:52 msgid "Automatically show documentation for completions" msgstr "Näita pakkumiste dokumentatsiooni automaatselt" #: thonny/plugins/editor_config_page.py:57 msgid "Request completions with Tab-key in editors" msgstr "Luba küsida sõnade lõpetamisi Tab-klahviga redaktoris" #: thonny/plugins/editor_config_page.py:62 msgid "Request completions with Tab-key in Shell" msgstr "Luba küsida sõnade lõpetamisi Tab-klahviga Käsureal" #: thonny/plugins/goto_definition.py:58 msgid "Problem" msgstr "Probleem" #: thonny/plugins/goto_definition.py:58 msgid "Could not find definition" msgstr "Ei leidnud definitsiooni" #: thonny/plugins/shell_config_page.py:17 msgid "Clear Shell before starting new process (Run, Debug, Stop/Restart, ...)" msgstr "Tühjenda Käsurida enne uue protsessi käivitamist (Jooksuta, Silu, Peata/taaskäivita, ...)" #: thonny/plugins/cpython_frontend/cp_front.py:171 msgid "Thonny's Python" msgstr "Thonny Pyhton" #: thonny/plugins/micropython/mp_front.py:492 msgid "Interrupt working program on connect" msgstr "Katkesta ühendumisel töötav programm" #: thonny/plugins/micropython/mp_front.py:500 msgid "Synchronize device's real time clock" msgstr "Sünkroniseeri seadme kell" #: thonny/plugins/micropython/mp_front.py:506 msgid "Use local time in real time clock" msgstr "Kasuta seadme kellas lokaalset aega" #: thonny/plugins/micropython/mp_front.py:512 msgid "Restart interpreter before running a script" msgstr "Taaskäivita interpretaator enne skripti jooksutamist" #: thonny/plugins/micropython/pip_gui.py:24 msgid "This doesn't look like MicroPython/CircuitPython package.\n" "Are you sure you want to install it?" msgstr "See ei paista olevat MicroPythoni või CircuitPythoni pakk. Oled kindel, et soovid seda installida?" #: thonny/base_file_browser.py:849 msgid "Moving to Trash" msgstr "Liigutan Prügikasti" #: thonny/base_file_browser.py:850 msgid "Move %s to Trash?" msgstr "Kas liigutan %s Prügikasti?" #: thonny/base_file_browser.py:857 msgid "Moving %s to Trash" msgstr "Liigutan %s Prügikasti" #: thonny/base_file_browser.py:662 msgid "Open in default external app" msgstr "Ava välises vaikerakenduses" #: thonny/base_file_browser.py:1206 msgid "Opening remote files in external app is not supported." msgstr "Välises rakenduses ei saa avada mittelokaalseid faile." #: thonny/base_file_browser.py:1213 msgid "If the file needs to be opened in external app, then download it to a local directory and open it from there!" msgstr "Kui faili on vaja avada välises rakenduses, siis lae see kõigepealt alla lokaalsesse kausta ja ava sealt!" #: thonny/editors.py:150 msgid "Looks like '%s' was deleted or moved." msgstr "Näib, et '%s' on kustutatud või ümberpaigutatud." #: thonny/editors.py:169 msgid "Looks like '%s' was modified outside of the editor." msgstr "Näib, et '%s' on muudetud väljaspool redaktorit." #: thonny/plugins/cpython_frontend/cp_front.py:230 msgid "NB! Thonny only supports Python %s and later" msgstr "NB! Thonny toetab ainult Python %s ja sellest uuemaid" #: thonny/editors.py:1003 msgid "Go to line" msgstr "Mine reale" #: thonny/workbench.py:697 msgid "Support" msgstr "Toeta" #: thonny/editors.py:393 thonny/editors.py:408 msgid "Could not save" msgstr "Salvestamine ei õnnestunud" #: thonny/plugins/general_config_page.py:135 msgid "Warning" msgstr "Hoiatus" #: thonny/plugins/general_config_page.py:136 msgid "If you quote the value of an environment variable, the quotes will be part of the value.\n" "Did you intend this?" msgstr "Kui Sa paned keskkonnamuutuja väärtuse jutumärkidesse, siis jutumärgid saavad väärtuse osaks.\n" "Kas soovisid nii?" #: thonny/workbench.py:867 msgid "Install MicroPython" msgstr "Installi MicroPython" #: thonny/workbench.py:871 msgid "Install CircuitPython" msgstr "Installi CircuitPython" #: thonny/plugins/backend_config_page.py:212 msgid "Make uploaded shebang scripts executable" msgstr "Tee üleslaetud shebang-skriptid käivitatavaks" #: thonny/plugins/editor_config_page.py:91 msgid "Make saved shebang scripts executable" msgstr "Tee salvestatud shebang-skriptid käivitatavaks" #: thonny/plugins/files.py:224 msgid "Activate virtual environment" msgstr "Aktiveeri virtuaalkeskkond" #: thonny/plugins/micropython/pip_gui.py:77 thonny/plugins/pip_gui.py:426 msgid "Target" msgstr "Sihtkoht" #: thonny/plugins/pythontutor.py:41 msgid "Visualize current script at Python Tutor" msgstr "Visualiseeri käesolev skript Python Tutor-is" #: thonny/plugins/todo_view.py:44 msgid "Line" msgstr "Rida" #: thonny/plugins/todo_view.py:45 msgid "Info" msgstr "Info" #: thonny/plugins/todo_view.py:123 msgid "No line marked with #todo found" msgstr "Ei leidnud ühtki #todo rida" #: thonny/plugins/todo_view.py:143 msgid "TODO" msgstr "TODO" #: thonny/plugins/circuitpython/cirpy_front.py:98 #: thonny/plugins/micropython/mp_front.py:536 msgid "Install or update %s" msgstr "Installi või uuenda %s" #: thonny/plugins/cpython_frontend/__init__.py:24 msgid "Local Python 3" msgstr "Kohalik Python 3" #: thonny/plugins/cpython_frontend/cp_front.py:240 msgid "You can activate an existing virtual environment also via the right-click context menu in the file navagation when selecting a virtual environment folder, or the 'pyveng.cfg' file inside." msgstr "Virtuaalkeskkonna saab aktiveerida ka paremklõpsuga failibrauseris keskkonna kaustal või pyvenv.cfg failil" #: thonny/plugins/ev3/__init__.py:72 msgid "Preparations (skip the VS Code part)" msgstr "Ettevalmistused (ignoreeri VS Code osa)" #: thonny/plugins/ev3/__init__.py:78 msgid "Default password" msgstr "Vaikeparool" #: thonny/running.py:338 msgid "Information" msgstr "Informatsioon" #: thonny/running.py:339 msgid "For debugging the program must be saved first." msgstr "Silumiseks tuleb programm enne salvestada." ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/thonny/locale/fa_IR/0000775000175000017500000000000014307363733016416 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6901064 thonny-4.0.1/thonny/locale/fa_IR/LC_MESSAGES/0000775000175000017500000000000014307363733020203 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/fa_IR/LC_MESSAGES/thonny.mo0000664000175000017500000011373214276461532022067 0ustar00annamaaannamaaL ||}]$) *3^ m&z+-! D.7s&      1x?  &5< P[j;{    , GD I [ c <x % * !%!8!U!Y!^!d!y!!!3!""1"8"H" Q"]"m"u"|""!" """ #B#\#b#g#v### ##%##/#'$.B$q$ w$$$ $$ $$$$ $$$$$ %"%(% 1% >% I%U%g%,&/2&=b& &&&&&0&' ''6,'c'}'''''''''L(FM((C\)))7)***!*9*X* s** ** ***3*+ ++&+/+E+T+Y+ a+l+|+ +++~,z1-;---. %.13. e......../ /"/n2//,v000<01-1U1c)222 2n2!3 53 A3 O3 ]3k3q333?3C3454'S4){4 444445&5;5TC5 5555 555H5O'65w66666667 $707:87s7x77&777777 8 8 8*8;8M8a8f8 x8B888 88 8&9)9 19=9 V9 d9q99 999 9 999 9"9: : /: :: G: U:`: g:t:z:: :: : ::2:/;8O;;:;; ;< <0!<R<d<v< {< <<<-<< < <= === 0= ==)K=u=}= ====== =>=n=>0>!> > ? ? @b@@ATA/fAA@PBBB"BBB B CC#C0,C ]CgC lCvCCCCCCC CC2D%7D]DcD lDvDDDLDDD5E EEEECF#YF}F F FF FF1F%F G%GV7GIG GG GGH&HHH\IYI5WJJJGJK?KI_K5KKBtLkL #M0M9M MMZMrMyM#MMMNN N#N0N#O}(V}}%}}}} }~~*~ @~4a~~*~ ~%~ 'A[n7+?LSfV^s!q:΂Ղl%Z  ă5҃ EYm*Ʉ+ 34 h"sɅ !!c*KE)Їt9ƊoIFaa ";C$) ݎ+#*iN ͏؏&-@-W%ːސOFJ !+kiǓ<"/=wm(! 8DT fQq7ÕJ~[rږ M%[%Ɨ%d items(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)(restart Thonny after changing this)(used when clicking Debug toolbar button)A special virtual environment (deprecated)About BirdseyeAbout ThonnyAdvanced install / upgrade / downgradeAdvanced optionsAllow code completion with Tab-key in ShellAllow code completion with Tab-key in editorsAllow only single Thonny instanceAllow stepping into libraries (ie. outside of main script directory)Alternative Python 3 interpreter or virtual environmentAre you sure you want to uninstall it?AssistantAttributesAuthenticationAuthorAuto-completeBackBack to %sBack to current frameBad directoryBirdseye is a Python debugger which needs to be installed separately. Do you want to open the help page and learn more?Birdseye portBrowse the packagesBugtrackerCan't close yetCan't find package name from the list:Can't find suitable diskCancelCancel the process?CancellingCase sensitiveChange font sizeChange working directory to script directory on Run / DebugCircuitPython (generic)CircuitPython deviceClearClear shellClickClick CloseClose allClose othersComment outConfiguration has been updated. Restart Thonny to start working in regular mode. (See 'Tools → Options → General' if you change your mind later.)Configure %s filesConfigure interpreter...ConfirmationConnect your device to the computer and select corresponding port belowCopyCopy to clipboardCopyingCopying %s to %sCould not find disk '%s'. Do you want to locate it yourself?Could not find the package from PyPI.Could not find the package info from PyPI.Create new virtual environmentCreating directoryCreating virtual environmentCutDataDebugDebug current scriptDebug current script (birdseye)Debug current script (faster)Debug current script (nicer)Debug mode (provides more detailed diagnostic logs)Decrease font sizeDedent selected linesDeleteDelete selectedDeletingDeleting %sDesired versionDetailsDeviceDirectory propertiesDisable notification soundDisabled checks (one id per line)DisconnectDo you want to overwrite '%s' ?Dock user windowsDocumentationDon't forget that main.py only works without embedded main script.Done!DownDownload to %sDownloading %s to %sEditEditorEditor fontEnter an integerEnter name for new directory under %sEnter string to be replaced.Enter the passphrase of your private key for {}Enter your password for {}Environment variables (one KEY=VALUE per line)ErrorError code:Error:EventsExceptionExitExit ThonnyExpand in ShellExport usage logs...FileFile name:File propertiesFilesFindFind & ReplaceFind package from PyPIFind:FirmwareFocus editorFocus intoFocus shellFont scaling modeFor performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell). Here you can interact with the original text fragment.For uninstalling delete corresponding files.For upgrading simply install the package again.Found several '%s' disks. Do you want to choose one yourself?Full screenFunctionFunction call at %sGeneralHeapHeap mode is on. Close Heap view to turn it off.HelpHelp contentsHide hidden filesHighlight current line (requires reopening the editor)Highlight local variablesHighlight matching namesHighlight parenthesesHighlight syntax elementsHighlight tab charactersHomeHomepageIDINSTALLIO fontIf last command raised an exception then this view will show the stacktrace.If you can't find it, you may need to install proper USB driver first.If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER.If you still want it, then please install it from the command line.Increase font sizeIndent selected linesIndent with tab characters (not recommended for Python)IndexInstallInstall from PyPIInstall from local fileInstall from requirements fileInstall or update firmwareInstalled to:Installed version:InstallingInstalling '%s'InterpreterInterrupt executionIntoKeep terminal window open after Python process endsKeyKey IDKnown interpretersLanguageLatest stable versionLatest versionLoadLoadingLoading %sLocal variablesLocationLocation: Log program usage eventsLooks like you are installing a Thonny-related package. If you meant to install a Thonny plugin, then you should choose 'Tools → Manage plugins...' instead Are you sure you want to install %s for the back-end?Looks like you are trying to install an outdated Thonny plug-in (it doesn't specify required Thonny version). If you still want it, then please install it from the command line.Made in University of Tartu, Estonia, with the help from open-source community, Raspberry Pi Foundation and Cybernetica ASMake sure MicroPython has been installed to your micro:bit.Manage packages for %sManage packages...Manage plug-ins...Maximize viewMaximum length of line fragments before squeezingMaximum number of lines to keep.May make debugging slower.MicroPython (SSH)MicroPython (generic)MicroPython (local)MicroPython deviceModifiedModuleMove to Recycle BinMove to TrashMoving %s to %sNB! Automatic closing needs to be enabled in Terminal's settings (Profiles → Shell → When the shell exits)NB! File selection button may not work properly when selecting executables from a virtual environment. In this case choose the 'activate' script instead of the interpreter (or enter the path directly to the box)!NB! Large values may cause poor performance!NB! Restart Thonny after changing these options!NB! Some style elements change only after restarting Thonny!NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install.NB! Thonny only supports Python 3.5 and laterNB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in.NB! micropython.org has published version %s of this package and this will be installed by default.NameNewNew directoryNew packages will be also installed into this directory. Other locations must be managed by alternative means.New packages will be installed toNext objectNot availableNot connectedNot supportedNotesNothing selectedOKObject inspectorOpen Assistant automatically when it has warnings for your codeOpen Assistant automatically when program crashes with an exceptionOpen Thonny data folder...Open Thonny program folder...Open and close Stack view automaticallyOpen evaluated values in Object inspectorOpen from %sOpen in ThonnyOpen in Thonny's text editorOpen in system default appOpen in system file managerOpen replayer...Open system shell...Open...Opens the Stack view on first call and closes it when program returns to main frame.Options...OutOutlineOverOverwrite?Overwriting theme '%s'PackagePackage '{}' is required for installing and uninstalling other packages.Package is not available at micropython.org. Version at PyPI will be installed.Package manager is not available for this interpreterPackages' directoryPasswordPastePathPerform MyPy checksPerform selected Pylint checksPlease check your spelling!Please waitPlotterPlotter visualizes series of numbers printed to the Shell.PortPort or WebREPLPreferred debuggerPresent Python REPL after program endsPreviewPrevious objectPrint...Program argumentsProgram arguments:Program treePropertiesPyPI pagePygame Zero modePython executablePython interpretersQuitReally uninstall?Recent filesRecommended maximum line length (Set to 0 to turn off margin line)RedoRefreshRegular modeRemote Python 3 (SSH)Rename...Reopen all files from previous sessionReplaceReplace allReplace tabs with spacesReplace with:Replace+FindReport problemsRequiresRequires:ResumeRunRun & DebugRun / resumeRun current scriptRun current script in terminalRun to cursorRunning current script in terminalSaveSave All filesSave as...Save copy...Save passwordSave to %sSavingSaving to %sScopeSearch on PyPISearch resultsSearchingSee Help for details.Select AllSelect allSelect an item and try again!Select empty directory for new virtual environmentSelect existing or create a new empty directorySelect if the file dialogs end up behind the main windowSelect interpreterSelected directory is not empty. Select another or cancel.Send EOF / Soft rebootShadowed items (not importable):ShellShow PlotterShow function calls (frames) in separate windowsShow hidden filesShow line numbersSizeSize (bytes)Source codeSqueezed text (%d characters)StackStart by selecting the package from the left.StartingStep backStep intoStep outStep overStopStop/Restart backendStorage infoStorage spaceStorage space on this drive or filesystemSummarySwitch to regular modeSyntax themeTarget device locationTarget device modelTarget:TerminalTerminal emulationThe answer isThe process is still running. Are you sure you want to cancel?The representation above is an approximate value of this float. The exact stored value is %s which is about %sThe same interpreter which runs Thonny (default)The specified text was not found!Theme & FontThis box is meant for your working notes -- assignment instructions, code snippets, whatever. Everything will be saved automatically and loaded when you open Thonny next time. Feel free to delete this text to make room for your own notes.This computerThis dialog is for managing Thonny plug-ins and their dependencies. If you want to install packages for your own programs then choose 'Tools → Manage packages...'This dialog lists all available packages, but allows upgrading and uninstalling only packages fromThis dialog lists top-level modules from following directories: This is a commentThis package requires different Thonny version:This program comes with ABSOLUTELY NO WARRANTY! It is free software, and you are welcome to redistribute it under certain conditions, see https://opensource.org/licenses/MIT for detailsThis virtual environment is automatically maintained by Thonny. Thonny optionsThonny plug-insThonny plugin without requirementsToggle commentToolsTry to detect port automaticallyUI modeUI scaling factorUI themeUncheck if you want more traditional experience.UncommentUndoUninstallUninstalling '%s'Unsuitable requirementsUpUpgradeUpgrade dependenciesUpgrade or uninstallUpgrading '%s'Upload to %sUploading %s to %sUse "Stop" command if you want to cancel debuggingUse Tk file dialogs instead of ZenityValueValue IDVariablesVersion historyVersion to be installedViewWhat to do with a %s file when you double-click it in Thonny's file browser?Which interpreter or device should Thonny use for running your code?With current interpreter you can only browse the packages here. Use 'Tools → Open system shell...' for installing, upgrading or uninstalling.Working...Wrap text (may be slow)You need to enterYou need to select a file!You need to stop your program before launching the package manager.Your interpreter isn't in the list?Zoomall filesblah, blahbytesfree spaceherelook for your device name, "USB Serial" or "UART"no absolute lib directory in sys.pathplease waitsupports basic ANSI-colors and stylesto locate and install the package file (usually with .whl, .tar.gz or .zip extension).to locate requirements.txt file and install the packages specified in it.total spaceunclosed_stringused spaceuser site packagesvirtual environmentMIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: POEditor.com Project-Id-Version: Thonny Language: fa تعداد %d مورددر این حالت هسته تانی از مفسر یکسانی استفاده می کند، بنابراین هر دو پنجره بسته‌های یکسانی را مدیریت می کنند.)(بعد از تغییر این گزینه باید مجدد تانی را اجرا کنید)(هنگام کلیک کردن روی دکمه خطایابی استفاده می شود)یک محیط مجازی ویژه (منسوخ شده)درباره Birdseyeدرباره تانینصب، ارتقاء یا نصب نسخه‌ قدیمی پیشرفتهتنظیمات پیشرفتهاجازه تکمیل کد با زدن دکمه Tab در شِلاجازه تکمیل کد با زدن دکمه Tab در ویرایشگرفقط یکبار اجرای تانی مجاز استاجازه قدم گذاشتن به داخل کتابخانه‌ها (مانند مواقعی که خارج از پوشه اسکریپت هستید)سایر مفسرهای پایتون 3 و یا محیط مجازیآیا از اینکه می‌خواهید آن برنامه را حذف کنید، مطمئن هستید؟دستیارخواصاحراز هویتسازندهتکمیل خودکارعقببرگرد به %sبازگشت به فریم فعلیپوشه نامناسبBirdseye یک خطایاب پایتون است و بایستی جداگانه نصب شود. آیا می‌خواهید صفحه راهنمای را باز کنید و بیشتر بدانید؟پورت Birdseyeمرور بسته‌هاخطایابهنوز قابل بستن نیستبسته در فهرست زیر یافت نشد:دیسک مناسب یافت نشدلغواین پردازش لغو شود؟درحال لغوحساس به حروف کوچک و بزرگ انگلیسیتغییر اندازه فونتپوشه فعلی را به پوشه اسکریپت در اجرا / خطایابی تغییر دهیدCircuitPython (عمومی)دستگاه CircuitPythonپاک کنپاک کردن شِلکلیککلیکبستنبستن همهبستن بقیهکد به توضیحتنظیمات بروز رسانی شد. برای شروع کار در محیط عادی، تانی را مجدد اجرا کنید. (اگر نظرتان عوض شد، از «ابزارها ← تنظیمات ← عمومی» را انتخاب کنید)%s فایل تنظیم شدپیکره‌بندی مفسر...تاییددستگاه خود را به رایانه متصل کرده و پورت مربوط را از زیر انتخاب کنیدکپیکپی در حافظه موقتدرحال کپیکپی %s در %sدیسک %s پیدا نشد. آیا مایلید که محل آن را خودتان مشخص کنید؟بسته مورد نظر در PyPI پیدا نشد.این بسته در PyPI یافت نشد.ایجاد محیط مجازی جدیدساخت پوشهساخت یک محیط مجازیبرشدادهخطایابیخطایابی این اسکریپتخطایابی همین اسکریپت (birdseye)خطایابی همین اسکریپت (سریع)خطایابی همین اسکریپت (مبتدی)حالت خطایابی (ثبت خطایابی‌ها با جزئیات بیشتر)فونت کوچک‌تر شودحذف تورفتگی خطوط انتخابیحذفحذف انتخاب شده‌هادر حال حذفحذف %sنسخه دلخواهجزئیاتدستگاهمشخصات پوشههشدارهای صوتی غیرفعال شودلغو بررسی (یک شناسه در هر خط)قطع اتصالآیا می‌خواهید بر روی «%s» جایگزین شود؟ثابت‌ کردن محل پنجره‌های شمامستنداتدقت کنید که main.py در صورتی کار می‌کند که بدون اسکریپ main باشد.انجام شد!رو به پاییندانلود در %sدرحال دانلود %s در %sویرایشویرایشگرفونت ویرایشگرعددی صحیح را وارد کنیدنام پوشه جدید که در زیر مجموعه پوشه زیر ساخته خواهد شد را وارد کنید. %sمتنی را جهت جایگزینی وارد کنید.برای {} عبارت کلید خصوصی خود را وارد کنیدبرای {} گذرواژه خود را وارد کنیدمتغیرهای محیطی (در هر سطر یک مقدار=کلید)خطاکد خطا:خطا:رویدادهااستثناءخروجخروج از Thonnyبسط دادن در شِلذخیره وقایع ثبت شده...فایلنام فایل:مشخصات فایلفایل‌هایافتنیافتن و جایگزینییافتن بسته از PyPIیافتنسفت‌افزاربرو به ویرایشگربرو بهبرو به شِلمقیاس اندازه فونتبرای بهبود کارآیی، شِل از نمایش خطوط بلند به صورت کامل خودداری می‌کند (به ابزارها ← تنظیمات ← شِل بروید). از اینجا می توانید با قسمتی از متن اصلی کار کنید.برای حذف فایلهای مربوطه را حذف کنید.برای به روزرسانی ساده‌تر، بسته را دوباره نصب کنید.چندین دیسک %s پیدا شد. آیا مایلید که خودتان یکی از آنها را انتخاب کنید؟تمام صفحهتابعفراخوانی تابع در %sعمومیهیپحالت هیپ فعال است. برای بستن آن باید نمای هیپ را ببندید.راهنمامحتوای راهنماعدم نمایش فایل‌های مخفینمایان کردن خط فعلی (باید دوباره ویرایشگر را باز کنید)نمایان کردن متغیرهای محلینمایان کردن نام‌های یکساننمایان کردن پرانتزهانمایان کردن اجزای دستورنمایان کردن Tabهاخانهصفحه اصلی سایتشناسهنصب برنامهفونت IOاگر آخرین دستور یک خطا را ایجاد کند این نما، stacktrace (ردیاب اِستک) را نمایش می‌دهد.اگر آن را پیدا نکردید،احتمالا لازم است که ابتدا درایور USB مناسب را نصب کنید.اگر نمی دانید بسته را باید از کجا بگیرید، به احتمال زیاد بخواهید تا فهرست بسته‌های پایتون را جستجو کنید. ابتدا نام بسته را در قسمت جستجو وارد کنید و سپس کلید Enter را بزنید.اگر کماکان آن را می‌خواهید ، لطفاً آن را از خط فرمان نصب کنید.فونت درشت‌تر شودتورفتگی خطوط انتخابیایجاد تورفتگی با Tab (در پایتون این کار توصیه نمی‌شود)اندیسنصب برنامهنصب برنامه از PyPIنصب با فایل‌های موجودنصب از فایل‌های مورد نیازنصب یا بروز رسانی سفت‌ابزارنصب در:نسخه نصب شده:در حال نصبدر حال نصب «%s»مفسرقطع اجراداخلپنجره ترمینال را بعد از اتمام پردازش پایتون باز نگه دارکلیدشناسه کلیدمفسرهای مشهورزبانآخرین نسخه پایدارآخرین نسخهبارگذاریدر حال بازگذاریدر حال بارگذاری %sمتغیرهای محلیمحلمحل:ثبت رویداد‌های استفاده از برنامهبه نظر می رسد شما در حال نصب یکی از بسته‌های تانی هستنید. اگر قصد نصب پلاگینی برای تانی را دارید باید از «ابزارهای ← مدیریت افزونه‌ها...» اقدام کنید. آیا از نصب %s برای هسته کاملا مطمئن هستید؟به نظر می رسد که شما در حال نصب یک افزونه قدیمی تانی هستید (نسخه مورد نیاز تانی را مشخص نمی کند). اگر واقعا آن را می خواهید ، لطفاً توسط خط فرمان آن را نصب کنید.ساخته شده در دانشگاه Tartu، کشور استونی با کمک از جامعه متن باز، بنیاد رزبری پای و Cybernetica ASمطمئن شوید که MicroPython بر روی micro:bit شما نصب است...مدیریت بسته‌های %sمدیریت بسته‌ها...مدیریت افزودنی‌ها...نمای کاملحداکثر طول یک قطعه از خط قبل از فشرده شدننگهداری حداکثر تعداد سطر ممکن.ممکن است خطایابی را کندتر کند.میکروپایتون (SSH)MicroPython (عمومی)میکروپایتون (محلی)دستگاه MicroPythonویرایش شدهماژولانتقال به سطل بازیافتانتقال به سطل زبالهانتقال %s به %sتوجه مهم! بستن خودکار نیاز به فعال سازی تنظیمات ترمینال دارد (پروفایل ← شِل ← هنگام خروج از شِل)توجه مهم! دکمه انتخاب فایل در هنگام انتخاب فایل‌های اجرایی در محیط مجازی ممکن است به درستی کار نکند. در این صورت اسکریپت «activate» را به جای مفسر انتخاب کنید (و یا مسیر را در قسمت مسیر مستقیما وارد کنید)!توجه مهم! مقادیر بزرگ ممکن است باعث کاهش کارآیی شوند!توجه مهم! بعد از تغییر این گزینه‌ها باید تانی را دوباره باز کنید!توجه مهم! برخی از تغییرات ظاهری موارد نیاز به اجرای دوباره تانی دارد!توجه مهم! ممکن است نسخه دیگری موجود باشد که با نسخه فعلی تانی سازگار باشد. برای انتخاب نسخه مورد نظرتان برای نصب، بر روی دکمه «...» کلیک کنید.توجه مهم! تانی فقط از پایتون 3.5 به بعد پشتیبانی می‌کندتوجه مهم! بعد از نصب / ارتقاء / حذف افزونه‌ای، باید تانی را دوباره باز کنید.توجه مهم! micropython.org نسخه %s این بسته را منتشر کرده است و به صورت پیش فرض نصب خواهد شد.نامجدیدپوشه جدیدبسته‌های جدید در این پوشه نصب خواهند شد. مسیرهای دیگر باید با سایر روش‌ها مدیریت شود.بسته‌های جدید نصب خواهند شد درشیء بعدیموجود نیستوصل نیستپشتیبانی نمی‌شودیادداشت‌هاچیزی انتخاب نشده استتاییدبازرس اشیاءاجرای خودکار دستیار در هنگام داشتن هشدارهایی در برنامهاجرای خودکار دستیار در هنگام اجرا نشدن برنامه همرا خطانمایش فولدر داده‌های تانینمایش فولدر برنامه تانیباز و بسته شدن خودکار نمای اِستکنمایش مقدار محاسبه شده را در بازرس اشیاءباز کردن از %sبازکردن در تانیدر ویرایشگر متنی تانی باز شودبازکردن با نرم افزار پیش‌فرض سیستمبازکردن در برنامه مدیریت فایل سیستمباز کردن «بازپخش کننده»بازکردن شِل سیستمباز کردن...نمای اِستک را در اولین فراخوانی نمایش داده و بعد از بازگشت برنامه به فریم اصلی آن را خواهد بست.تنظیمات...بیرونطرح کلیبعدیجایگزین شود؟در حال بازنویسی قالب «%s»بستهبسته «{}» برای نصب و یا حذف سایر بسته‌ها مورد نیاز است.این بسته در micropython.org موجود نبود. نسخه موجود در PyPI نصب خواهد شد.مدیریت بسته برای این مفسر موجود نیستپوشه‌ی بسته‌هاگذرواژهجای‌گذاریمسیربررسی MyPyبررسی Pylint انتخابیلطفا غلط املائی را بررسی کنید!اندکی صبر...نمودارنموداری به صورت گرافیکی اعدادی که در شِل چاپ می‌شوند را نمایش می‌دهد.پورتپورت WebREPLخطایاب انتخابینمایش Python REPL بعد از اتمام برنامهپیش‌نمایششیء قبلیچاپ...ورودی‌های برنامهورودی‌های برنامه:درخت برنامهویژگی‌هاصفحه PyPIحالت Pygame Zeroفایل اجرایی پایتونمفسرهای پایتونخروجواقعا برنامه را حذف می‌کنید؟آخرین فایل‌هاحداکثر طول خط پیشنهادی (برای خاموش کردن خط حاشیه روی 0 تنظیم کنید)بازانجامتازه سازیحالت عادیدسترسی از راه‌ دور پایتون 3 (SSH)تغییر نام...تمام فایلها‌ی اجرای قبلی برنامه را دوباره باز شودجایگزینیجایگزینی همهجایگزینی Tabها با فاصلهجایگزین شود با:جایگزین و یافتن بعدیگزارش مشکلاتالزاماتمورد نیاز:ادامهاجرااجرا و خطایابیاجرا / ادامهاجرای این اسکریپتاجرای این اسکریپت در ترمینالاجرا تا نشانگراجرای این اسکریپ در شِلذخیرهذخیره تمامی فایل‌هاذخیره با نام...ذخیره یک کپی ..ذخیره گذرواژهذخیره در %sدر حال ذخیرهدر حال ذخیره %sمیدان دیدجستجو در PyPIنتایج جستجودر حال جستجوبرای جزئیات، راهنما را ببینید.انتخاب همهانتخاب همهموردی را انتخاب کنید و دوباره امتحان کنید!برای محیط مجازی جدید بایستی پوشه‌ای خالی را انتخاب کنیدپوشه‌ای را انتخاب کنید و یا یک پوشه خالی بسازیداگر پنجره‌ها پشت پنجره اصلی برنامه قرار می‌گیرد، این گزینه را انتخاب کنیدانتخاب مفسرپوشه انتخاب شده خالی نیست. یکی دیگر را انتخاب کنید و یا لغو کنید.ارسال EOF/ ریبوت نرمموارد سایه‌دار (وارد نشده‌اند):شِلنمایش نمودارفراخوانی توابع را در پنجره‌های جداگانه (فریم‌ها) نمایش بدهنمایش فایل‌های مخفینمایش شماره خطوطاندازهاندازه (بایت)کد اصلیمتن فشرده شده (شامل %d کاراکتر)اِستکبا انتخاب بسته‌ای از سمت چپ شروع کنید.درحال شروعگامی به عقبگامی به داخلگامی به خارجگام بعدیتوقفتوقف/ اجرای دوباره هستهاطلاعات فضای ذخیره سازیفضای ذخیرهفضای ذخیره سازی در این درایوخلاصهبرگشت به حالت عادیقالب نوشتارمحل دستگاه مقصدنوع دستگاه مقصدمقصد:ترمینالشبیه‌ ساز ترمینالپاسخپردازش هنوز در حال اجراست. آیا از لغو آن اطمینان دارید؟مقدار نمایش داده شده در بالا، مقدار تقریبی این عدد اعشاری است. مقدار دقیق ذخیره شده در %s تقریبا %s است.همان مفسری که تانی را اجرا می کند (پیش فرض)متن تعیین شده یافت نشد!قالب و فونتاین قسمت برای یادداشت‌های کاری شما، مقداردهی‌ها ، قطعه کد و یا هر یادداشت دلخواه دیگری است. هر چیزی در آن به صورت خودکار ذخیره خواهد شد و در اجرای بعدی تانی نمایش داده می‌شود. می‌توانید همین متن را برای داشتن فضای بیشتر، پاک کنید.این کامپیوتراین پنجره برای مدیریت افزونه‌های تانی و وابستگی‌های آنها است. اگر می‌خواهید که یک بسته را برای برنامه‌تان نصب کنید باید اینکار را «ابزارها ← مدیریت بسته‌ها» انجام دهید.این پنجره تمام بسته های موجود را لیست می کند، اما فقط اجازه می‌دهد تا ارتقا و حذف بسته از مسیر زیر انجام شوداین پنجره ماژول‌های سطح بالا را از پوشه‌های زیر لیست می کند:این یک توضیح استاین بسته به نسخه دیگری از تانی نیاز دارد:این برنامه بدون هیچگونه ضمانتی است! این نرم افزار رایگان است و می‌توانید آن را تحت شرایط تعیین شده، باز توزیع نمایید. برای جزئیات بیشتر به آدرس زیر مراجعه کنید: https://opensource.org/licenses/MITاین محیط مجازی به طور خودکار توسط تانی نگهداری می شود.تنظیمات تانیافزودنی‌های تانیافزودنی‌های تانی بدون پیش‌نیازتغییر وضعیت توضیحاتابزارهاشروع تشخیص خودکار پورتحالت ظاهری برنامهضریب اندازه ظاهر برنامهقالب محیط نرم افزاراگر می خواهید تجربه سنتی‌تری داشته باشید، غیر فعالش کنید.توضیح به کدواگردحذف برنامهدر حال حذف «%s»پیش‌نیازهای نامناسبرو به بالابه روز رسانیبه‌روزرسانی پیش‌نیازهاارتقاء یا حذف برنامهدر حال ارتقای «%s»آپلود به %sبارگذاری %s در %sبرای لغو خطایابی از دستور «Stop» استفاده کنیدبه جای پنجره فایل Zenity از Tk استفاده کنیدمقدارشناسه مقدارمتغیرهاتغییرات نسخه‌‌هانسخه‌ای که نصب خواهد شدنماوقتی که فایل %s را در مرورگر فایل تانی دوبار کلیک شد، چه شود؟تانی از کدام مفسر یا دستگاه برای اجرای کد شما استفاده کند؟با مفسر فعلی فقط می توانید بسته‌ها را در اینجا ببینید. برای نصب، ارتقاء و یا حذف به «ابزارها ← باز کردن شِل سیستم» بروید.درحال کار کردن...شکستن خطوط (ممکن است کمی کند باشد)باید وارد شویدباید فایلی را انتخاب کنید!قبل از راه‌اندازی مدیریت بسته‌ها، باید برنامه خود را متوقف کنید.مفسر شما در لیست نیست؟بزرگنماییهمه فایل‌هاو غیرهبایت‌هافضای آزاداینجانام دستگاه خود، «USB Serial» یا «UART» را مشخص کنیدبدون پوشه مشخص (مطلق) lib در sys.pathاندکی صبر...پشتیبانی از استایل‌ها و رنگ‌های ANSI سادهبرای مشخص کردن و نصب بسته از فایل (معمولا با پسوندهای whl. یا tar.gz و یا zip.)برای مشخص کردن محل فایل requirements.txt و نصب بسته‌های مشخص شده در آن.فضای کلانتهای متن بسته نیستفضای استفاده شدهبسته‌های سایت کاربرمحیط مجازی././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/fa_IR/LC_MESSAGES/thonny.po0000664000175000017500000015765514276461532022106 0ustar00annamaaannamaamsgid "" msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: POEditor.com\n" "Project-Id-Version: Thonny\n" "Language: fa\n" #: thonny/workbench.py:357 msgid "File" msgstr "فایل" #: thonny/workbench.py:358 msgid "Edit" msgstr "ویرایش" #: thonny/workbench.py:359 msgid "View" msgstr "نما" #: thonny/running.py:122 thonny/workbench.py:360 msgid "Run" msgstr "اجرا" #: thonny/workbench.py:361 msgid "Tools" msgstr "ابزارها" #: thonny/plugins/help/__init__.py:74 thonny/workbench.py:362 msgid "Help" msgstr "راهنما" #: thonny/plugins/cpython/__init__.py:610 msgid "Alternative Python 3 interpreter or virtual environment" msgstr "سایر مفسرهای پایتون 3 و یا محیط مجازی" #: thonny/plugins/cpython/__init__.py:618 msgid "A special virtual environment (deprecated)" msgstr "یک محیط مجازی ویژه (منسوخ شده)" #: thonny/workbench.py:582 msgid "Exit" msgstr "خروج" #: thonny/workbench.py:609 msgid "Decrease font size" msgstr "فونت کوچک‌تر شود" #: thonny/workbench.py:621 msgid "Focus editor" msgstr "برو به ویرایشگر" #: thonny/workbench.py:630 msgid "Focus shell" msgstr "برو به شِل" #: thonny/workbench.py:641 msgid "Maximize view" msgstr "نمای کامل" #: thonny/workbench.py:653 msgid "Full screen" msgstr "تمام صفحه" #: thonny/workbench.py:1377 msgid "Program arguments" msgstr "ورودی‌های برنامه" #: thonny/plugins/about.py:28 thonny/plugins/about.py:163 msgid "About Thonny" msgstr "درباره تانی" #: thonny/plugins/about.py:81 msgid "Made in\n" "University of Tartu, Estonia,\n" "with the help from\n" "open-source community,\n" "Raspberry Pi Foundation\n" "and Cybernetica AS" msgstr "ساخته شده در\n" " دانشگاه Tartu، کشور استونی\n" " با کمک از جامعه متن باز،\n" " بنیاد رزبری پای \n" "و Cybernetica AS" #: thonny/plugins/about.py:107 msgid "This program comes with\n" "ABSOLUTELY NO WARRANTY!\n" "It is free software, and you are welcome to\n" "redistribute it under certain conditions, see\n" "https://opensource.org/licenses/MIT\n" "for details" msgstr "این برنامه بدون \n" "هیچگونه ضمانتی است!\n" "این نرم افزار رایگان است و می‌توانید آن را تحت شرایط تعیین شده،\n" "باز توزیع نمایید. برای جزئیات بیشتر به آدرس زیر مراجعه کنید:\n" "https://opensource.org/licenses/MIT" #: thonny/plugins/about.py:152 msgid "Version history" msgstr "تغییرات نسخه‌‌ها" #: thonny/plugins/about.py:159 msgid "Report problems" msgstr "گزارش مشکلات" #: thonny/plugins/assistant_config_page.py:16 msgid "Open Assistant automatically when program crashes with an exception" msgstr "اجرای خودکار دستیار در هنگام اجرا نشدن برنامه همرا خطا" #: thonny/plugins/assistant_config_page.py:23 msgid "Open Assistant automatically when it has warnings for your code" msgstr "اجرای خودکار دستیار در هنگام داشتن هشدارهایی در برنامه" #: thonny/plugins/assistant_config_page.py:30 msgid "Perform selected Pylint checks" msgstr "بررسی Pylint انتخابی" #: thonny/plugins/assistant_config_page.py:34 msgid "Perform MyPy checks" msgstr "بررسی MyPy" #: thonny/plugins/assistant_config_page.py:36 msgid "Disabled checks (one id per line)" msgstr "لغو بررسی (یک شناسه در هر خط)" #: thonny/assistance.py:968 thonny/plugins/assistant_config_page.py:73 msgid "Assistant" msgstr "دستیار" #: thonny/plugins/autocomplete.py:333 msgid "Auto-complete" msgstr "تکمیل خودکار" #: thonny/plugins/backend_config_page.py:84 msgid "Which interpreter or device should Thonny use for running your code?" msgstr "تانی از کدام مفسر یا دستگاه برای اجرای کد شما استفاده کند؟" #: thonny/plugins/backend_config_page.py:320 msgid "Interpreter" msgstr "مفسر" #: thonny/plugins/birdseye_frontend.py:54 msgid "About Birdseye" msgstr "درباره Birdseye" #: thonny/plugins/birdseye_frontend.py:55 msgid "Birdseye is a Python debugger which needs to be installed separately.\n" "\n" "Do you want to open the help page and learn more?" msgstr "Birdseye یک خطایاب پایتون است و بایستی جداگانه نصب شود.\n" "\n" "آیا می‌خواهید صفحه راهنمای را باز کنید و بیشتر بدانید؟" #: thonny/plugins/birdseye_frontend.py:83 msgid "Debug current script (birdseye)" msgstr "خطایابی همین اسکریپت (birdseye)" #: thonny/plugins/commenting_indenting.py:172 msgid "Toggle comment" msgstr "تغییر وضعیت توضیحات" #: thonny/plugins/commenting_indenting.py:182 msgid "Comment out" msgstr "کد به توضیح" #: thonny/plugins/commenting_indenting.py:192 msgid "Uncomment" msgstr "توضیح به کد" #: thonny/plugins/common_editing_commands.py:21 msgid "Undo" msgstr "واگرد" #: thonny/plugins/common_editing_commands.py:33 msgid "Redo" msgstr "بازانجام" #: thonny/plugins/common_editing_commands.py:49 thonny/ui_utils.py:2176 msgid "Cut" msgstr "برش" #: thonny/plugins/common_editing_commands.py:61 thonny/ui_utils.py:2177 msgid "Copy" msgstr "کپی" #: thonny/plugins/common_editing_commands.py:73 thonny/ui_utils.py:2178 msgid "Paste" msgstr "جای‌گذاری" #: thonny/plugins/common_editing_commands.py:85 thonny/plugins/debugger.py:152 msgid "Select all" msgstr "انتخاب همه" #: thonny/plugins/debugger.py:145 thonny/plugins/debugger.py:1398 msgid "Run to cursor" msgstr "اجرا تا نشانگر" #: thonny/plugins/debugger.py:980 msgid "Can't close yet" msgstr "هنوز قابل بستن نیست" #: thonny/plugins/debugger.py:981 msgid "Use \"Stop\" command if you want to cancel debugging" msgstr "برای لغو خطایابی از دستور «Stop» استفاده کنید" #: thonny/plugins/dock_user_windows_frontend.py:28 msgid "Dock user windows" msgstr "ثابت‌ کردن محل پنجره‌های شما" #: thonny/plugins/editor_config_page.py:15 msgid "Highlight matching names" msgstr "نمایان کردن نام‌های یکسان" #: thonny/plugins/editor_config_page.py:21 msgid "Highlight local variables" msgstr "نمایان کردن متغیرهای محلی" #: thonny/plugins/editor_config_page.py:26 msgid "Highlight parentheses" msgstr "نمایان کردن پرانتزها" #: thonny/plugins/editor_config_page.py:27 msgid "Highlight syntax elements" msgstr "نمایان کردن اجزای دستور" #: thonny/plugins/editor_config_page.py:31 msgid "Highlight current line (requires reopening the editor)" msgstr "نمایان کردن خط فعلی (باید دوباره ویرایشگر را باز کنید)" #: thonny/plugins/editor_config_page.py:36 msgid "Allow code completion with Tab-key in editors" msgstr "اجازه تکمیل کد با زدن دکمه Tab در ویرایشگر" #: thonny/plugins/editor_config_page.py:42 msgid "Allow code completion with Tab-key in Shell" msgstr "اجازه تکمیل کد با زدن دکمه Tab در شِل" #: thonny/plugins/editor_config_page.py:51 msgid "Show line numbers" msgstr "نمایش شماره خطوط" #: thonny/plugins/editor_config_page.py:54 msgid "Recommended maximum line length\n" "(Set to 0 to turn off margin line)" msgstr "حداکثر طول خط پیشنهادی\n" "(برای خاموش کردن خط حاشیه روی 0 تنظیم کنید)" #: thonny/plugins/editor_config_page.py:75 msgid "Editor" msgstr "ویرایشگر" #: thonny/plugins/event_logging.py:206 msgid "Export usage logs..." msgstr "ذخیره وقایع ثبت شده..." #: thonny/plugins/event_view.py:39 msgid "Events" msgstr "رویدادها" #: thonny/plugins/files.py:551 msgid "Files" msgstr "فایل‌ها" #: thonny/plugins/find_replace.py:57 thonny/plugins/find_replace.py:416 msgid "Find & Replace" msgstr "یافتن و جایگزینی" #: thonny/plugins/find_replace.py:63 msgid "Find:" msgstr "یافتن" #: thonny/plugins/find_replace.py:74 msgid "Replace with:" msgstr "جایگزین شود با:" #: thonny/plugins/find_replace.py:92 msgid "Case sensitive" msgstr "حساس به حروف کوچک و بزرگ انگلیسی" #: thonny/plugins/find_replace.py:99 msgid "Up" msgstr "رو به بالا" #: thonny/plugins/find_replace.py:103 msgid "Down" msgstr "رو به پایین" #: thonny/plugins/find_replace.py:112 msgid "Find" msgstr "یافتن" #: thonny/plugins/find_replace.py:122 msgid "Replace" msgstr "جایگزینی" #: thonny/plugins/find_replace.py:130 msgid "Replace+Find" msgstr "جایگزین و یافتن بعدی" #: thonny/plugins/find_replace.py:140 msgid "Replace all" msgstr "جایگزینی همه" #: thonny/plugins/find_replace.py:236 msgid "Enter string to be replaced." msgstr "متنی را جهت جایگزینی وارد کنید." #: thonny/plugins/find_replace.py:320 msgid "The specified text was not found!" msgstr "متن تعیین شده یافت نشد!" #: thonny/plugins/general_config_page.py:15 msgid "Allow only single Thonny instance" msgstr "فقط یکبار اجرای تانی مجاز است" #: thonny/plugins/general_config_page.py:22 msgid "Reopen all files from previous session" msgstr "تمام فایلها‌ی اجرای قبلی برنامه را دوباره باز شود" #: thonny/plugins/general_config_page.py:37 msgid "Disable notification sound" msgstr "هشدارهای صوتی غیرفعال شود" #: thonny/plugins/general_config_page.py:86 msgid "Font scaling mode" msgstr "مقیاس اندازه فونت" #: thonny/plugins/heap.py:37 msgid "Heap mode is on.\n" "Close Heap view to turn it off." msgstr "حالت هیپ فعال است.\n" "برای بستن آن باید نمای هیپ را ببندید." #: thonny/plugins/heap.py:86 msgid "Heap" msgstr "هیپ" #: thonny/plugins/general_config_page.py:53 msgid "Language" msgstr "زبان" #: thonny/plugins/notes.py:35 msgid "This box is meant for your working notes -- assignment instructions, code snippets, whatever.\n" "\n" "Everything will be saved automatically and loaded when you open Thonny next time.\n" "\n" "Feel free to delete this text to make room for your own notes." msgstr "این قسمت برای یادداشت‌های کاری شما، مقداردهی‌ها ، قطعه کد و یا هر یادداشت دلخواه دیگری است.\n" "\n" "هر چیزی در آن به صورت خودکار ذخیره خواهد شد و در اجرای بعدی تانی نمایش داده می‌شود.\n" "\n" "می‌توانید همین متن را برای داشتن فضای بیشتر، پاک کنید." #: thonny/plugins/notes.py:63 msgid "Notes" msgstr "یادداشت‌ها" #: thonny/plugins/object_inspector.py:111 msgid "Previous object" msgstr "شیء قبلی" #: thonny/plugins/object_inspector.py:114 msgid "Next object" msgstr "شیء بعدی" #: thonny/plugins/object_inspector.py:704 msgid "Object inspector" msgstr "بازرس اشیاء" #: thonny/plugins/outline.py:138 msgid "Outline" msgstr "طرح کلی" #: thonny/plugins/pgzero_frontend.py:27 msgid "Pygame Zero mode" msgstr "حالت Pygame Zero" #: thonny/plugins/pip_gui.py:78 msgid "Find package from PyPI" msgstr "یافتن بسته از PyPI" #: thonny/plugins/pip_gui.py:76 msgid "Uninstall" msgstr "حذف برنامه" #: thonny/editors.py:587 thonny/plugins/pip_gui.py:228 thonny/ui_utils.py:448 #: thonny/ui_utils.py:1755 thonny/workdlg.py:155 msgid "Close" msgstr "بستن" #: thonny/plugins/pip_gui.py:347 msgid "Click " msgstr "کلیک" #: thonny/plugins/pip_gui.py:348 thonny/plugins/pip_gui.py:382 msgid "here" msgstr "اینجا" #: thonny/plugins/pip_gui.py:73 msgid "Upgrade" msgstr "به روز رسانی" #: thonny/plugins/esp/__init__.py:365 #: thonny/plugins/micropython/uf2dialog.py:94 thonny/plugins/pip_gui.py:70 msgid "Install" msgstr "نصب برنامه" #: thonny/plugins/pip_gui.py:491 msgid "Could not find the package from PyPI." msgstr "بسته مورد نظر در PyPI پیدا نشد." #: thonny/plugins/pip_gui.py:511 msgid "Latest stable version" msgstr "آخرین نسخه پایدار" #: thonny/plugins/pip_gui.py:513 msgid "Latest version" msgstr "آخرین نسخه" #: thonny/plugins/pip_gui.py:514 msgid "Summary" msgstr "خلاصه" #: thonny/plugins/pip_gui.py:515 msgid "Author" msgstr "سازنده" #: thonny/plugins/pip_gui.py:516 msgid "Homepage" msgstr "صفحه اصلی سایت" #: thonny/plugins/pip_gui.py:518 msgid "Bugtracker" msgstr "خطایاب" #: thonny/plugins/pip_gui.py:520 msgid "Documentation" msgstr "مستندات" #: thonny/plugins/pip_gui.py:522 msgid "PyPI page" msgstr "صفحه PyPI" #: thonny/plugins/pip_gui.py:526 msgid "Requires" msgstr "الزامات" #: thonny/plugins/pip_gui.py:652 msgid "Really uninstall?" msgstr "واقعا برنامه را حذف می‌کنید؟" #: thonny/plugins/pip_gui.py:657 msgid "Are you sure you want to uninstall it?" msgstr "آیا از اینکه می‌خواهید آن برنامه را حذف کنید، مطمئن هستید؟" #: thonny/plugins/variables.py:19 msgid "Back to\n" "current frame" msgstr "بازگشت به فریم فعلی" #: thonny/plugins/variables.py:73 thonny/plugins/variables.py:75 #: thonny/plugins/variables.py:138 msgid "Variables" msgstr "متغیرها" #: thonny/base_file_browser.py:1313 msgid "This computer" msgstr "این کامپیوتر" #: thonny/base_file_browser.py:618 msgid "Refresh" msgstr "تازه سازی" #: thonny/base_file_browser.py:631 msgid "Focus into" msgstr "برو به" #: thonny/base_file_browser.py:1164 msgid "Error" msgstr "خطا" #: thonny/base_file_browser.py:1164 msgid "You need to select a file!" msgstr "باید فایلی را انتخاب کنید!" #: thonny/base_file_browser.py:1168 msgid "Overwrite?" msgstr "جایگزین شود؟" #: thonny/base_file_browser.py:1168 msgid "Do you want to overwrite '%s' ?" msgstr "آیا می‌خواهید بر روی «%s» جایگزین شود؟" #: thonny/editors.py:552 thonny/editors.py:554 msgid "New" msgstr "جدید" #: thonny/editors.py:565 msgid "Open..." msgstr "باز کردن..." #: thonny/editors.py:567 msgid "Load" msgstr "بارگذاری" #: thonny/editors.py:576 msgid "Recent files" msgstr "آخرین فایل‌ها" #: thonny/editors.py:598 thonny/ui_utils.py:450 msgid "Close all" msgstr "بستن همه" #: thonny/editors.py:608 thonny/editors.py:610 msgid "Save" msgstr "ذخیره" #: thonny/editors.py:633 msgid "Save as..." msgstr "ذخیره با نام..." #: thonny/editors.py:644 msgid "Save copy..." msgstr "ذخیره یک کپی .." #: thonny/editors.py:653 msgid "Rename..." msgstr "تغییر نام..." #: thonny/config_ui.py:19 msgid "Thonny options" msgstr "تنظیمات تانی" #: thonny/running.py:121 msgid "Run current script" msgstr "اجرای این اسکریپت" #: thonny/running.py:152 msgid "Run current script in terminal" msgstr "اجرای این اسکریپت در ترمینال" #: thonny/running.py:165 msgid "Stop/Restart backend" msgstr "توقف/ اجرای دوباره هسته" #: thonny/running.py:166 msgid "Stop" msgstr "توقف" #: thonny/running.py:177 msgid "Interrupt execution" msgstr "قطع اجرا" #: thonny/running.py:190 msgid "Send EOF / Soft reboot" msgstr "ارسال EOF/ ریبوت نرم" #: thonny/running.py:201 msgid "Disconnect" msgstr "قطع اتصال" #: thonny/running_config_page.py:23 msgid "Known interpreters" msgstr "مفسرهای مشهور" #: thonny/running_config_page.py:36 msgid "Your interpreter isn't in the list?" msgstr "مفسر شما در لیست نیست؟" #: thonny/plugins/cpython/__init__.py:391 msgid "NB! Thonny only supports Python 3.5 and later" msgstr "توجه مهم! تانی فقط از پایتون 3.5 به بعد پشتیبانی می‌کند" #: thonny/running_config_page.py:56 msgid "Create new virtual environment" msgstr "ایجاد محیط مجازی جدید" #: thonny/running_config_page.py:59 msgid "Select existing or create a new empty directory" msgstr "پوشه‌ای را انتخاب کنید و یا یک پوشه خالی بسازید" #: thonny/plugins/cpython/__init__.py:419 msgid "Python interpreters" msgstr "مفسرهای پایتون" #: thonny/plugins/cpython/__init__.py:420 thonny/plugins/pip_gui.py:696 #: thonny/plugins/pip_gui.py:709 msgid "all files" msgstr "همه فایل‌ها" #: thonny/plugins/cpython/__init__.py:442 msgid "Select empty directory for new virtual environment" msgstr "برای محیط مجازی جدید بایستی پوشه‌ای خالی را انتخاب کنید" #: thonny/plugins/cpython/__init__.py:449 msgid "Bad directory" msgstr "پوشه نامناسب" #: thonny/plugins/cpython/__init__.py:450 msgid "Selected directory is not empty.\n" "Select another or cancel." msgstr "پوشه انتخاب شده خالی نیست.\n" "یکی دیگر را انتخاب کنید و یا لغو کنید." #: thonny/plugins/cpython/__init__.py:467 msgid "Creating virtual environment" msgstr "ساخت یک محیط مجازی" #: thonny/shell.py:83 msgid "Clear shell" msgstr "پاک کردن شِل" #: thonny/shell.py:138 msgid "Plotter" msgstr "نمودار" #: thonny/shell.py:269 msgid "Clear" msgstr "پاک کن" #: thonny/shell.py:282 msgid "Show Plotter" msgstr "نمایش نمودار" #: thonny/shell.py:1572 msgid "For performance reasons, Shell avoids showing very long lines in full (see Tools => Options => Shell).\n" "Here you can interact with the original text fragment." msgstr "برای بهبود کارآیی، شِل از نمایش خطوط بلند به صورت کامل خودداری می‌کند \n" "(به ابزارها ← تنظیمات ← شِل بروید).\n" "از اینجا می توانید با قسمتی از متن اصلی کار کنید." #: thonny/shell.py:1583 msgid "Wrap text (may be slow)" msgstr "شکستن خطوط (ممکن است کمی کند باشد)" #: thonny/ui_utils.py:1750 msgid "Copy to clipboard" msgstr "کپی در حافظه موقت" #: thonny/shell.py:1431 msgid "Expand in Shell" msgstr "بسط دادن در شِل" #: thonny/shell.py:1625 msgid "Squeezed text (%d characters)" msgstr "متن فشرده شده (شامل %d کاراکتر)" #: thonny/shell.py:1794 msgid "Plotter visualizes series of\n" "numbers printed to the Shell." msgstr "نموداری به صورت گرافیکی اعدادی که در شِل چاپ می‌شوند را نمایش می‌دهد." #: thonny/shell.py:1796 msgid "See Help for details." msgstr "برای جزئیات، راهنما را ببینید." #: thonny/ui_utils.py:449 msgid "Close others" msgstr "بستن بقیه" #: thonny/ui_utils.py:1606 msgid "Copying" msgstr "درحال کپی" #: thonny/ui_utils.py:1609 msgid "Copying\n" " %s\n" "to\n" " %s" msgstr "کپی\n" " %s\n" "در\n" " %s" #: thonny/base_file_browser.py:1133 thonny/config_ui.py:36 thonny/export.py:28 #: thonny/plugins/backend_config_page.py:273 thonny/plugins/pip_gui.py:1146 #: thonny/ui_utils.py:114 thonny/ui_utils.py:1617 thonny/ui_utils.py:1702 #: thonny/workdlg.py:157 thonny/workdlg.py:201 msgid "Cancel" msgstr "لغو" #: thonny/base_file_browser.py:1130 thonny/config_ui.py:35 thonny/export.py:25 #: thonny/plugins/about.py:120 thonny/plugins/backend_config_page.py:268 #: thonny/ui_utils.py:111 thonny/ui_utils.py:1699 thonny/workdlg.py:198 msgid "OK" msgstr "تایید" #: thonny/ui_utils.py:1783 msgid "Cancel the process?" msgstr "این پردازش لغو شود؟" #: thonny/ui_utils.py:1784 msgid "The process is still running.\n" "Are you sure you want to cancel?" msgstr "پردازش هنوز در حال اجراست.\n" "آیا از لغو آن اطمینان دارید؟" #: thonny/ui_utils.py:2182 msgid "Select All" msgstr "انتخاب همه" #: thonny/plugins/shell_config_page.py:73 thonny/workbench.py:158 msgid "Shell" msgstr "شِل" #: thonny/plugins/cpython/__init__.py:602 msgid "The same interpreter which runs Thonny (default)" msgstr "همان مفسری که تانی را اجرا می کند (پیش فرض)" #: thonny/plugins/cpython/__init__.py:350 msgid "This virtual environment is automatically maintained by Thonny.\n" "" msgstr "این محیط مجازی به طور خودکار توسط تانی نگهداری می شود." #: thonny/plugins/cpython/__init__.py:351 msgid "Location: " msgstr "محل:" #: thonny/workbench.py:592 msgid "Options..." msgstr "تنظیمات..." #: thonny/workbench.py:599 msgid "Increase font size" msgstr "فونت درشت‌تر شود" #: thonny/workbench.py:664 msgid "Change font size" msgstr "تغییر اندازه فونت" #: thonny/workbench.py:665 msgid "Zoom" msgstr "بزرگنمایی" #: thonny/workbench.py:674 msgid "Exit Thonny" msgstr "خروج از Thonny" #: thonny/workbench.py:677 msgid "Quit" msgstr "خروج" #: thonny/workbench.py:1181 thonny/workbench.py:1189 msgid "Overwriting theme '%s'" msgstr "در حال بازنویسی قالب «%s»" #: thonny/workbench.py:1348 msgid "Program arguments:" msgstr "ورودی‌های برنامه:" #: thonny/workbench.py:1402 msgid "Regular mode" msgstr "حالت عادی" #: thonny/workbench.py:1403 msgid "Configuration has been updated. Restart Thonny to start working in regular mode.\n" "\n" "(See 'Tools → Options → General' if you change your mind later.)" msgstr "تنظیمات بروز رسانی شد. برای شروع کار در محیط عادی، تانی را مجدد اجرا کنید.\n" "\n" "(اگر نظرتان عوض شد، از «ابزارها ← تنظیمات ← عمومی» را انتخاب کنید)" #: thonny/plugins/ast_view.py:210 msgid "Program tree" msgstr "درخت برنامه" #: thonny/plugins/backend_config_page.py:323 msgid "Select interpreter" msgstr "انتخاب مفسر" #: thonny/plugins/debugger.py:1280 msgid "Resume" msgstr "ادامه" #: thonny/plugins/debugger.py:1296 msgid "Run / resume" msgstr "اجرا / ادامه" #: thonny/plugins/debugger.py:1311 msgid "Debug current script" msgstr "خطایابی این اسکریپت" #: thonny/plugins/debugger.py:1313 msgid "Debug" msgstr "خطایابی" #: thonny/plugins/debugger.py:1324 msgid "Debug current script (nicer)" msgstr "خطایابی همین اسکریپت (مبتدی)" #: thonny/plugins/debugger.py:1336 msgid "Debug current script (faster)" msgstr "خطایابی همین اسکریپت (سریع)" #: thonny/plugins/debugger.py:1347 msgid "Step over" msgstr "گام بعدی" #: thonny/plugins/debugger.py:1349 msgid "Over" msgstr "بعدی" #: thonny/plugins/debugger.py:1360 msgid "Step into" msgstr "گامی به داخل" #: thonny/plugins/debugger.py:1362 msgid "Into" msgstr "داخل" #: thonny/plugins/debugger.py:1373 msgid "Step out" msgstr "گامی به خارج" #: thonny/plugins/debugger.py:1375 msgid "Out" msgstr "بیرون" #: thonny/plugins/debugger.py:1410 msgid "Step back" msgstr "گامی به عقب" #: thonny/plugins/debugger.py:1412 msgid "Back" msgstr "عقب" #: thonny/plugins/debugger.py:1418 msgid "Stack" msgstr "اِستک" #: thonny/plugins/debugger.py:1419 msgid "Exception" msgstr "استثناء" #: thonny/plugins/general_config_page.py:18 msgid "Log program usage events" msgstr "ثبت رویداد‌های استفاده از برنامه" #: thonny/plugins/general_config_page.py:43 msgid "Debug mode (provides more detailed diagnostic logs)" msgstr "حالت خطایابی (ثبت خطایابی‌ها با جزئیات بیشتر)" #: thonny/plugins/general_config_page.py:67 msgid "UI mode" msgstr "حالت ظاهری برنامه" #: thonny/plugins/general_config_page.py:80 msgid "UI scaling factor" msgstr "ضریب اندازه ظاهر برنامه" #: thonny/plugins/general_config_page.py:108 msgid "NB! Restart Thonny after changing these options!" msgstr "توجه مهم! بعد از تغییر این گزینه‌ها باید تانی را دوباره باز کنید!" #: thonny/plugins/general_config_page.py:129 msgid "General" msgstr "عمومی" #: thonny/plugins/pip_gui.py:129 msgid "INSTALL" msgstr "نصب برنامه" #: thonny/plugins/pip_gui.py:365 msgid "Browse the packages" msgstr "مرور بسته‌ها" #: thonny/plugins/pip_gui.py:368 msgid "With current interpreter you can only browse the packages here.\n" "Use 'Tools → Open system shell...' for installing, upgrading or uninstalling." msgstr "با مفسر فعلی فقط می توانید بسته‌ها را در اینجا ببینید.\n" "برای نصب، ارتقاء و یا حذف به «ابزارها ← باز کردن شِل سیستم» بروید." #: thonny/plugins/pip_gui.py:376 msgid "Packages' directory" msgstr "پوشه‌ی بسته‌ها" #: thonny/plugins/pip_gui.py:333 msgid "Install from PyPI" msgstr "نصب برنامه از PyPI" #: thonny/plugins/pip_gui.py:336 msgid "If you don't know where to get the package from, then most likely you'll want to search the Python Package Index. Start by entering the name of the package in the search box above and pressing ENTER." msgstr "اگر نمی دانید بسته را باید از کجا بگیرید، به احتمال زیاد بخواهید تا فهرست بسته‌های پایتون را جستجو کنید. ابتدا نام بسته را در قسمت جستجو وارد کنید و سپس کلید Enter را بزنید." #: thonny/plugins/pip_gui.py:352 msgid "to locate requirements.txt file and install the packages specified in it." msgstr "برای مشخص کردن محل فایل requirements.txt و نصب بسته‌های مشخص شده در آن." #: thonny/plugins/pip_gui.py:381 msgid "Click" msgstr "کلیک" #: thonny/plugins/pip_gui.py:386 msgid "to locate and install the package file (usually with .whl, .tar.gz or .zip extension)." msgstr "برای مشخص کردن و نصب بسته از فایل (معمولا با پسوندهای whl. یا tar.gz و یا zip.)" #: thonny/plugins/micropython/pip_gui.py:243 thonny/plugins/pip_gui.py:393 msgid "Upgrade or uninstall" msgstr "ارتقاء یا حذف برنامه" #: thonny/plugins/pip_gui.py:395 msgid "Start by selecting the package from the left." msgstr "با انتخاب بسته‌ای از سمت چپ شروع کنید." #: thonny/plugins/pip_gui.py:399 msgid "Target:" msgstr "مقصد:" #: thonny/plugins/pip_gui.py:401 msgid "virtual environment" msgstr "محیط مجازی" #: thonny/plugins/pip_gui.py:403 msgid "user site packages" msgstr "بسته‌های سایت کاربر" #: thonny/plugins/pip_gui.py:407 msgid "This dialog lists all available packages, but allows upgrading and uninstalling only packages from" msgstr "این پنجره تمام بسته های موجود را لیست می کند، اما فقط اجازه می‌دهد تا ارتقا و حذف بسته از مسیر زیر انجام شود" #: thonny/plugins/pip_gui.py:417 msgid "New packages will be also installed into this directory. Other locations must be managed by alternative means." msgstr "بسته‌های جدید در این پوشه نصب خواهند شد. مسیرهای دیگر باید با سایر روش‌ها مدیریت شود." #: thonny/plugins/pip_gui.py:441 msgid "Installed version:" msgstr "نسخه نصب شده:" #: thonny/plugins/micropython/pip_gui.py:147 thonny/plugins/pip_gui.py:443 msgid "Installed to:" msgstr "نصب در:" #: thonny/plugins/pip_gui.py:494 msgid "Please check your spelling!" msgstr "لطفا غلط املائی را بررسی کنید!" #: thonny/plugins/pip_gui.py:512 msgid "You need to enter" msgstr "باید وارد شوید" #: thonny/plugins/pip_gui.py:498 msgid "Could not find the package info from PyPI." msgstr "این بسته در PyPI یافت نشد." #: thonny/plugins/pip_gui.py:500 thonny/plugins/pip_gui.py:1200 msgid "Error code:" msgstr "کد خطا:" #: thonny/plugins/pip_gui.py:601 msgid "Can't find package name from the list:" msgstr "بسته در فهرست زیر یافت نشد:" #: thonny/plugins/pip_gui.py:653 msgid "Package '{}' is required for installing and uninstalling other packages." msgstr "بسته «{}» برای نصب و یا حذف سایر بسته‌ها مورد نیاز است." #: thonny/plugins/pip_gui.py:696 msgid "Package" msgstr "بسته" #: thonny/plugins/pip_gui.py:796 msgid "Manage packages for %s" msgstr "مدیریت بسته‌های %s" #: thonny/plugins/pip_gui.py:872 msgid "Confirmation" msgstr "تایید" #: thonny/plugins/pip_gui.py:873 msgid "Looks like you are installing a Thonny-related package.\n" "If you meant to install a Thonny plugin, then you should\n" "choose 'Tools → Manage plugins...' instead\n" "\n" "Are you sure you want to install %s for the back-end?" msgstr "به نظر می رسد شما در حال نصب یکی از بسته‌های تانی هستنید.\n" "اگر قصد نصب پلاگینی برای تانی را دارید باید از «ابزارهای ← مدیریت افزونه‌ها...» اقدام کنید.\n" "\n" "آیا از نصب %s برای هسته کاملا مطمئن هستید؟" #: thonny/plugins/pip_gui.py:981 msgid "NB! There may be another version available which is compatible with current Thonny version. Click on '...' button to choose the version to install." msgstr "توجه مهم! ممکن است نسخه دیگری موجود باشد که با نسخه فعلی تانی سازگار باشد. برای انتخاب نسخه مورد نظرتان برای نصب، بر روی دکمه «...» کلیک کنید." #: thonny/plugins/pip_gui.py:989 msgid "Thonny plugin without requirements" msgstr "افزودنی‌های تانی بدون پیش‌نیاز" #: thonny/plugins/pip_gui.py:990 msgid "Looks like you are trying to install an outdated Thonny\n" "plug-in (it doesn't specify required Thonny version).\n" "\n" "If you still want it, then please install it from the command line." msgstr "به نظر می رسد که شما در حال نصب یک افزونه قدیمی تانی هستید (نسخه مورد نیاز تانی را مشخص نمی کند).\n" "\n" "اگر واقعا آن را می خواهید ، لطفاً توسط خط فرمان آن را نصب کنید." #: thonny/plugins/pip_gui.py:1004 msgid "Unsuitable requirements" msgstr "پیش‌نیازهای نامناسب" #: thonny/plugins/pip_gui.py:1005 msgid "This package requires different Thonny version:" msgstr "این بسته به نسخه دیگری از تانی نیاز دارد:" #: thonny/plugins/pip_gui.py:1009 msgid "If you still want it, then please install it from the command line." msgstr "اگر کماکان آن را می‌خواهید ، لطفاً آن را از خط فرمان نصب کنید." #: thonny/plugins/pip_gui.py:1052 msgid "(In this case Thonny's back-end uses same interpreter, so both dialogs manage same packages.)" msgstr "در این حالت هسته تانی از مفسر یکسانی استفاده می کند، بنابراین هر دو پنجره بسته‌های یکسانی را مدیریت می کنند.)" #: thonny/plugins/pip_gui.py:1058 msgid "NB! You need to restart Thonny after installing / upgrading / uninstalling a plug-in." msgstr "توجه مهم! بعد از نصب / ارتقاء / حذف افزونه‌ای، باید تانی را دوباره باز کنید." #: thonny/plugins/pip_gui.py:1068 msgid "Thonny plug-ins" msgstr "افزودنی‌های تانی" #: thonny/plugins/pip_gui.py:1090 msgid "Advanced install / upgrade / downgrade" msgstr "نصب، ارتقاء یا نصب نسخه‌ قدیمی پیشرفته" #: thonny/plugins/pip_gui.py:1099 msgid "Desired version" msgstr "نسخه دلخواه" #: thonny/plugins/pip_gui.py:1137 msgid "Upgrade dependencies" msgstr "به‌روزرسانی پیش‌نیازها" #: thonny/plugins/pip_gui.py:1198 msgid "Requires:" msgstr "مورد نیاز:" #: thonny/plugins/pip_gui.py:1202 msgid "Error:" msgstr "خطا:" #: thonny/plugins/pip_gui.py:1409 msgid "Manage packages..." msgstr "مدیریت بسته‌ها..." #: thonny/plugins/pip_gui.py:1415 msgid "Manage plug-ins..." msgstr "مدیریت افزودنی‌ها..." #: thonny/plugins/replayer.py:365 msgid "Open replayer..." msgstr "باز کردن «بازپخش کننده»" #: thonny/plugins/run_debug_config_page.py:14 msgid "Change working directory to script directory on Run / Debug" msgstr "پوشه فعلی را به پوشه اسکریپت در اجرا / خطایابی تغییر دهید" #: thonny/plugins/run_debug_config_page.py:22 msgid "Show function calls (frames) in separate windows" msgstr "فراخوانی توابع را در پنجره‌های جداگانه (فریم‌ها) نمایش بده" #: thonny/plugins/run_debug_config_page.py:23 msgid "Uncheck if you want more traditional experience." msgstr "اگر می خواهید تجربه سنتی‌تری داشته باشید، غیر فعالش کنید." #: thonny/plugins/run_debug_config_page.py:29 msgid "Open and close Stack view automatically" msgstr "باز و بسته شدن خودکار نمای اِستک" #: thonny/plugins/run_debug_config_page.py:30 msgid "Opens the Stack view on first call and closes it when program returns to main frame." msgstr "نمای اِستک را در اولین فراخوانی نمایش داده و بعد از بازگشت\n" "برنامه به فریم اصلی آن را خواهد بست." #: thonny/plugins/run_debug_config_page.py:39 msgid "Allow stepping into libraries (ie. outside of main script directory)" msgstr "اجازه قدم گذاشتن به داخل کتابخانه‌ها (مانند مواقعی که خارج از پوشه اسکریپت هستید)" #: thonny/plugins/run_debug_config_page.py:40 msgid "May make debugging slower." msgstr "ممکن است خطایابی را کندتر کند." #: thonny/plugins/run_debug_config_page.py:45 msgid "Preferred debugger" msgstr "خطایاب انتخابی" #: thonny/plugins/run_debug_config_page.py:57 msgid "(used when clicking Debug toolbar button)" msgstr "(هنگام کلیک کردن روی دکمه خطایابی استفاده می شود)" #: thonny/plugins/run_debug_config_page.py:62 msgid "Birdseye port" msgstr "پورت Birdseye" #: thonny/plugins/run_debug_config_page.py:66 msgid "(restart Thonny after changing this)" msgstr "(بعد از تغییر این گزینه باید مجدد تانی را اجرا کنید)" #: thonny/plugins/run_debug_config_page.py:74 msgid "Run & Debug" msgstr "اجرا و خطایابی" #: thonny/plugins/shell_config_page.py:17 msgid "Terminal emulation" msgstr "شبیه‌ ساز ترمینال" #: thonny/plugins/shell_config_page.py:19 msgid "supports basic ANSI-colors and styles" msgstr "پشتیبانی از استایل‌ها و رنگ‌های ANSI ساده" #: thonny/plugins/shell_config_page.py:31 msgid "Maximum number of lines to keep." msgstr "نگهداری حداکثر تعداد سطر ممکن." #: thonny/plugins/shell_config_page.py:33 msgid "NB! Large values may cause poor performance!" msgstr "توجه مهم! مقادیر بزرگ ممکن است باعث کاهش کارآیی شوند!" #: thonny/plugins/shell_config_page.py:49 msgid "Maximum length of line fragments before squeezing" msgstr "حداکثر طول یک قطعه از خط قبل از فشرده شدن" #: thonny/plugins/terminal_config_page.py:12 msgid "Running current script in terminal" msgstr "اجرای این اسکریپ در شِل" #: thonny/plugins/terminal_config_page.py:17 msgid "Present Python REPL after program ends" msgstr "نمایش Python REPL بعد از اتمام برنامه" #: thonny/plugins/terminal_config_page.py:24 msgid "Keep terminal window open after Python process ends" msgstr "پنجره ترمینال را بعد از اتمام پردازش پایتون باز نگه دار" #: thonny/plugins/terminal_config_page.py:31 msgid "NB! Automatic closing needs to be enabled in Terminal's settings\n" "(Profiles → Shell → When the shell exits)" msgstr "توجه مهم! بستن خودکار نیاز به فعال سازی تنظیمات ترمینال دارد\n" "(پروفایل ← شِل ← هنگام خروج از شِل)" #: thonny/plugins/terminal_config_page.py:41 msgid "Terminal" msgstr "ترمینال" #: thonny/plugins/theme_and_font_config_page.py:40 msgid "UI theme" msgstr "قالب محیط نرم افزار" #: thonny/plugins/theme_and_font_config_page.py:53 msgid "Syntax theme" msgstr "قالب نوشتار" #: thonny/plugins/theme_and_font_config_page.py:85 msgid "Editor font" msgstr "فونت ویرایشگر" #: thonny/plugins/theme_and_font_config_page.py:108 msgid "IO font" msgstr "فونت IO" #: thonny/plugins/theme_and_font_config_page.py:133 msgid "Preview" msgstr "پیش‌نمایش" #: thonny/plugins/theme_and_font_config_page.py:145 msgid "This is a comment" msgstr "این یک توضیح است" #: thonny/plugins/theme_and_font_config_page.py:148 msgid "The answer is" msgstr "پاسخ" #: thonny/plugins/theme_and_font_config_page.py:152 msgid "unclosed_string" msgstr "انتهای متن بسته نیست" #: thonny/plugins/theme_and_font_config_page.py:154 msgid "blah, blah" msgstr "و غیره" #: thonny/plugins/theme_and_font_config_page.py:177 msgid "NB! Some style elements change only after restarting Thonny!" msgstr "توجه مهم! برخی از تغییرات ظاهری موارد نیاز به اجرای دوباره تانی دارد!" #: thonny/plugins/theme_and_font_config_page.py:216 msgid "Enter an integer" msgstr "عددی صحیح را وارد کنید" #: thonny/plugins/theme_and_font_config_page.py:229 msgid "Theme & Font" msgstr "قالب و فونت" #: thonny/plugins/thonny_folders.py:19 msgid "Open Thonny program folder..." msgstr "نمایش فولدر برنامه تانی" #: thonny/plugins/thonny_folders.py:24 msgid "Open Thonny data folder..." msgstr "نمایش فولدر داده‌های تانی" #: thonny/plugins/help/__init__.py:64 msgid "Home" msgstr "خانه" #: thonny/plugins/help/__init__.py:75 msgid "Help contents" msgstr "محتوای راهنما" #: thonny/plugins/micropython/__init__.py:274 msgid "CircuitPython device" msgstr "دستگاه CircuitPython" #: thonny/plugins/micropython/__init__.py:278 msgid "MicroPython device" msgstr "دستگاه MicroPython" #: thonny/plugins/micropython/__init__.py:476 msgid "Connect your device to the computer and select corresponding port below" msgstr "دستگاه خود را به رایانه متصل کرده و پورت مربوط را از زیر انتخاب کنید" #: thonny/plugins/micropython/__init__.py:479 msgid "look for your device name, \"USB Serial\" or \"UART\"" msgstr "نام دستگاه خود، «USB Serial» یا «UART» را مشخص کنید" #: thonny/plugins/micropython/__init__.py:481 msgid "If you can't find it, you may need to install proper USB driver first." msgstr "اگر آن را پیدا نکردید،احتمالا لازم است که ابتدا درایور USB مناسب را نصب کنید." #: thonny/plugins/micropython/__init__.py:401 msgid "Port" msgstr "پورت" #: thonny/plugins/micropython/__init__.py:411 msgid "Try to detect port automatically" msgstr "شروع تشخیص خودکار پورت" #: thonny/plugins/micropython/__init__.py:954 msgid "MicroPython (generic)" msgstr "MicroPython (عمومی)" #: thonny/plugins/printing/__init__.py:82 msgid "Print..." msgstr "چاپ..." #: thonny/plugins/system_shell/__init__.py:59 msgid "Open system shell..." msgstr "بازکردن شِل سیستم" #: thonny/plugins/backend_config_page.py:103 msgid "Details" msgstr "جزئیات" #: thonny/plugins/pip_gui.py:345 msgid "Install from requirements file" msgstr "نصب از فایل‌های مورد نیاز" #: thonny/plugins/pip_gui.py:380 msgid "Install from local file" msgstr "نصب با فایل‌های موجود" #: thonny/plugins/pip_gui.py:1038 msgid "This dialog is for managing Thonny plug-ins and their dependencies.\n" "If you want to install packages for your own programs then choose 'Tools → Manage packages...'" msgstr "این پنجره برای مدیریت افزونه‌های تانی و وابستگی‌های آنها است.\n" "اگر می‌خواهید که یک بسته را برای برنامه‌تان نصب کنید\n" " باید اینکار را «ابزارها ← مدیریت بسته‌ها» انجام دهید." #: thonny/plugins/circuitpython/__init__.py:163 msgid "CircuitPython (generic)" msgstr "CircuitPython (عمومی)" #: thonny/plugins/commenting_indenting.py:143 msgid "Indent selected lines" msgstr "تورفتگی خطوط انتخابی" #: thonny/plugins/commenting_indenting.py:153 msgid "Dedent selected lines" msgstr "حذف تورفتگی خطوط انتخابی" #: thonny/workbench.py:1391 msgid "Switch to\n" "regular\n" "mode" msgstr "برگشت\n" " به حالت\n" "عادی" #: thonny/plugins/microbit/__init__.py:55 msgid "Make sure MicroPython has been installed to your micro:bit." msgstr "مطمئن شوید که MicroPython بر روی micro:bit شما نصب است..." #: thonny/plugins/microbit/__init__.py:57 msgid "Don't forget that main.py only works without embedded main script." msgstr "دقت کنید که main.py در صورتی کار می‌کند که بدون اسکریپ main باشد." #: thonny/plugins/micropython/uf2dialog.py:45 msgid "please wait" msgstr "اندکی صبر..." #: thonny/plugins/microbit/__init__.py:199 msgid "Done!" msgstr "انجام شد!" #: thonny/plugins/micropython/__init__.py:298 msgid "Firmware" msgstr "سفت‌افزار" #: thonny/misc_utils.py:134 msgid "Could not find disk '%s'. Do you want to locate it yourself?" msgstr "دیسک %s پیدا نشد. آیا مایلید که محل آن را خودتان مشخص کنید؟" #: thonny/misc_utils.py:137 msgid "Found several '%s' disks. Do you want to choose one yourself?" msgstr "چندین دیسک %s پیدا شد. آیا مایلید که خودتان یکی از آنها را انتخاب کنید؟" #: thonny/misc_utils.py:153 msgid "Can't find suitable disk" msgstr "دیسک مناسب یافت نشد" #: thonny/base_file_browser.py:273 msgid "%d items" msgstr "تعداد %d مورد" #: thonny/base_file_browser.py:692 msgid "Move to Recycle Bin" msgstr "انتقال به سطل بازیافت" #: thonny/base_file_browser.py:694 msgid "Move to Trash" msgstr "انتقال به سطل زباله" #: thonny/base_file_browser.py:697 msgid "Delete" msgstr "حذف" #: thonny/base_file_browser.py:700 thonny/base_file_browser.py:834 msgid "New directory" msgstr "پوشه جدید" #: thonny/base_file_browser.py:703 msgid "Properties" msgstr "ویژگی‌ها" #: thonny/base_file_browser.py:705 msgid "Storage space" msgstr "فضای ذخیره" #: thonny/base_file_browser.py:715 msgid "Path" msgstr "مسیر" #: thonny/base_file_browser.py:717 msgid "Directory properties" msgstr "مشخصات پوشه" #: thonny/base_file_browser.py:719 msgid "File properties" msgstr "مشخصات فایل" #: thonny/base_file_browser.py:721 msgid "bytes" msgstr "بایت‌ها" #: thonny/base_file_browser.py:724 msgid "Size" msgstr "اندازه" #: thonny/base_file_browser.py:83 thonny/base_file_browser.py:735 msgid "Modified" msgstr "ویرایش شده" #: thonny/base_file_browser.py:794 msgid "Deleting %s" msgstr "حذف %s" #: thonny/base_file_browser.py:817 msgid "Moving %s to %s" msgstr "انتقال %s به %s" #: thonny/editors.py:219 msgid "Loading" msgstr "در حال بازگذاری" #: thonny/editors.py:335 msgid "Saving" msgstr "در حال ذخیره" #: thonny/running.py:1408 msgid "Working..." msgstr "درحال کار کردن..." #: thonny/plugins/files.py:199 msgid "Uploading %s to %s" msgstr "بارگذاری %s در %s" #: thonny/plugins/files.py:216 msgid "Upload to %s" msgstr "آپلود به %s" #: thonny/plugins/files.py:362 msgid "Downloading %s to %s" msgstr "درحال دانلود %s در %s" #: thonny/plugins/files.py:275 msgid "Download to %s" msgstr "دانلود در %s" #: thonny/base_file_browser.py:620 msgid "Open in system file manager" msgstr "بازکردن در برنامه مدیریت فایل سیستم" #: thonny/base_file_browser.py:625 msgid "Hide hidden files" msgstr "عدم نمایش فایل‌های مخفی" #: thonny/base_file_browser.py:625 msgid "Show hidden files" msgstr "نمایش فایل‌های مخفی" #: thonny/base_file_browser.py:635 msgid "Open in Thonny" msgstr "بازکردن در تانی" #: thonny/base_file_browser.py:640 thonny/base_file_browser.py:661 msgid "Open in system default app" msgstr "بازکردن با نرم افزار پیش‌فرض سیستم" #: thonny/base_file_browser.py:647 thonny/base_file_browser.py:669 msgid "Configure %s files" msgstr "%s فایل تنظیم شد" #: thonny/base_file_browser.py:670 msgid "What to do with a %s file when you double-click it in Thonny's file browser?" msgstr "وقتی که فایل %s را در مرورگر فایل تانی دوبار کلیک شد، چه شود؟" #: thonny/base_file_browser.py:1042 thonny/plugins/micropython/pip_gui.py:77 msgid "Deleting" msgstr "در حال حذف" #: thonny/base_file_browser.py:1049 msgid "Creating directory" msgstr "ساخت پوشه" #: thonny/editors.py:217 msgid "Loading %s" msgstr "در حال بارگذاری %s" #: thonny/editors.py:333 msgid "Saving to %s" msgstr "در حال ذخیره %s" #: thonny/editors.py:622 thonny/editors.py:624 msgid "Save All files" msgstr "ذخیره تمامی فایل‌ها" #: thonny/workbench.py:828 msgid "Configure interpreter..." msgstr "پیکره‌بندی مفسر..." #: thonny/workbench.py:1501 msgid "Device" msgstr "دستگاه" #: thonny/workdlg.py:185 msgid "Cancelling" msgstr "درحال لغو" #: thonny/workdlg.py:212 msgid "Starting" msgstr "درحال شروع" #: thonny/plugins/backend_config_page.py:234 msgid "Authentication" msgstr "احراز هویت" #: thonny/plugins/backend_config_page.py:236 msgid "Enter the passphrase of your private key for\n" "{}" msgstr "برای {} عبارت کلید خصوصی خود را وارد کنید" #: thonny/plugins/backend_config_page.py:239 msgid "Enter your password for\n" "{}" msgstr "برای {} گذرواژه خود را وارد کنید" #: thonny/plugins/object_inspector.py:458 msgid "The representation above is an approximate value of this float. The exact stored value is %s which is about %s" msgstr "مقدار نمایش داده شده در بالا، مقدار تقریبی این عدد اعشاری است. مقدار دقیق ذخیره شده در %s تقریبا %s است." #: thonny/plugins/pip_gui.py:557 msgid "Search results" msgstr "نتایج جستجو" #: thonny/plugins/pip_gui.py:558 msgid "Searching" msgstr "در حال جستجو" #: thonny/plugins/pip_gui.py:639 thonny/plugins/pip_gui.py:729 msgid "Installing '%s'" msgstr "در حال نصب «%s»" #: thonny/plugins/pip_gui.py:645 msgid "Upgrading '%s'" msgstr "در حال ارتقای «%s»" #: thonny/plugins/pip_gui.py:650 msgid "Uninstalling '%s'" msgstr "در حال حذف «%s»" #: thonny/plugins/pip_gui.py:663 msgid "Installing" msgstr "در حال نصب" #: thonny/plugins/pip_gui.py:1372 msgid "Package manager is not available for this interpreter" msgstr "مدیریت بسته برای این مفسر موجود نیست" #: thonny/plugins/pip_gui.py:1385 msgid "Not supported" msgstr "پشتیبانی نمی‌شود" #: thonny/plugins/micropython/pip_gui.py:290 thonny/plugins/pip_gui.py:1390 msgid "Not available" msgstr "موجود نیست" #: thonny/plugins/pip_gui.py:1391 msgid "You need to stop your program before launching the package manager." msgstr "قبل از راه‌اندازی مدیریت بسته‌ها، باید برنامه خود را متوقف کنید." #: thonny/plugins/shell_config_page.py:64 msgid "Open evaluated values in Object inspector" msgstr "نمایش مقدار محاسبه شده را در بازرس اشیاء" #: thonny/plugins/cpython/__init__.py:370 msgid "Python executable" msgstr "فایل اجرایی پایتون" #: thonny/plugins/cpython/__init__.py:393 msgid "NB! File selection button may not work properly when selecting executables\n" "from a virtual environment. In this case choose the 'activate' script instead\n" "of the interpreter (or enter the path directly to the box)!" msgstr "توجه مهم! دکمه انتخاب فایل در هنگام انتخاب فایل‌های اجرایی در محیط مجازی ممکن است به درستی کار نکند. در این صورت اسکریپت «activate» را به جای مفسر انتخاب کنید (و یا مسیر را در قسمت مسیر مستقیما وارد کنید)!" #: thonny/plugins/cpython_ssh/__init__.py:153 msgid "Remote Python 3 (SSH)" msgstr "دسترسی از راه‌ دور پایتون 3 (SSH)" #: thonny/plugins/micropython/__init__.py:284 msgid "Not connected" msgstr "وصل نیست" #: thonny/plugins/micropython/__init__.py:453 msgid "Advanced options" msgstr "تنظیمات پیشرفته" #: thonny/plugins/micropython/__init__.py:460 msgid "Install or update firmware" msgstr "نصب یا بروز رسانی سفت‌ابزار" #: thonny/plugins/micropython/__init__.py:963 msgid "MicroPython (local)" msgstr "میکروپایتون (محلی)" #: thonny/plugins/micropython/__init__.py:973 msgid "MicroPython (SSH)" msgstr "میکروپایتون (SSH)" #: thonny/plugins/micropython/pip_gui.py:134 msgid "Module" msgstr "ماژول" #: thonny/plugins/micropython/pip_gui.py:159 msgid "Shadowed items (not importable):" msgstr "موارد سایه‌دار (وارد نشده‌اند):" #: thonny/plugins/micropython/pip_gui.py:208 msgid "Package is not available at micropython.org. Version at PyPI will be installed." msgstr "این بسته در micropython.org موجود نبود. نسخه موجود در PyPI نصب خواهد شد." #: thonny/plugins/micropython/pip_gui.py:219 msgid "NB! micropython.org has published version %s of this package and this will be installed by default." msgstr "توجه مهم! micropython.org نسخه %s این بسته را منتشر کرده است و به صورت پیش فرض نصب خواهد شد." #: thonny/plugins/micropython/pip_gui.py:245 msgid "For upgrading simply install the package again." msgstr "برای به روزرسانی ساده‌تر، بسته را دوباره نصب کنید." #: thonny/plugins/micropython/pip_gui.py:248 msgid "For uninstalling delete corresponding files." msgstr "برای حذف فایلهای مربوطه را حذف کنید." #: thonny/plugins/micropython/pip_gui.py:262 msgid "Scope" msgstr "میدان دید" #: thonny/plugins/micropython/pip_gui.py:275 msgid "This dialog lists top-level modules from following directories:\n" "" msgstr "این پنجره ماژول‌های سطح بالا را از پوشه‌های زیر لیست می کند:" #: thonny/plugins/micropython/pip_gui.py:284 msgid "New packages will be installed to" msgstr "بسته‌های جدید نصب خواهند شد در" #: thonny/plugins/micropython/pip_gui.py:292 msgid "no absolute lib directory in sys.path" msgstr "بدون پوشه مشخص (مطلق) lib در sys.path" #: thonny/plugins/micropython/uf2dialog.py:40 msgid "Version to be installed" msgstr "نسخه‌ای که نصب خواهد شد" #: thonny/plugins/micropython/uf2dialog.py:48 msgid "Target device location" msgstr "محل دستگاه مقصد" #: thonny/plugins/micropython/uf2dialog.py:59 msgid "Target device model" msgstr "نوع دستگاه مقصد" #: thonny/plugins/micropython/uf2dialog.py:145 msgid "Please wait" msgstr "اندکی صبر..." #: thonny/plugins/pip_gui.py:67 msgid "Search on PyPI" msgstr "جستجو در PyPI" #: thonny/plugins/pip_gui.py:79 msgid "Delete selected" msgstr "حذف انتخاب شده‌ها" #: thonny/base_file_browser.py:662 msgid "Open in Thonny's text editor" msgstr "در ویرایشگر متنی تانی باز شود" #: thonny/base_file_browser.py:325 msgid "Storage space on this drive or filesystem" msgstr "فضای ذخیره سازی در این درایو" #: thonny/base_file_browser.py:326 msgid "total space" msgstr "فضای کل" #: thonny/base_file_browser.py:328 msgid "used space" msgstr "فضای استفاده شده" #: thonny/base_file_browser.py:329 msgid "free space" msgstr "فضای آزاد" #: thonny/base_file_browser.py:336 msgid "Storage info" msgstr "اطلاعات فضای ذخیره سازی" #: thonny/plugins/commenting_indenting.py:163 msgid "Replace tabs with spaces" msgstr "جایگزینی Tabها با فاصله" #: thonny/plugins/editor_config_page.py:28 msgid "Highlight tab characters" msgstr "نمایان کردن Tabها" #: thonny/plugins/editor_config_page.py:47 msgid "Indent with tab characters (not recommended for Python)" msgstr "ایجاد تورفتگی با Tab (در پایتون این کار توصیه نمی‌شود)" #: thonny/base_file_browser.py:81 thonny/memory.py:63 msgid "Name" msgstr "نام" #: thonny/base_file_browser.py:85 msgid "Size (bytes)" msgstr "اندازه (بایت)" #: thonny/base_file_browser.py:835 msgid "Enter name for new directory under\n" "%s" msgstr "نام پوشه جدید که در زیر مجموعه پوشه زیر ساخته خواهد شد را وارد کنید.\n" "%s" #: thonny/base_file_browser.py:858 msgid "Nothing selected" msgstr "چیزی انتخاب نشده است" #: thonny/base_file_browser.py:858 msgid "Select an item and try again!" msgstr "موردی را انتخاب کنید و دوباره امتحان کنید!" #: thonny/base_file_browser.py:1105 msgid "Open from %s" msgstr "باز کردن از %s" #: thonny/base_file_browser.py:1108 msgid "Save to %s" msgstr "ذخیره در %s" #: thonny/base_file_browser.py:1120 msgid "File name:" msgstr "نام فایل:" #: thonny/memory.py:64 thonny/plugins/object_inspector.py:510 #: thonny/plugins/object_inspector.py:589 msgid "Value ID" msgstr "شناسه مقدار" #: thonny/memory.py:65 thonny/plugins/heap.py:23 #: thonny/plugins/object_inspector.py:511 #: thonny/plugins/object_inspector.py:590 msgid "Value" msgstr "مقدار" #: thonny/plugins/backend_config_page.py:257 msgid "Save password" msgstr "ذخیره گذرواژه" #: thonny/plugins/debugger.py:553 msgid "Function call at %s" msgstr "فراخوانی تابع در %s" #: thonny/plugins/debugger.py:1001 msgid "Local variables" msgstr "متغیرهای محلی" #: thonny/plugins/debugger.py:1033 msgid "Function" msgstr "تابع" #: thonny/plugins/debugger.py:1034 msgid "Location" msgstr "محل" #: thonny/plugins/debugger.py:1110 msgid "If last command raised an exception then this view will show the stacktrace." msgstr "اگر آخرین دستور یک خطا را ایجاد کند این نما، stacktrace (ردیاب اِستک) را نمایش می‌دهد." #: thonny/plugins/heap.py:22 msgid "ID" msgstr "شناسه" #: thonny/plugins/object_inspector.py:87 msgid "Data" msgstr "داده" #: thonny/plugins/object_inspector.py:88 msgid "Attributes" msgstr "خواص" #: thonny/plugins/object_inspector.py:509 msgid "Index" msgstr "اندیس" #: thonny/plugins/object_inspector.py:587 msgid "Key ID" msgstr "شناسه کلید" #: thonny/plugins/object_inspector.py:588 msgid "Key" msgstr "کلید" #: thonny/plugins/variables.py:36 msgid "Back to\n" "%s" msgstr "برگرد به %s" #: thonny/plugins/micropython/__init__.py:401 msgid "Port or WebREPL" msgstr "پورت WebREPL" #: thonny/plugins/micropython/__init__.py:518 msgid "Password" msgstr "گذرواژه" #: thonny/plugins/debugger.py:959 msgid "Source code" msgstr "کد اصلی" #: thonny/plugins/general_config_page.py:29 msgid "Use Tk file dialogs instead of Zenity" msgstr "به جای پنجره فایل Zenity از Tk استفاده کنید" #: thonny/plugins/general_config_page.py:30 msgid "Select if the file dialogs end up behind the main window" msgstr "اگر پنجره‌ها پشت پنجره اصلی برنامه قرار می‌گیرد، این گزینه را انتخاب کنید" #: thonny/plugins/general_config_page.py:97 msgid "Environment variables (one KEY=VALUE per line)" msgstr "متغیرهای محیطی (در هر سطر یک مقدار=کلید)" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6701078 thonny-4.0.1/thonny/locale/fi_FI/0000775000175000017500000000000014307363733016412 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1662904282.6901064 thonny-4.0.1/thonny/locale/fi_FI/LC_MESSAGES/0000775000175000017500000000000014307363733020177 5ustar00annamaaannamaa././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1660576602.0 thonny-4.0.1/thonny/locale/fi_FI/LC_MESSAGES/thonny.mo0000664000175000017500000004674514276461532022074 0ustar00annamaaannamaa(\ $* +->!l7    x   #/ 5 ?LG+0B<J%3%Yls !  *05: AM%^/. !- 4> COd it    0%V[6m %L.F{7#)1C Vbv{  z;8 t   1,?0l<-c l q u     ? C$!h!!'!)! !"","G"TO" """" ""H"O#5l###### ###$$$*$ 3$ @$ K$U$f$z$ $B$$$ $$ $& %0% 8%D% ]% k%x%%% %% %%% % % % %& && +& 5& @&K&2i&/&8&':'S' Y'0f'''' ' '''-' +( 5(?( H(R(W( l( y()(((((( )n)0)!) )) **/*!+@+,+, 1,0R,,,,%,, ,,,D,#-C>-#-- - -- -1- . .. +.6.J..1../M/a/8t/;//80@0 I0U0f0n0 00z01/1?1 Q1_1x1111 111 1 12E223 31$3V3v33333<3?4O4g4n4 }4 444!4?45&5 E5S5[5`5h5p5555.56."6Q6 W6 c6n6w6 ~666 66 66 66 77"787S7h7y7777M777: 8F8d888888R8C#9g9~9H99999::3:<:B:Y:_:v::::: :!::};8 <C<.U<$<<<<<<==$=88=Aq=a=3>^I>>>> > > > > > ?? ?C?>`???+?"@ '@3@C@'a@@l@ @ AAA A*AF2AVyA2AB BBB#3B WBcBlBsB BB BB B BB BBBXC mC {CCCC(CC C#C D )D5DDDJDRDbD{DDDDDDD D E E'E/E>E#ME<qE4ECE'FF6F}FF8FFFFF G"G