├── .circleci └── config.yml ├── .gitignore ├── .travis.yml ├── .tx └── config ├── AppImageBuilder.yml ├── README.md ├── data ├── com.muflone.gextractwinicons.metainfo.xml ├── gextractwinicons.desktop └── gextractwinicons.png ├── doc ├── contributors ├── copyright ├── license ├── resources └── translators ├── gextractwinicons.py ├── gextractwinicons ├── __init__.py ├── app.py ├── command_line_options.py ├── constants.py ├── extractor.py ├── functions.py ├── gtkbuilder_loader.py ├── localize.py ├── main.py ├── model_resources.py ├── requires.py ├── settings.py ├── translations.py └── ui │ ├── __init__.py │ ├── about.py │ ├── base.py │ ├── main.py │ └── shortcuts.py ├── icons ├── 128x128 │ └── gextractwinicons.png ├── 16x16 │ └── gextractwinicons.png ├── 24x24 │ └── gextractwinicons.png ├── 256x256 │ └── gextractwinicons.png ├── 32x32 │ └── gextractwinicons.png ├── 48x48 │ └── gextractwinicons.png ├── 64x64 │ └── gextractwinicons.png ├── 96x96 │ └── gextractwinicons.png └── scalable │ └── gextractwinicons.svg ├── man └── gextractwinicons.1 ├── po ├── bg.po ├── ca.po ├── de.po ├── en.po ├── es.po ├── fr.po ├── gextractwinicons.pot ├── he.po ├── it.po ├── lt.po ├── nl_NL.po ├── pt.po ├── pt_BR.po └── ru.po ├── requirements.txt ├── requirements_ci.txt ├── requirements_development.txt ├── setup.cfg ├── setup.py └── ui ├── about.ui ├── main.ui └── shortcuts.ui /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | orbs: 4 | # The python orb contains a set of prepackaged CircleCI configuration you can 5 | # use repeatedly in your configuration files 6 | # Orb commands and jobs help you with common scripting around a language/tool, 7 | # so you don't have to copy and paste it everywhere. 8 | # See the orb documentation here: https://circleci.com/developer/orbs/orb/circleci/python 9 | python: circleci/python@1.2 10 | 11 | jobs: 12 | build: 13 | docker: 14 | - image: cimg/python:3.9.5 15 | 16 | working_directory: ~/repo 17 | 18 | steps: 19 | - checkout 20 | - run: 21 | name: install dependencies 22 | command: | 23 | sudo apt-get update 24 | # Dependencies for installation 25 | sudo apt-get install gettext 26 | # Dependencies for execution 27 | sudo apt-get install gir1.2-gtk-3.0 gobject-introspection libcairo2-dev libgirepository1.0-dev python3-gi 28 | python3 -m venv venv 29 | . venv/bin/activate 30 | pip install -r requirements_ci.txt 31 | - run: 32 | name: check code 33 | command: | 34 | . venv/bin/activate 35 | python -m compileall gextractwinicons gextractwinicons.py setup.py 36 | pycodestyle gextractwinicons gextractwinicons.py setup.py 37 | python -m flake8 gextractwinicons gextractwinicons.py setup.py 38 | python setup.py install --optimize=1 --root=build 39 | ls -laR . 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Python compiled files 2 | *.pyc 3 | __pycache__/ 4 | 5 | # Ignore build and dist folders for PyPI 6 | /build/ 7 | /dist/ 8 | /*.egg-info/ 9 | 10 | # Ignore compiled translation files 11 | /locale/ 12 | 13 | # Ignore backup files 14 | *.ui~ 15 | *.glade~ 16 | \#*.glade# 17 | \#*.ui# 18 | 19 | # Ignore PyCharm project folder 20 | /.idea/ 21 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: linux 2 | dist: bionic 3 | language: python 4 | python: 5 | - "3.6" 6 | virtualenv: 7 | system_site_packages: true 8 | addons: 9 | apt: 10 | packages: 11 | # Dependencies for installation 12 | - gettext # msgfmt 13 | # Dependencies for execution 14 | - python3-gi # GObject 15 | - libgirepository1.0-dev # GObject 16 | - gir1.2-gtk-3.0 # gi.repository.Gtk 17 | install: 18 | - pip install -r requirements_ci.txt 19 | script: 20 | - python -m compileall . 21 | - python -m pycodestyle . 22 | - python -m flake8 . 23 | - python setup.py install --optimize=1 --root=build 24 | - ls -laR build 25 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [gextractwinicons.gextractwinicons] 5 | file_filter = po/.po 6 | source_file = po/gextractwinicons.pot 7 | source_lang = en 8 | type = PO 9 | -------------------------------------------------------------------------------- /AppImageBuilder.yml: -------------------------------------------------------------------------------- 1 | version: 1 2 | script: 3 | # Install dependencies 4 | - apt-get update 5 | - apt-get install --yes gettext python3 python3-gi python3-xdg gir1.2-gtk-3.0 6 | # Remove any previous build 7 | - rm -rf AppDir root | true 8 | # Compile the package 9 | - python3 setup.py install --root root 10 | # Copy the python application code into the AppDir 11 | - install -m 755 -d AppDir/usr/share/gextractwinicons 12 | - cp gextractwinicons.py AppDir/usr/share/gextractwinicons 13 | - cp -r root/usr/local/lib/python3.6/dist-packages/gextractwinicons AppDir/usr/share/gextractwinicons 14 | - cp -r root/usr/local/share/gextractwinicons/ui AppDir/usr/share/gextractwinicons 15 | - cp -r root/usr/local/share/gextractwinicons/data AppDir/usr/share/gextractwinicons 16 | - cp -r root/usr/local/share/locale AppDir/usr/share 17 | - mkdir -p AppDir/usr/share/doc 18 | - cp -r root/usr/local/share/doc/gextractwinicons AppDir/usr/share/doc 19 | # Copy icon 20 | - install -m 755 -d AppDir/usr/share/icons/hicolor/scalable/apps/ 21 | - install -m 644 -t AppDir/usr/share/icons/hicolor/scalable/apps/ icons/scalable/gextractwinicons.svg 22 | 23 | AppDir: 24 | path: ./AppDir 25 | 26 | app_info: 27 | id: com.muflone.gextractwinicons 28 | name: gextractwinicons 29 | icon: gextractwinicons 30 | version: 0.5.2 31 | exec: usr/bin/python3 32 | exec_args: "$APPDIR/usr/share/gextractwinicons/gextractwinicons.py $@" 33 | 34 | apt: 35 | arch: amd64 36 | sources: 37 | - sourceline: 'deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse' 38 | key_url: 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x3b4fe6acc0b21f32' 39 | 40 | include: 41 | - python3 42 | - python3-gi 43 | - python3-xdg 44 | - gir1.2-gtk-3.0 45 | - icoutils 46 | # Language packs for translating the GTK+ widgets 47 | - language-pack-gnome-af-base 48 | - language-pack-gnome-am-base 49 | - language-pack-gnome-an-base 50 | - language-pack-gnome-ar-base 51 | - language-pack-gnome-as-base 52 | - language-pack-gnome-ast-base 53 | - language-pack-gnome-az-base 54 | - language-pack-gnome-be-base 55 | - language-pack-gnome-bg-base 56 | - language-pack-gnome-bn-base 57 | - language-pack-gnome-br-base 58 | - language-pack-gnome-bs-base 59 | - language-pack-gnome-ca-base 60 | - language-pack-gnome-ckb-base 61 | - language-pack-gnome-crh-base 62 | - language-pack-gnome-cs-base 63 | - language-pack-gnome-cy-base 64 | - language-pack-gnome-da-base 65 | - language-pack-gnome-de-base 66 | - language-pack-gnome-dz-base 67 | - language-pack-gnome-el-base 68 | - language-pack-gnome-en-base 69 | - language-pack-gnome-eo-base 70 | - language-pack-gnome-es-base 71 | - language-pack-gnome-et-base 72 | - language-pack-gnome-eu-base 73 | - language-pack-gnome-fa-base 74 | - language-pack-gnome-fi-base 75 | - language-pack-gnome-fr-base 76 | - language-pack-gnome-fur-base 77 | - language-pack-gnome-ga-base 78 | - language-pack-gnome-gd-base 79 | - language-pack-gnome-gl-base 80 | - language-pack-gnome-gu-base 81 | - language-pack-gnome-he-base 82 | - language-pack-gnome-hi-base 83 | - language-pack-gnome-hr-base 84 | - language-pack-gnome-hu-base 85 | - language-pack-gnome-ia-base 86 | - language-pack-gnome-id-base 87 | - language-pack-gnome-is-base 88 | - language-pack-gnome-it-base 89 | - language-pack-gnome-ja-base 90 | - language-pack-gnome-ka-base 91 | - language-pack-gnome-kk-base 92 | - language-pack-gnome-km-base 93 | - language-pack-gnome-kn-base 94 | - language-pack-gnome-ko-base 95 | - language-pack-gnome-ku-base 96 | - language-pack-gnome-lt-base 97 | - language-pack-gnome-lv-base 98 | - language-pack-gnome-mk-base 99 | - language-pack-gnome-ml-base 100 | - language-pack-gnome-mr-base 101 | - language-pack-gnome-ms-base 102 | - language-pack-gnome-my-base 103 | - language-pack-gnome-nb-base 104 | - language-pack-gnome-nds-base 105 | - language-pack-gnome-ne-base 106 | - language-pack-gnome-nl-base 107 | - language-pack-gnome-nn-base 108 | - language-pack-gnome-oc-base 109 | - language-pack-gnome-or-base 110 | - language-pack-gnome-pa-base 111 | - language-pack-gnome-pl-base 112 | - language-pack-gnome-pt-base 113 | - language-pack-gnome-ro-base 114 | - language-pack-gnome-ru-base 115 | - language-pack-gnome-si-base 116 | - language-pack-gnome-sk-base 117 | - language-pack-gnome-sl-base 118 | - language-pack-gnome-sq-base 119 | - language-pack-gnome-sr-base 120 | - language-pack-gnome-sv-base 121 | - language-pack-gnome-szl-base 122 | - language-pack-gnome-ta-base 123 | - language-pack-gnome-te-base 124 | - language-pack-gnome-tg-base 125 | - language-pack-gnome-th-base 126 | - language-pack-gnome-tr-base 127 | - language-pack-gnome-ug-base 128 | - language-pack-gnome-uk-base 129 | - language-pack-gnome-vi-base 130 | - language-pack-gnome-xh-base 131 | - language-pack-gnome-zh-hans-base 132 | - language-pack-gnome-zh-hant-base 133 | exclude: 134 | - humanity-icon-theme 135 | - ubuntu-mono 136 | 137 | files: 138 | exclude: 139 | - usr/share/doc/dbus-* 140 | - usr/share/doc/dconf-* 141 | - usr/share/doc/gir1.2-* 142 | - usr/share/doc/glib-* 143 | - usr/share/doc/gsettings-desktop-schemas 144 | - usr/share/doc/hicolor-icon-theme 145 | - usr/share/doc/language-pack-* 146 | - usr/share/doc/lib* 147 | - usr/share/doc/mime-support 148 | - usr/share/doc/python3* 149 | - usr/share/doc/readline-common 150 | - usr/share/doc/tzdata 151 | - usr/share/doc/xkb-data 152 | - usr/share/gnome 153 | - usr/share/help-langpack 154 | - usr/share/i18n 155 | - usr/share/man 156 | - usr/share/libthai 157 | - usr/share/X11 158 | - usr/share/zoneinfo 159 | - usr/share/zoneinfo-icu 160 | 161 | before_bundle: 162 | - echo 'Before bundle' 163 | - echo '#!/bin/bash' > before_bundle.sh 164 | - "bash before_bundle.sh ${APPDIR}" 165 | 166 | after_bundle: 167 | - echo 'After bundle' 168 | # Copy GTK+ translations to AppDir 169 | - echo '#!/bin/bash' > after_bundle.sh 170 | - echo 'set -e' >> after_bundle.sh 171 | - echo 'APPDIR="$1"' >> after_bundle.sh 172 | - echo 'pushd "$APPDIR/usr/share/locale-langpack"' >> after_bundle.sh 173 | - echo 'for locale in *' >> after_bundle.sh 174 | - echo ' do' >> after_bundle.sh 175 | - echo ' LOCALEDIR="usr/share/locale/$locale/LC_MESSAGES"' >> after_bundle.sh 176 | - echo ' if [ ! -d "$APPDIR/$LOCALEDIR" ]' >> after_bundle.sh 177 | - echo ' then' >> after_bundle.sh 178 | - echo ' mkdir -p "$APPDIR/$LOCALEDIR"' >> after_bundle.sh 179 | - echo ' fi' >> after_bundle.sh 180 | - echo ' if [ -f "$locale/LC_MESSAGES/gtk30.mo" ]' >> after_bundle.sh 181 | - echo ' then' >> after_bundle.sh 182 | - echo ' cp $locale/LC_MESSAGES/gtk30.mo $APPDIR/$LOCALEDIR' >> after_bundle.sh 183 | - echo ' fi' >> after_bundle.sh 184 | - echo ' done' >> after_bundle.sh 185 | - echo 'exit 0' >> after_bundle.sh 186 | - "bash after_bundle.sh ${APPDIR}" 187 | # Remove every other translation 188 | - "rm -rf ${APPDIR}/usr/share/locale-langpack" 189 | 190 | before_runtime: 191 | - echo 'Before runtime' 192 | - echo '#!/bin/bash' > before_runtime.sh 193 | - "bash before_runtime.sh ${APPDIR}" 194 | 195 | after_runtime: 196 | - echo 'After runtime' 197 | - echo '#!/bin/bash' > after_runtime.sh 198 | - "bash after_runtime.sh ${APPDIR}" 199 | 200 | runtime: 201 | env: 202 | PATH: '${APPDIR}/usr/local/bin:${PATH}' 203 | APPDIR_LIBRARY_PATH: '$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders' 204 | PYTHONHOME: '${APPDIR}/usr' 205 | PYTHONPATH: '${APPDIR}/usr/lib/python3.8/site-packages' 206 | XDG_DATA_DIRS: '/usr/local/share:/usr/share' 207 | 208 | AppImage: 209 | update-information: None 210 | sign-key: None 211 | arch: x86_64 212 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | 3 | [![Travis CI Build Status](https://img.shields.io/travis/com/muflone/gextractwinicons/master.svg)](https://www.travis-ci.com/github/muflone/gextractwinicons) 4 | [![CircleCI Build Status](https://img.shields.io/circleci/project/github/muflone/gextractwinicons/master.svg)](https://circleci.com/gh/muflone/gextractwinicons) 5 | 6 | **Description:** Extract cursors and icons from MS Windows resource files 7 | 8 | **Copyright:** 2009-2022 Fabio Castelli (Muflone) 9 | 10 | **License:** GPL-3+ 11 | 12 | **Source code:** https://github.com/muflone/gextractwinicons/ 13 | 14 | **Documentation:** http://www.muflone.com/gextractwinicons/ 15 | 16 | **Translations:** https://explore.transifex.com/muflone/gextractwinicons/ 17 | 18 | # Description 19 | 20 | From the *gExtractWinIcons* main window you select an MS Windows resources file 21 | (like an exe, dll, cpl, ocx and so on) and you will list its contained resources 22 | like cursors, icons and you can extract them, including exporting the icons in 23 | PNG format. 24 | 25 | ![Main window](http://www.muflone.com/resources/gextractwinicons/archive/latest/english/main.png) 26 | 27 | # System Requirements 28 | 29 | * Python >= 3.6 (developed and tested for Python 3.9 and 3.10) 30 | * XDG library for Python 3 ( https://pypi.org/project/pyxdg/ ) 31 | * GTK+ 3.0 libraries for Python 3 32 | * GObject libraries for Python 3 ( https://pypi.org/project/PyGObject/ ) 33 | * IcoUtils package (wrestool and icotool commands) 34 | 35 | # Installation 36 | 37 | A distutils installation script is available to install from the sources. 38 | 39 | To install in your system please use: 40 | 41 | cd /path/to/folder 42 | python3 setup.py install 43 | 44 | To install the files in another path instead of the standard /usr prefix use: 45 | 46 | cd /path/to/folder 47 | python3 setup.py install --root NEW_PATH 48 | 49 | # Usage 50 | 51 | If the application is not installed please use: 52 | 53 | cd /path/to/folder 54 | python3 gextractwinicons.py 55 | 56 | If the application was installed simply use the gextractwinicons command. 57 | -------------------------------------------------------------------------------- /data/com.muflone.gextractwinicons.metainfo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | com.muflone.gextractwinicons 4 | 5 | gExtractWinIcons 6 | Extract cursors and icons from MS Windows resource files 7 | 8 |

9 | gExtractWinIcons can be used to extract icons, cursors and images from 10 | MS Windows resource files (exe, dll, ocx, cpl). 11 |

12 |
13 | 14 | FSFAP 15 | GPL-3.0-or-later 16 | 17 | 18 | Office 19 | 20 | https://github.com/muflone/gextractwinicons/ 21 | http://www.muflone.com/gextractwinicons/ 22 | https://explore.transifex.com/muflone/gextractwinicons/ 23 | https://github.com/muflone/gextractwinicons/issues/ 24 | http://www.muflone.com/contacts/ 25 | 26 | gextractwinicons.desktop 27 | 28 | 29 | http://www.muflone.com/resources/gextractwinicons/archive/latest/english/main.png 30 | 31 | 32 | http://www.muflone.com/resources/gextractwinicons/archive/latest/english/about.png 33 | 34 | 35 |
36 | -------------------------------------------------------------------------------- /data/gextractwinicons.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Version=1.0 3 | Encoding=UTF-8 4 | Type=Application 5 | Name=gExtractWinIcons 6 | GenericName=gExtractWinIcons 7 | Comment=A GTK utility to extract cursors, icons and png image previews from MS Windows resource files (like .exe, .dll, .ocx, .cpl) 8 | Comment[bg]=GTK приложение за извличане на курсори, икони и изображения-предварителни прегледи във формат PNG от ресурсни файлове на MS Windows (като .exe, .dll, .ocx, .cpl) 9 | Comment[ca]=Una utilitat GTK per extreure cursors, icones i previsualitzacions PNG d’fitxers de MS de recursos de Windows (como .exe, .dll, .ocx, .cpl) 10 | Comment[es]=Una utilidad GTK para extraer cursores, iconos e imágenes PNG de archivos de recursos de Windows (como .exe, .dll, .ocx, cpl) 11 | Comment[fr]=Un outil GTK pour extraire pointeurs, icônes et aperçus des images png des fichiers de ressources pour MS Windows (comme .exe, .dll, .ocx, .cpl) 12 | Comment[he]=כלי עזר מבוסס GTK לחילוץ, תצוגות מוקדמות של צלמיות ותמונות PNG מתוך קבצי מקורות של MS Windows (כגון ‎.exe, .dll, .ocx, .cpl) 13 | Comment[it]=Un'utilità GTK per estrarre cursori, icone e anteprime delle immagini png dai files di risorse per MS Windows (come .exe, .dll, .ocx, .cpl) 14 | Comment[ru]=Утилита для извлечения курсоров, значков и PNG-изображений из файлов ресурсов MS Windows (*.exe, *.dll, *.ocx, *.cpl) 15 | Terminal=false 16 | Categories=Graphics;GTK; 17 | Icon=gextractwinicons 18 | Exec=gextractwinicons 19 | TryExec=gextractwinicons 20 | -------------------------------------------------------------------------------- /data/gextractwinicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muflone/gextractwinicons/3cbb541cc5852c014f6361b5ccc16515827c5beb/data/gextractwinicons.png -------------------------------------------------------------------------------- /doc/contributors: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /doc/license: -------------------------------------------------------------------------------- 1 | This program is free software: you can redistribute it and/or modify 2 | it under the terms of the GNU General Public License as published by 3 | the Free Software Foundation, either version 3 of the License, or 4 | (at your option) any later version. 5 | 6 | This program is distributed in the hope that it will be useful, 7 | but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | GNU General Public License for more details. 10 | 11 | You should have received a copy of the GNU General Public License 12 | along with this program. If not, see . 13 | -------------------------------------------------------------------------------- /doc/resources: -------------------------------------------------------------------------------- 1 | Project home page: http://www.muflone.com/gextractwinicons/ 2 | Source code: https://github.com/muflone/gextractwinicons/ 3 | Author information: http://www.muflone.com/ 4 | Issues and bugs tracking: https://github.com/muflone/gextractwinicons/issues/ 5 | Translations: https://explore.transifex.com/muflone/gextractwinicons/ 6 | -------------------------------------------------------------------------------- /doc/translators: -------------------------------------------------------------------------------- 1 | English: Fabio Castelli (Muflone) 2 | Italian: Fabio Castelli (Muflone) 3 | French: Emmanuel 4 | Albano Battistella 5 | Spanish: pepeleproso 6 | Federico Caiazza 7 | Adolfo Jayme Barrientos 8 | German: Ettore Atalan 9 | Russian: Сергей Богатов 10 | Hebrew: GenghisKhan 11 | Catalan: Adolfo Jayme Barrientos 12 | Bulgarian: sahwar 13 | Lithuanian: Moo 14 | Dutch: Heimen Stoffels 15 | Portuguese: Danielson Tavares 16 | Paguiar735 17 | -------------------------------------------------------------------------------- /gextractwinicons.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | ## 3 | # Project: gExtractWinIcons 4 | # Description: Extract cursors and icons from MS Windows resource files 5 | # Author: Fabio Castelli (Muflone) 6 | # Copyright: 2009-2022 Fabio Castelli 7 | # License: GPL-3+ 8 | # This program is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program. If not, see . 20 | ## 21 | 22 | import gextractwinicons.main 23 | 24 | 25 | if __name__ == '__main__': 26 | gextractwinicons.main.main() 27 | -------------------------------------------------------------------------------- /gextractwinicons/__init__.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | -------------------------------------------------------------------------------- /gextractwinicons/app.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | from gi.repository import Gtk 22 | 23 | from gextractwinicons.constants import APP_ID 24 | from gextractwinicons.ui.main import UIMain 25 | 26 | 27 | class Application(Gtk.Application): 28 | def __init__(self, options): 29 | """Prepare the GtkApplication""" 30 | super(self.__class__, self).__init__(application_id=APP_ID) 31 | self.options = options 32 | self.ui = None 33 | self.connect('activate', self.activate) 34 | self.connect('startup', self.startup) 35 | 36 | # noinspection PyUnusedLocal 37 | def startup(self, application): 38 | """Configure the application during the startup""" 39 | self.ui = UIMain(application=self, 40 | options=self.options) 41 | 42 | # noinspection PyMethodOverriding 43 | def activate(self, application): 44 | """Execute the application""" 45 | self.ui.run() 46 | -------------------------------------------------------------------------------- /gextractwinicons/command_line_options.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import argparse 22 | import os.path 23 | 24 | from gextractwinicons.constants import (APP_NAME, 25 | APP_VERSION, 26 | VERBOSE_LEVEL_QUIET, 27 | VERBOSE_LEVEL_NORMAL, 28 | VERBOSE_LEVEL_MAX) 29 | 30 | 31 | class CommandLineOptions(object): 32 | """ 33 | Parse command line arguments 34 | """ 35 | def __init__(self): 36 | self.parser = argparse.ArgumentParser(prog=None, 37 | description=APP_NAME) 38 | self.parser.set_defaults(verbose_level=VERBOSE_LEVEL_NORMAL) 39 | self.parser.add_argument('-V', 40 | '--version', 41 | action='version', 42 | version=f'{APP_NAME} v{APP_VERSION}') 43 | self.parser.add_argument('-v', '--verbose', 44 | dest='verbose_level', 45 | action='store_const', 46 | const=VERBOSE_LEVEL_MAX, 47 | help='show error and information messages') 48 | self.parser.add_argument('-q', '--quiet', 49 | dest='verbose_level', 50 | action='store_const', 51 | const=VERBOSE_LEVEL_QUIET, 52 | help='hide error and information messages') 53 | self.parser.add_argument('-d', '--destination', 54 | help='set initial destination folder') 55 | self.parser.add_argument('-f', '--filename', 56 | help='set resources filename') 57 | self.parser.add_argument('-r', '--refresh', 58 | action='store_true', 59 | help='automatically refresh resources list ' 60 | 'if -f specified') 61 | self.parser.add_argument('-n', '--nofreeze', 62 | action='store_true', 63 | help='do not freeze the treeview during ' 64 | 'the refresh (slower)') 65 | self.options = None 66 | 67 | # noinspection PyProtectedMember,PyUnresolvedReferences 68 | def add_group(self, name: str) -> argparse._ArgumentGroup: 69 | """ 70 | Add a command-line options group 71 | 72 | :param name: name for the new group 73 | :return: _ArgumentGroup object with the new command-line options group 74 | """ 75 | return self.parser.add_argument_group(name) 76 | 77 | def parse_options(self) -> argparse.Namespace: 78 | """ 79 | Parse command-line options 80 | 81 | :return: command-line options 82 | """ 83 | self.options = self.parser.parse_args() 84 | if self.options.refresh and not self.options.filename: 85 | self.parser.error('option -r requires filename specified with -f') 86 | if self.options.filename and not os.path.isfile(self.options.filename): 87 | self.parser.error(f'the specified file "{self.options.filename}" ' 88 | 'is not valid') 89 | return self.options 90 | -------------------------------------------------------------------------------- /gextractwinicons/constants.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import pathlib 22 | import sys 23 | 24 | from xdg import BaseDirectory 25 | 26 | 27 | # Application constants 28 | APP_NAME = 'gExtractWinIcons' 29 | APP_VERSION = '0.5.2' 30 | APP_DESCRIPTION = 'Extract cursors and icons from MS Windows resource files' 31 | APP_DOMAIN = 'gextractwinicons' 32 | APP_AUTHOR = 'Fabio Castelli' 33 | APP_AUTHOR_EMAIL = 'muflone@muflone.com' 34 | APP_COPYRIGHT = f'Copyright 2009-2022 {APP_AUTHOR}' 35 | APP_ID = f'{APP_DOMAIN}.muflone.com' 36 | URL_AUTHOR = 'http://www.muflone.com/' 37 | URL_APPLICATION = f'{URL_AUTHOR}{APP_DOMAIN}/' 38 | URL_SOURCES = f'https://github.com/muflone/{APP_DOMAIN}/' 39 | URL_TRANSLATIONS = f'https://explore.transifex.com/muflone/{APP_DOMAIN}/' 40 | # Other constants 41 | VERBOSE_LEVEL_QUIET = 0 42 | VERBOSE_LEVEL_NORMAL = 1 43 | VERBOSE_LEVEL_MAX = 2 44 | # Resources type 45 | RESOURCE_TYPE_CURSOR = 1 46 | RESOURCE_TYPE_BITMAP = 2 47 | RESOURCE_TYPE_ICON = 3 48 | RESOURCE_TYPE_MENU = 4 49 | RESOURCE_TYPE_DIALOG = 5 50 | RESOURCE_TYPE_STRING = 6 51 | RESOURCE_TYPE_FONTDIR = 7 52 | RESOURCE_TYPE_FONT = 8 53 | RESOURCE_TYPE_ACCELERATOR = 9 54 | RESOURCE_TYPE_RCDATA = 10 55 | RESOURCE_TYPE_MESSAGELIST = 11 56 | RESOURCE_TYPE_GROUP_CURSOR = 12 57 | RESOURCE_TYPE_GROUP_ICON = 14 58 | RESOURCE_TYPE_VERSION = 16 59 | RESOURCE_TYPE_DLGINCLUDE = 17 60 | RESOURCE_TYPE_PLUGPLAY = 19 61 | RESOURCE_TYPE_VXD = 20 62 | RESOURCE_TYPE_ANICURSOR = 21 63 | RESOURCE_TYPE_ANIICON = 22 64 | 65 | # Paths constants 66 | path_xdg_data_home = pathlib.Path(BaseDirectory.xdg_data_home) 67 | icon_name = f'{APP_DOMAIN}.png' 68 | if (pathlib.Path('data') / icon_name).is_file(): 69 | # Use relative paths 70 | DIR_PREFIX = pathlib.Path('data').parent.absolute() 71 | DIR_LOCALE = DIR_PREFIX / 'locale' 72 | DIR_DOCS = DIR_PREFIX / 'doc' 73 | elif (path_xdg_data_home / APP_DOMAIN / 'data' / icon_name).is_file(): 74 | # Use local user path 75 | DIR_PREFIX = path_xdg_data_home / APP_DOMAIN 76 | DIR_LOCALE = path_xdg_data_home / 'locale' 77 | DIR_DOCS = path_xdg_data_home / 'doc' / APP_DOMAIN 78 | elif (pathlib.Path(__file__).parent.parent / 'share' / APP_DOMAIN / 'data' / 79 | icon_name).is_file(): 80 | # Use local user path in the local Python directory 81 | DIR_PREFIX = pathlib.Path(__file__).parent.parent / 'share' / APP_DOMAIN 82 | DIR_LOCALE = DIR_PREFIX.parent / 'locale' 83 | DIR_DOCS = DIR_PREFIX.parent / 'doc' / APP_DOMAIN 84 | else: 85 | # Use system path 86 | path_prefix = pathlib.Path(sys.prefix) 87 | DIR_PREFIX = path_prefix / 'share' / APP_DOMAIN 88 | DIR_LOCALE = path_prefix / 'share' / 'locale' 89 | DIR_DOCS = path_prefix / 'share' / 'doc' / APP_DOMAIN 90 | # Set the paths for the folders 91 | DIR_DATA = DIR_PREFIX / 'data' 92 | DIR_ICONS = DIR_DATA / 'icons' 93 | DIR_UI = DIR_PREFIX / 'ui' 94 | try: 95 | # In read-only environments, the settings folder cannot be created 96 | # (e.g. in a Debian pbuilder fakeroot) 97 | DIR_SETTINGS = pathlib.Path(BaseDirectory.save_config_path(APP_DOMAIN)) 98 | except PermissionError: 99 | # Get the settings path without actually creating it 100 | DIR_SETTINGS = pathlib.Path(BaseDirectory.xdg_config_home) / APP_DOMAIN 101 | # Set the paths for the data files 102 | FILE_ICON = DIR_DATA / icon_name 103 | FILE_CONTRIBUTORS = DIR_DOCS / 'contributors' 104 | FILE_TRANSLATORS = DIR_DOCS / 'translators' 105 | FILE_LICENSE = DIR_DOCS / 'license' 106 | FILE_RESOURCES = DIR_DOCS / 'resources' 107 | # Set the paths for configuration files 108 | FILE_SETTINGS = DIR_SETTINGS / 'settings.conf' 109 | -------------------------------------------------------------------------------- /gextractwinicons/extractor.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import logging 22 | import os 23 | import os.path 24 | import subprocess 25 | import tempfile 26 | 27 | from gextractwinicons.constants import APP_NAME, RESOURCE_TYPE_GROUP_CURSOR 28 | from gextractwinicons.functions import bin_string_utf8 29 | 30 | 31 | class Extractor(object): 32 | def __init__(self, settings): 33 | # Create a temporary directory for the extracted icons 34 | self.settings = settings 35 | self.tempdir = tempfile.mkdtemp(prefix=f'{APP_NAME}-') 36 | logging.debug('The temporary files will be extracted ' 37 | f'under {self.tempdir}') 38 | 39 | def clear(self): 40 | for f in os.listdir(self.tempdir): 41 | os.remove(os.path.join(self.tempdir, f)) 42 | 43 | def destroy(self): 44 | """Clear and delete the temporary directory""" 45 | self.clear() 46 | os.rmdir(self.tempdir) 47 | self.tempdir = None 48 | 49 | def list(self, filename): 50 | """Extract the resources list from the filename""" 51 | resources = [] 52 | proc = subprocess.Popen( 53 | ['wrestool', '--list', filename], 54 | stdout=subprocess.PIPE, 55 | stderr=subprocess.PIPE) 56 | stdout, stderr = proc.communicate() 57 | if stderr: 58 | logging.debug('wrestool --list ' 59 | f'error: {bin_string_utf8(stderr).strip()}') 60 | # Remove weird characters 61 | stdout = stdout.decode('utf-8').replace('[', '') 62 | stdout = stdout.replace(']', '') 63 | for line in stdout.split('\n'): 64 | resource = {} 65 | for options in line.split(): 66 | if '=' in options: 67 | arg, value = options.split('=') 68 | resource[arg] = value.replace('\'', '') 69 | # A resource was found 70 | if resource: 71 | if resource.get('--type', '0').isdigit(): 72 | resource['--type'] = int(resource['--type']) 73 | else: 74 | resource['--type'] = 0 75 | resources.append(resource) 76 | return resources 77 | 78 | def extract(self, filename, resource): 79 | """Extract a resource to the temporary directory""" 80 | output_filename = os.path.join( 81 | self.tempdir, '%s_%d_%s_%s.%s' % ( 82 | os.path.basename(filename), 83 | resource['--type'], 84 | resource['--name'], 85 | resource['--language'], 86 | ('cur' 87 | if resource['--type'] == RESOURCE_TYPE_GROUP_CURSOR 88 | else 'ico') 89 | )) 90 | proc = subprocess.Popen( 91 | [ 92 | 'wrestool', 93 | '--extract', 94 | '--type', str(resource['--type']), 95 | '--name', resource['--name'], 96 | '--language', resource['--language'], 97 | '--output', output_filename, 98 | filename 99 | ], 100 | stdout=subprocess.PIPE, 101 | stderr=subprocess.PIPE) 102 | stdout, stderr = proc.communicate() 103 | if stderr: 104 | logging.debug('wrestool --extract ' 105 | f'error: {bin_string_utf8(stderr).strip()}') 106 | # Check if the resource was extracted successfully (cannot be sure) 107 | if os.path.isfile(output_filename): 108 | return output_filename 109 | 110 | def extract_images(self, filename): 111 | """Extract the images from a cursor or icon file""" 112 | images = [] 113 | # Retrieve the images inside the cursor/icon file 114 | proc = subprocess.Popen( 115 | ['icotool', '--list', filename], 116 | stdout=subprocess.PIPE, 117 | stderr=subprocess.PIPE) 118 | stdout, stderr = proc.communicate() 119 | if stderr: 120 | logging.debug('icotool --list ' 121 | f'error: {bin_string_utf8(stderr).strip()}') 122 | 123 | # Split line in fields 124 | for line in stdout.decode('utf-8').split('\n'): 125 | resource = {} 126 | for options in line.split(): 127 | if '=' in options: 128 | arg, value = options.split('=') 129 | else: 130 | arg = options 131 | value = None 132 | resource[arg] = value 133 | # A resource was found 134 | if resource: 135 | # Determine the temporary output filename 136 | # like 'name_index_WxHxD.png' 137 | output_filename = os.path.join( 138 | self.tempdir, '%s_%s_%sx%sx%s.png' % ( 139 | filename[:-4], 140 | resource['--index'], 141 | resource['--width'], 142 | resource['--height'], 143 | resource['--bit-depth'])) 144 | # Extract the image from the resource into the file 145 | proc = subprocess.Popen( 146 | [ 147 | 'icotool', 148 | '--extract', 149 | '--index', resource['--index'], 150 | '--width', resource['--width'], 151 | '--height', resource['--height'], 152 | '--bit-depth', resource['--bit-depth'], 153 | '--output', output_filename, 154 | filename 155 | ], 156 | stdout=subprocess.PIPE, 157 | stderr=subprocess.PIPE) 158 | stdout, stderr = proc.communicate() 159 | if stderr: 160 | logging.debug('icotool --extract ' 161 | f'error: {bin_string_utf8(stderr).strip()}') 162 | # Check if the image was extracted successfully 163 | if os.path.isfile(output_filename): 164 | resource['path'] = output_filename 165 | images.append(resource) 166 | return images 167 | -------------------------------------------------------------------------------- /gextractwinicons/functions.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | from gi.repository import Gtk 22 | 23 | from gextractwinicons.constants import DIR_UI 24 | 25 | 26 | def bin_string_ascii(text: bytes) -> str: 27 | """Convert a binary string to string using ASCII codec""" 28 | return text.decode('ascii') 29 | 30 | 31 | def bin_string_utf8(text: bytes) -> str: 32 | """Convert a binary string to string using UTF-8 codec""" 33 | return text.decode('utf-8') 34 | 35 | 36 | def get_ui_file(filename): 37 | """Return the full path of a Glade/UI file""" 38 | return str(DIR_UI / filename) 39 | 40 | 41 | def process_events(): 42 | """Process every pending GTK+ event""" 43 | while Gtk.events_pending(): 44 | Gtk.main_iteration() 45 | 46 | 47 | def readlines(filename, empty_lines=False): 48 | result = [] 49 | with open(filename) as f: 50 | for line in f.readlines(): 51 | line = line.strip() 52 | if line or empty_lines: 53 | result.append(line) 54 | f.close() 55 | return result 56 | -------------------------------------------------------------------------------- /gextractwinicons/gtkbuilder_loader.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | from gi.repository import Gtk 22 | 23 | 24 | class GtkBuilderLoader(object): 25 | def __init__(self, *ui_files): 26 | """Load one or more ui files for GtkBuilder""" 27 | self.builder = Gtk.Builder() 28 | for ui_filename in ui_files: 29 | self.builder.add_from_file(ui_filename) 30 | self.__widgets = {} 31 | 32 | def __getattr__(self, key): 33 | """Get a widget from GtkBuilder using class member name""" 34 | if key not in self.__widgets: 35 | self.__widgets[key] = self.builder.get_object(key) 36 | assert self.__widgets[key], f'Missing widget: {key}' 37 | return self.__widgets[key] 38 | 39 | def get_objects(self): 40 | """Get the widgets list from GtkBuilder""" 41 | return self.builder.get_objects() 42 | 43 | def get_objects_by_type(self, object_type): 44 | """Get the widgets list with a specific type from GtkBuilder""" 45 | return [w for w in self.get_objects() if isinstance(w, object_type)] 46 | 47 | def get_object(self, key): 48 | """Get a widget from GtkBuilder using a method""" 49 | return self.__getattr__(key) 50 | 51 | def connect_signals(self, handlers): 52 | """Connect all the Gtk signals to a group of handlers""" 53 | self.builder.connect_signals(handlers) 54 | -------------------------------------------------------------------------------- /gextractwinicons/localize.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | from gettext import gettext, dgettext 22 | 23 | localized_messages = {'': ''} 24 | 25 | 26 | def store_message(message, translated): 27 | """Store a translated message in the localized_messages list""" 28 | localized_messages[message] = translated 29 | 30 | 31 | def strip_colon(message): 32 | """Remove the colons from the message""" 33 | return message.replace(':', '') 34 | 35 | 36 | def strip_underline(message): 37 | """Remove the underlines from the message""" 38 | return message.replace('_', '') 39 | 40 | 41 | def text(message, gtk30=False, context=None): 42 | """Return a translated message and cache it for reuse""" 43 | if message not in localized_messages: 44 | if gtk30: 45 | # Get a message translated from GTK+ 3 domain 46 | full_message = message if not context else f'{context}\04{message}' 47 | localized_messages[message] = dgettext('gtk30', full_message) 48 | # Fix for untranslated messages with context 49 | if context and localized_messages[message] == full_message: 50 | localized_messages[message] = dgettext('gtk30', message) 51 | else: 52 | localized_messages[message] = gettext(message) 53 | return localized_messages[message] 54 | 55 | 56 | # This special alias is used to track localization requests to catch 57 | # by xgettext. The text() calls aren't tracked by xgettext 58 | _ = text 59 | -------------------------------------------------------------------------------- /gextractwinicons/main.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import logging 22 | 23 | import gextractwinicons.requires # noqa: F401 24 | from gextractwinicons.app import Application 25 | from gextractwinicons.command_line_options import CommandLineOptions 26 | from gextractwinicons.constants import (DIR_DATA, 27 | DIR_DOCS, 28 | DIR_LOCALE, 29 | DIR_PREFIX, 30 | DIR_SETTINGS, 31 | DIR_UI) 32 | import gextractwinicons.translations # noqa: F401 33 | 34 | 35 | def main(): 36 | command_line_options = CommandLineOptions() 37 | options = command_line_options.parse_options() 38 | # Set logging level 39 | verbose_levels = {0: logging.ERROR, 40 | 1: logging.INFO, 41 | 2: logging.DEBUG} 42 | logging.basicConfig(level=verbose_levels[options.verbose_level], 43 | format='%(asctime)s ' 44 | '%(levelname)-8s ' 45 | '%(filename)-25s ' 46 | 'line: %(lineno)-5d ' 47 | '%(funcName)-30s ' 48 | 'pid: %(process)-9d ' 49 | '%(message)s') 50 | # Log paths for debug purposes 51 | # Not using {VARIABLE=} as it's not compatible with Python 3.6 52 | logging.debug(f'DIR_PREFIX={str(DIR_PREFIX)}') 53 | logging.debug(f'DIR_LOCALE={str(DIR_LOCALE)}') 54 | logging.debug(f'DIR_DOCS={str(DIR_DOCS)}') 55 | logging.debug(f'DIR_DATA={str(DIR_DATA)}') 56 | logging.debug(f'DIR_UI={str(DIR_UI)}') 57 | logging.debug(f'DIR_SETTINGS={str(DIR_SETTINGS)}') 58 | # Start the application 59 | app = Application(options=options) 60 | app.run(None) 61 | -------------------------------------------------------------------------------- /gextractwinicons/model_resources.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import logging 22 | import os.path 23 | 24 | from gi.repository import GdkPixbuf 25 | from gi.repository import GLib 26 | 27 | 28 | class ModelResources(object): 29 | COL_SELECTED = 0 30 | COL_TYPE = 1 31 | COL_NAME = 2 32 | COL_LANGUAGE = 3 33 | COL_WIDTH = 4 34 | COL_HEIGHT = 5 35 | COL_DEPTH = 6 36 | COL_SIZE = 7 37 | COL_PREVIEW = 8 38 | COL_FILEPATH = 9 39 | 40 | def __init__(self, model, settings): 41 | self.model = model 42 | self.settings = settings 43 | 44 | def clear(self): 45 | """Clear the model""" 46 | return self.model.clear() 47 | 48 | def add_resource(self, parent, resource_type, name, language, 49 | width, height, depth, path): 50 | try: 51 | pixbuf = GdkPixbuf.Pixbuf.new_from_file(path) 52 | except GLib.GError as error: 53 | # Empty image for invalid resources 54 | logging.error(f'Unable to get image for "{path}"') 55 | logging.error(str(error)) 56 | pixbuf = None 57 | return self.model.append(parent, [True, resource_type, name, language, 58 | width, height, depth, 59 | os.path.getsize(path), 60 | pixbuf, 61 | path 62 | ]) 63 | 64 | def get_selected(self, path): 65 | return self.model[path][self.__class__.COL_SELECTED] 66 | 67 | def set_selected(self, path, value): 68 | self.model[path][self.__class__.COL_SELECTED] = value 69 | 70 | def get_file_path(self, path): 71 | return self.model[path][self.__class__.COL_FILEPATH] 72 | 73 | def get_model(self): 74 | return self.model 75 | -------------------------------------------------------------------------------- /gextractwinicons/requires.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import gi 22 | 23 | if gi.require_version('Gtk', '3.0') is None: 24 | from gi.repository import Gtk # noqa: F401 25 | if gi.require_version('GdkPixbuf', '2.0') is None: 26 | from gi.repository import GdkPixbuf # noqa: F401 27 | -------------------------------------------------------------------------------- /gextractwinicons/settings.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import configparser 22 | import logging 23 | 24 | POSITION_LEFT = 'left' 25 | POSITION_TOP = 'top' 26 | SIZE_WIDTH = 'width' 27 | SIZE_HEIGHT = 'height' 28 | 29 | DEFAULT_VALUES = {} 30 | 31 | 32 | class Settings(object): 33 | def __init__(self, filename, case_sensitive): 34 | # Parse settings from the configuration file 35 | self.config = configparser.RawConfigParser() 36 | # Set case sensitiveness if requested 37 | if case_sensitive: 38 | self.config.optionxform = str 39 | # Determine which filename to use for settings 40 | self.filename = filename 41 | logging.debug(f'Loading settings from {self.filename}') 42 | self.config.read(self.filename) 43 | 44 | def get(self, section, option, default=None): 45 | """Get an option from a specific section""" 46 | if (self.config.has_section(section) and 47 | self.config.has_option(section, option)): 48 | return self.config.get(section, option) 49 | else: 50 | return default 51 | 52 | def set(self, section, option, value): 53 | """Save an option in a specific section""" 54 | if not self.config.has_section(section): 55 | self.config.add_section(section) 56 | self.config.set(section, option, value) 57 | 58 | def get_boolean(self, section, option, default=None): 59 | """Get a boolean option from a specific section""" 60 | return self.get(section, option, default) == '1' 61 | 62 | def set_boolean(self, section, option, value): 63 | """Save a boolean option in a specific section""" 64 | self.set(section, option, '1' if value else '0') 65 | 66 | def get_int(self, section, option, default=0): 67 | """Get an integer option from a specific section""" 68 | return int(self.get(section, option, default)) 69 | 70 | def set_int(self, section, option, value): 71 | """Set an integer option from a specific section""" 72 | self.set(section, option, int(value)) 73 | 74 | def get_list(self, section, option, separator=','): 75 | """Get an option list from a specific section""" 76 | value = self.get(section, option, '') 77 | if len(value): 78 | return [v.strip() for v in value.split(separator)] 79 | 80 | def load_preferences(self): 81 | """Load preferences""" 82 | for option in DEFAULT_VALUES: 83 | self.set_preference(option, self.get_preference(option)) 84 | 85 | def get_preference(self, option): 86 | """Get a preference value by option name""" 87 | section, default = DEFAULT_VALUES[option] 88 | if isinstance(default, bool): 89 | method_get = self.get_boolean 90 | elif isinstance(default, int): 91 | method_get = self.get_int 92 | else: 93 | method_get = self.get 94 | return method_get(section=section, 95 | option=option, 96 | default=default) 97 | 98 | def set_preference(self, option, value): 99 | """Set a preference value by option name""" 100 | section, default = DEFAULT_VALUES[option] 101 | if isinstance(default, bool): 102 | method_set = self.set_boolean 103 | elif isinstance(default, int): 104 | method_set = self.set_int 105 | else: 106 | method_set = self.set 107 | return method_set(section=section, 108 | option=option, 109 | value=value) 110 | 111 | def save(self): 112 | """Save the whole configuration""" 113 | file_settings = open(self.filename, mode='w') 114 | logging.debug(f'Saving settings to {self.filename}') 115 | self.config.write(file_settings) 116 | file_settings.close() 117 | 118 | def get_sections(self): 119 | """Return the list of the sections""" 120 | return self.config.sections() 121 | 122 | def get_options(self, section): 123 | """Return the list of the options in a section""" 124 | return self.config.options(section) 125 | 126 | def unset_option(self, section, option): 127 | """Remove an option from a section""" 128 | return self.config.remove_option(section, option) 129 | 130 | def clear(self): 131 | """Remove every data in the settings""" 132 | for section in self.get_sections(): 133 | self.config.remove_section(section) 134 | 135 | def restore_window_position(self, window, section): 136 | """Restore the saved window size and position""" 137 | if (self.get_int(section, SIZE_WIDTH) and 138 | self.get_int(section, SIZE_HEIGHT)): 139 | window.set_default_size( 140 | self.get_int(section, SIZE_WIDTH, -1), 141 | self.get_int(section, SIZE_HEIGHT, -1)) 142 | if (self.get_int(section, POSITION_LEFT) and 143 | self.get_int(section, POSITION_TOP)): 144 | window.move( 145 | self.get_int(section, POSITION_LEFT), 146 | self.get_int(section, POSITION_TOP)) 147 | 148 | def save_window_position(self, window, section): 149 | """Save the window size and position""" 150 | position = window.get_position() 151 | self.set_int(section, POSITION_LEFT, position[0]) 152 | self.set_int(section, POSITION_TOP, position[1]) 153 | size = window.get_size() 154 | self.set_int(section, SIZE_WIDTH, size[0]) 155 | self.set_int(section, SIZE_HEIGHT, size[1]) 156 | -------------------------------------------------------------------------------- /gextractwinicons/translations.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import gettext 22 | import locale 23 | 24 | from gextractwinicons.constants import APP_DOMAIN, DIR_LOCALE 25 | from gextractwinicons.localize import (store_message, 26 | strip_colon, 27 | strip_underline, 28 | text) 29 | 30 | 31 | # Load domain for translation 32 | for module in (gettext, locale): 33 | module.bindtextdomain(APP_DOMAIN, DIR_LOCALE) 34 | module.textdomain(APP_DOMAIN) 35 | 36 | # Import some translated messages from GTK+ domain 37 | for message in ('About', 'General', 'Name', 'Size', '_Stop', 'Type', 'Width'): 38 | store_message(strip_colon(strip_underline(message)), 39 | strip_colon(strip_underline(text(message=message, 40 | gtk30=True)))) 41 | 42 | # Import some translated messages from GTK+ domain and context 43 | for message in ('_Quit', '_Refresh'): 44 | store_message(strip_colon(strip_underline(message)), 45 | strip_colon(strip_underline(text(message=message, 46 | gtk30=True, 47 | context='Stock label')))) 48 | 49 | # Import some variations 50 | store_message('Select all', 51 | strip_underline(text(message='Select _All', 52 | gtk30=True))) 53 | -------------------------------------------------------------------------------- /gextractwinicons/ui/__init__.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | -------------------------------------------------------------------------------- /gextractwinicons/ui/about.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import collections 22 | import logging 23 | 24 | from gi.repository.GdkPixbuf import Pixbuf 25 | 26 | from gextractwinicons.constants import (APP_AUTHOR, 27 | APP_AUTHOR_EMAIL, 28 | APP_COPYRIGHT, 29 | APP_NAME, 30 | APP_VERSION, 31 | FILE_CONTRIBUTORS, 32 | FILE_ICON, 33 | FILE_LICENSE, 34 | FILE_TRANSLATORS, 35 | URL_APPLICATION, 36 | URL_AUTHOR, 37 | URL_SOURCES, 38 | URL_TRANSLATIONS) 39 | from gextractwinicons.functions import readlines 40 | from gextractwinicons.localize import _ 41 | from gextractwinicons.ui.base import UIBase 42 | 43 | 44 | class UIAbout(UIBase): 45 | def __init__(self, parent, settings, options): 46 | """Prepare the dialog""" 47 | logging.debug(f'{self.__class__.__name__} init') 48 | super().__init__(filename='about.ui') 49 | # Initialize members 50 | self.settings = settings 51 | self.options = options 52 | # Retrieve the translators list 53 | translators = [] 54 | for line in readlines(FILE_TRANSLATORS, False): 55 | if ':' in line: 56 | line = line.split(':', 1)[1] 57 | line = line.replace('(at)', '@').strip() 58 | if line not in translators: 59 | translators.append(line) 60 | # Set various properties 61 | icon_logo = Pixbuf.new_from_file(str(FILE_ICON)) 62 | self.ui.dialog.set_logo(icon_logo) 63 | self.ui.dialog.set_transient_for(parent) 64 | self.ui.dialog.set_program_name(APP_NAME) 65 | self.ui.dialog.set_version(_('Version {VERSION}').format( 66 | VERSION=APP_VERSION)) 67 | self.ui.dialog.set_comments( 68 | _('Extract cursors and icons from MS Windows resource files')) 69 | self.ui.dialog.set_website(URL_APPLICATION) 70 | self.ui.dialog.set_copyright(APP_COPYRIGHT) 71 | # Prepare lists for authors and contributors 72 | authors = [f'{APP_AUTHOR} <{APP_AUTHOR_EMAIL}>'] 73 | contributors = [] 74 | for line in readlines(FILE_CONTRIBUTORS, False): 75 | contributors.append(line) 76 | if len(contributors) > 0: 77 | contributors.insert(0, _('Contributors:')) 78 | authors.extend(contributors) 79 | self.ui.dialog.set_authors(authors) 80 | self.ui.dialog.set_license('\n'.join(readlines(FILE_LICENSE, True))) 81 | self.ui.dialog.set_translator_credits('\n'.join(translators)) 82 | # Add external URLs 83 | resources_urls = collections.OrderedDict({ 84 | _('Project home page'): URL_APPLICATION, 85 | _('Source code'): URL_SOURCES, 86 | _('Author information'): URL_AUTHOR, 87 | _('Issues and bugs tracking'): f'{URL_APPLICATION}issues/', 88 | _('Translations'): URL_TRANSLATIONS}) 89 | for resource_type, url in resources_urls.items(): 90 | self.ui.dialog.add_credit_section(resource_type, [url]) 91 | # Connect signals from the UI file to the functions with the same name 92 | self.ui.connect_signals(self) 93 | 94 | def show(self): 95 | """Show the dialog""" 96 | logging.debug(f'{self.__class__.__name__} show') 97 | self.ui.dialog.run() 98 | self.ui.dialog.hide() 99 | 100 | def destroy(self): 101 | """Destroy the dialog""" 102 | logging.debug(f'{self.__class__.__name__} destroy') 103 | self.ui.dialog.destroy() 104 | self.ui.dialog = None 105 | -------------------------------------------------------------------------------- /gextractwinicons/ui/base.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import pathlib 22 | from typing import Iterable 23 | 24 | from gi.repository import Gtk 25 | 26 | from gextractwinicons.constants import DIR_ICONS 27 | from gextractwinicons.functions import get_ui_file 28 | from gextractwinicons.gtkbuilder_loader import GtkBuilderLoader 29 | from gextractwinicons.localize import strip_underline, text 30 | 31 | 32 | class UIBase(object): 33 | def __init__(self, filename): 34 | self.ui = GtkBuilderLoader(get_ui_file(filename)) 35 | 36 | def set_buttons_icons(self, buttons: Iterable) -> None: 37 | """ 38 | Set icons for buttons 39 | 40 | :param buttons: tuple or list of buttons to customize 41 | :return: None 42 | """ 43 | for button in buttons: 44 | action = button.get_related_action() 45 | button.set_image(Gtk.Image.new_from_icon_name( 46 | icon_name=action.get_icon_name(), 47 | size=Gtk.IconSize.BUTTON)) 48 | # Remove the button label for not important buttons 49 | if not action.get_is_important(): 50 | button.props.label = None 51 | 52 | def set_titles(self) -> None: 53 | """ 54 | Set titles and tooltips for Actions, Labels and Buttons 55 | :return: None 56 | """ 57 | # Set Actions labels and short labels 58 | for widget in self.ui.get_objects_by_type(Gtk.Action): 59 | # Connect the actions accelerators 60 | widget.connect_accelerator() 61 | # Set labels 62 | label = widget.get_label() 63 | if not label: 64 | label = widget.get_short_label() 65 | widget.set_label(text(label)) 66 | widget.set_short_label(text(label)) 67 | # Set Labels captions 68 | for widget in self.ui.get_objects_by_type(Gtk.Label): 69 | widget.set_label(text(widget.get_label())) 70 | # Initialize buttons labels and tooltips 71 | for widget in self.ui.get_objects_by_type(Gtk.Button): 72 | action = widget.get_related_action() 73 | if action: 74 | widget.set_tooltip_text(strip_underline(action.get_label())) 75 | else: 76 | widget.set_label(strip_underline(text(widget.get_label()))) 77 | widget.set_tooltip_text(widget.get_label()) 78 | # Initialize column headers titles 79 | for widget in self.ui.get_objects_by_type(Gtk.TreeViewColumn): 80 | widget.set_title(strip_underline(text(widget.get_title()))) 81 | # Initialize shortcuts groups titles 82 | for widget in self.ui.get_objects_by_type(Gtk.ShortcutsGroup): 83 | widget.props.title = strip_underline(text(widget.props.title)) 84 | # Initialize shortcuts titles 85 | for widget in self.ui.get_objects_by_type(Gtk.ShortcutsShortcut): 86 | widget.props.title = strip_underline(text(widget.props.title)) 87 | # Initialize menuitems labels 88 | for widget in self.ui.get_objects_by_type(Gtk.MenuItem): 89 | if not isinstance(widget, Gtk.SeparatorMenuItem): 90 | widget.set_label(strip_underline(text(widget.get_label()))) 91 | for widget in self.ui.get_objects_by_type(Gtk.CheckMenuItem): 92 | widget.set_label(strip_underline(text(widget.get_label()))) 93 | for widget in self.ui.get_objects_by_type(Gtk.RadioMenuItem): 94 | widget.set_label(strip_underline(text(widget.get_label()))) 95 | 96 | def load_image_file(self, image: Gtk.Image) -> bool: 97 | """ 98 | Load an icon from filesystem if existing 99 | """ 100 | icon_name, _ = image.get_icon_name() 101 | icon_path = pathlib.Path(DIR_ICONS / f'{icon_name}.png') 102 | if icon_path.is_file(): 103 | image.set_from_file(str(icon_path)) 104 | return icon_path.is_file() 105 | 106 | def set_buttons_style_suggested_action(self, buttons: Iterable): 107 | """Add the suggested-action style to a widget""" 108 | for button in buttons: 109 | button.get_style_context().add_class('suggested-action') 110 | 111 | def set_buttons_style_destructive_action(self, buttons: Iterable): 112 | """Add the destructive-action style to a widget""" 113 | for button in buttons: 114 | button.get_style_context().add_class('destructive-action') 115 | 116 | def show_popup_menu(self, menu: Gtk.Menu): 117 | """Show a popup menu at the current position""" 118 | if not Gtk.check_version(3, 22, 0): 119 | menu.popup_at_pointer(trigger_event=None) 120 | else: 121 | menu.popup(parent_menu_shell=None, 122 | parent_menu_item=None, 123 | func=None, 124 | data=0, 125 | button=0, 126 | activate_time=Gtk.get_current_event_time()) 127 | -------------------------------------------------------------------------------- /gextractwinicons/ui/main.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import logging 22 | import os.path 23 | import shutil 24 | 25 | from gi.repository import Gdk 26 | from gi.repository import Gtk 27 | 28 | from gextractwinicons.constants import (APP_NAME, 29 | FILE_ICON, 30 | FILE_SETTINGS, 31 | RESOURCE_TYPE_GROUP_CURSOR, 32 | RESOURCE_TYPE_GROUP_ICON) 33 | from gextractwinicons.extractor import Extractor 34 | from gextractwinicons.functions import process_events 35 | from gextractwinicons.localize import _ 36 | from gextractwinicons.model_resources import ModelResources 37 | from gextractwinicons.settings import Settings 38 | from gextractwinicons.ui.about import UIAbout 39 | from gextractwinicons.ui.base import UIBase 40 | from gextractwinicons.ui.shortcuts import UIShortcuts 41 | 42 | SECTION_WINDOW_NAME = 'main window' 43 | 44 | 45 | class UIMain(UIBase): 46 | def __init__(self, application, options): 47 | """Prepare the main window""" 48 | logging.debug(f'{self.__class__.__name__} init') 49 | super().__init__(filename='main.ui') 50 | # Initialize members 51 | self.application = application 52 | self.options = options 53 | self.is_refreshing = False 54 | self.total_resources = 0 55 | self.total_images = 0 56 | self.total_selected = 0 57 | # Load settings 58 | self.settings = Settings(filename=FILE_SETTINGS, 59 | case_sensitive=True) 60 | self.settings.load_preferences() 61 | self.settings_map = {} 62 | # Load UI 63 | self.load_ui() 64 | # Prepare the models 65 | self.model = ModelResources(model=self.ui.store_resources, 66 | settings=self.settings) 67 | # Prepare the extractor 68 | self.extractor = Extractor(settings=self.settings) 69 | # Complete initialization 70 | self.startup() 71 | 72 | def load_ui(self): 73 | """Load the interface UI""" 74 | logging.debug(f'{self.__class__.__name__} load UI') 75 | # Initialize titles and tooltips 76 | self.set_titles() 77 | # Initialize Gtk.HeaderBar 78 | self.ui.header_bar.props.title = self.ui.window.get_title() 79 | self.ui.window.set_titlebar(self.ui.header_bar) 80 | self.set_buttons_icons(buttons=[self.ui.button_select_all, 81 | self.ui.button_select_png, 82 | self.ui.button_deselect_all, 83 | self.ui.button_save, 84 | self.ui.button_refresh, 85 | self.ui.button_stop, 86 | self.ui.button_about, 87 | self.ui.button_options]) 88 | # Set buttons with always show image 89 | for button in [self.ui.button_save]: 90 | button.set_always_show_image(True) 91 | # Set various properties 92 | self.ui.window.set_title(APP_NAME) 93 | self.ui.window.set_icon_from_file(str(FILE_ICON)) 94 | self.ui.window.set_application(self.application) 95 | # Add the filters for file selection button 96 | self.ui.file_filter_ms.set_name(_('MS Windows compatible files')) 97 | self.ui.button_filename.add_filter(self.ui.file_filter_ms) 98 | self.ui.file_filter_all.set_name(_('All files')) 99 | self.ui.button_filename.add_filter(self.ui.file_filter_all) 100 | self.ui.button_filename.set_filter(self.ui.file_filter_ms) 101 | # Connect signals from the UI file to the functions with the same name 102 | self.ui.connect_signals(self) 103 | 104 | def startup(self): 105 | """Complete initialization""" 106 | logging.debug(f'{self.__class__.__name__} startup') 107 | # Load settings 108 | for setting_name, action in self.settings_map.items(): 109 | action.set_active(self.settings.get_preference( 110 | option=setting_name)) 111 | # Set initial resources file 112 | if self.options.filename: 113 | self.ui.button_filename.select_filename(self.options.filename) 114 | self.ui.action_refresh.set_sensitive(True) 115 | # Set initial destination folder 116 | self.ui.button_destination.set_filename( 117 | self.options.destination or os.path.expanduser('~')) 118 | # Restore the saved size and position 119 | self.settings.restore_window_position(window=self.ui.window, 120 | section=SECTION_WINDOW_NAME) 121 | 122 | def run(self): 123 | """Show the UI""" 124 | logging.debug(f'{self.__class__.__name__} run') 125 | self.ui.window.show_all() 126 | # Automatically refresh if the refresh setting was passed 127 | if self.options.refresh: 128 | self.on_button_filename_file_set(self.ui.button_filename) 129 | 130 | def do_update_totals(self): 131 | """Update totals on the label""" 132 | self.ui.label_totals.set_label(_( 133 | '{TOTAL} resources found ({SELECTED} resources selected)').format( 134 | TOTAL=self.total_resources + self.total_images, 135 | SELECTED=self.total_selected)) 136 | self.ui.action_save.set_sensitive(self.total_selected > 0) 137 | 138 | def on_action_about_activate(self, widget): 139 | """Show the information dialog""" 140 | dialog = UIAbout(parent=self.ui.window, 141 | settings=self.settings, 142 | options=self.options) 143 | dialog.show() 144 | dialog.destroy() 145 | 146 | def on_action_shortcuts_activate(self, widget): 147 | """Show the shortcuts dialog""" 148 | dialog = UIShortcuts(parent=self.ui.window, 149 | settings=self.settings, 150 | options=self.options) 151 | dialog.show() 152 | 153 | def on_action_quit_activate(self, widget): 154 | """Save the settings and close the application""" 155 | logging.debug(f'{self.__class__.__name__} quit') 156 | self.settings.save_window_position(window=self.ui.window, 157 | section=SECTION_WINDOW_NAME) 158 | self.settings.save() 159 | self.ui.window.destroy() 160 | self.extractor.destroy() 161 | self.application.quit() 162 | 163 | def on_action_options_menu_activate(self, widget): 164 | """Open the options menu""" 165 | self.ui.button_options.clicked() 166 | 167 | def on_action_refresh_activate(self, widget): 168 | """Extract the cursors and icons from the chosen filename""" 169 | logging.debug('Extraction started') 170 | self.is_refreshing = True 171 | self.total_resources = 0 172 | self.total_images = 0 173 | self.total_selected = 0 174 | # Hide controls during the extraction 175 | self.ui.action_refresh.set_sensitive(False) 176 | self.ui.action_stop.set_sensitive(True) 177 | self.ui.action_save.set_sensitive(False) 178 | self.ui.action_select_all.set_sensitive(False) 179 | self.ui.action_select_none.set_sensitive(False) 180 | self.ui.action_select_png.set_sensitive(False) 181 | self.ui.button_filename.set_sensitive(False) 182 | self.ui.button_refresh.set_visible(False) 183 | self.ui.button_stop.set_visible(True) 184 | self.ui.progress_loader.set_fraction(0.0) 185 | self.ui.progress_loader.show() 186 | if not self.options.nofreeze: 187 | # Freeze updates and disconnect model to load faster 188 | self.ui.treeview_resources.freeze_child_notify() 189 | self.ui.treeview_resources.set_model(None) 190 | # Clear the extractor directory 191 | self.extractor.clear() 192 | # Clear the previous items from the model 193 | self.model.clear() 194 | # List all the resources from the chosen filename 195 | all_resources = self.extractor.list( 196 | filename=self.ui.button_filename.get_filename()) 197 | for index, resource in enumerate(all_resources): 198 | # Cancel running extraction 199 | if not self.is_refreshing: 200 | break 201 | # Only cursors and icon groups are well-supported by wrestool 202 | if resource['--type'] in ( 203 | RESOURCE_TYPE_GROUP_CURSOR, RESOURCE_TYPE_GROUP_ICON): 204 | logging.debug(f'Resource found: {resource}') 205 | # Extract the resource from the chosen filename 206 | resource_filename = self.extractor.extract( 207 | self.ui.button_filename.get_filename(), resource) 208 | if resource_filename: 209 | # Add resource to the tree and save iter to append children 210 | iter_resource = self.model.add_resource( 211 | None, 212 | _('cursors') 213 | if resource['--type'] == RESOURCE_TYPE_GROUP_CURSOR 214 | else _('icons'), 215 | resource['--name'], 216 | resource['--language'], 217 | None, 218 | None, 219 | None, 220 | resource_filename 221 | ) 222 | self.total_resources += 1 223 | self.total_selected += 1 224 | # Extract all the images from the resource 225 | for image in self.extractor.extract_images( 226 | resource_filename): 227 | # Cancel running extraction 228 | if not self.is_refreshing: 229 | break 230 | if '--icon' in image: 231 | image['--type'] = _('icon') 232 | elif '--cursor' in image: 233 | image['--type'] = _('cursor') 234 | else: 235 | image['--type'] = None 236 | # Add children images to the resource in the treeview 237 | self.model.add_resource( 238 | iter_resource, 239 | image['--type'], 240 | image['--index'], 241 | '', 242 | image['--width'], 243 | image['--height'], 244 | image['--bit-depth'], 245 | image['path'] 246 | ) 247 | self.total_images += 1 248 | self.total_selected += 1 249 | # Let the interface continue its main loop 250 | process_events() 251 | # Update the ProgressBar 252 | self.ui.progress_loader.set_fraction( 253 | float(index) / len(all_resources)) 254 | # Resources loading completed or canceled 255 | self.ui.action_refresh.set_sensitive(True) 256 | self.ui.action_stop.set_sensitive(False) 257 | self.ui.action_select_all.set_sensitive(True) 258 | self.ui.action_select_none.set_sensitive(True) 259 | self.ui.action_select_png.set_sensitive(True) 260 | self.ui.button_filename.set_sensitive(True) 261 | self.ui.button_refresh.set_visible(True) 262 | self.ui.button_stop.set_visible(False) 263 | self.ui.progress_loader.hide() 264 | if not self.options.nofreeze: 265 | # Unfreeze the treeview from refresh 266 | self.ui.treeview_resources.set_model(self.model.get_model()) 267 | self.ui.treeview_resources.thaw_child_notify() 268 | self.ui.treeview_resources.expand_all() 269 | status = 'completed' if self.is_refreshing else 'canceled' 270 | logging.info(f'Extraction {status} ' 271 | f'({self.total_resources} resources found, ' 272 | f'{self.total_images} images found)') 273 | self.do_update_totals() 274 | self.is_refreshing = False 275 | 276 | def on_action_stop_activate(self, widget): 277 | """Stop the extraction""" 278 | logging.debug('Extraction stopping...') 279 | self.is_refreshing = False 280 | 281 | def on_action_save_activate(self, widget): 282 | """Save the selected resources""" 283 | destination_path = self.ui.button_destination.get_filename() 284 | saved_count = 0 285 | # Iter the first level 286 | for treeiter in self.model.get_model(): 287 | if self.model.get_selected(treeiter.path): 288 | # Copy ico/cur file 289 | shutil.copy(src=self.model.get_file_path(treeiter.path), 290 | dst=destination_path) 291 | saved_count += 1 292 | # Iter the children 293 | for treeiter in treeiter.iterchildren(): 294 | if self.model.get_selected(treeiter.path): 295 | # Copy PNG image 296 | shutil.copy(src=self.model.get_file_path(treeiter.path), 297 | dst=destination_path) 298 | saved_count += 1 299 | logging.info(f'{saved_count} resources were saved ' 300 | f'to {destination_path}') 301 | # Show the completion dialog 302 | dialog = Gtk.MessageDialog( 303 | parent=self.ui.window, 304 | flags=Gtk.DialogFlags.MODAL, 305 | type=Gtk.MessageType.INFO, 306 | buttons=Gtk.ButtonsType.OK, 307 | message_format=_('Extraction completed.') 308 | ) 309 | dialog.set_title(APP_NAME) 310 | dialog.set_icon_from_file(str(FILE_ICON)) 311 | dialog.run() 312 | dialog.destroy() 313 | 314 | def on_action_select_activate(self, widget): 315 | """Deselect or select all the resources or only the images""" 316 | self.total_selected = 0 317 | for treeiter in self.model.get_model(): 318 | # Iter the resources 319 | if widget is self.ui.action_select_all: 320 | # Select all 321 | self.model.set_selected(treeiter.path, True) 322 | self.total_selected += 1 323 | elif (widget is self.ui.action_select_none or 324 | widget is self.ui.action_select_png): 325 | # Deselect all 326 | self.model.set_selected(treeiter.path, False) 327 | # Iter the images 328 | for treeiter in treeiter.iterchildren(): 329 | if widget in (self.ui.action_select_all, 330 | self.ui.action_select_png): 331 | self.model.set_selected(treeiter.path, True) 332 | self.total_selected += 1 333 | elif widget is self.ui.action_select_none: 334 | self.model.set_selected(treeiter.path, False) 335 | self.do_update_totals() 336 | 337 | def on_button_filename_file_set(self, widget): 338 | """Activate refresh if a file was set""" 339 | self.ui.action_refresh.set_sensitive(True) 340 | self.ui.action_refresh.activate() 341 | 342 | def on_cell_select_toggled(self, renderer, path): 343 | """Select and deselect an item""" 344 | status = self.model.get_selected(path) 345 | self.model.set_selected(path, not status) 346 | # Add or subtract 1 from the total selected items count 347 | self.total_selected += -1 if status else 1 348 | self.do_update_totals() 349 | 350 | def on_treeview_resources_button_release_event(self, widget, event): 351 | if event.button == Gdk.BUTTON_SECONDARY: 352 | self.ui.menu_select_resources.popup_at_pointer(event) 353 | 354 | def on_window_delete_event(self, widget, event): 355 | """Close the application by closing the main window""" 356 | self.ui.action_quit.activate() 357 | -------------------------------------------------------------------------------- /gextractwinicons/ui/shortcuts.py: -------------------------------------------------------------------------------- 1 | ## 2 | # Project: gExtractWinIcons 3 | # Description: Extract cursors and icons from MS Windows resource files 4 | # Author: Fabio Castelli (Muflone) 5 | # Copyright: 2009-2022 Fabio Castelli 6 | # License: GPL-3+ 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation, either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program. If not, see . 19 | ## 20 | 21 | import logging 22 | 23 | from gextractwinicons.ui.base import UIBase 24 | 25 | 26 | class UIShortcuts(UIBase): 27 | def __init__(self, parent, settings, options): 28 | """Prepare the dialog""" 29 | logging.debug(f'{self.__class__.__name__} init') 30 | super().__init__(filename='shortcuts.ui') 31 | # Initialize members 32 | self.settings = settings 33 | self.options = options 34 | # Load the user interface 35 | self.ui.shortcuts.set_transient_for(parent) 36 | # Initialize titles and tooltips 37 | self.set_titles() 38 | 39 | def show(self): 40 | """Show the dialog""" 41 | logging.debug(f'{self.__class__.__name__} show') 42 | self.ui.shortcuts.show() 43 | 44 | def destroy(self): 45 | """Destroy the dialog""" 46 | logging.debug(f'{self.__class__.__name__} destroy') 47 | self.ui.shortcuts.destroy() 48 | self.ui.shortcuts = None 49 | -------------------------------------------------------------------------------- /icons/128x128/gextractwinicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muflone/gextractwinicons/3cbb541cc5852c014f6361b5ccc16515827c5beb/icons/128x128/gextractwinicons.png -------------------------------------------------------------------------------- /icons/16x16/gextractwinicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muflone/gextractwinicons/3cbb541cc5852c014f6361b5ccc16515827c5beb/icons/16x16/gextractwinicons.png -------------------------------------------------------------------------------- /icons/24x24/gextractwinicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muflone/gextractwinicons/3cbb541cc5852c014f6361b5ccc16515827c5beb/icons/24x24/gextractwinicons.png -------------------------------------------------------------------------------- /icons/256x256/gextractwinicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muflone/gextractwinicons/3cbb541cc5852c014f6361b5ccc16515827c5beb/icons/256x256/gextractwinicons.png -------------------------------------------------------------------------------- /icons/32x32/gextractwinicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muflone/gextractwinicons/3cbb541cc5852c014f6361b5ccc16515827c5beb/icons/32x32/gextractwinicons.png -------------------------------------------------------------------------------- /icons/48x48/gextractwinicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muflone/gextractwinicons/3cbb541cc5852c014f6361b5ccc16515827c5beb/icons/48x48/gextractwinicons.png -------------------------------------------------------------------------------- /icons/64x64/gextractwinicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muflone/gextractwinicons/3cbb541cc5852c014f6361b5ccc16515827c5beb/icons/64x64/gextractwinicons.png -------------------------------------------------------------------------------- /icons/96x96/gextractwinicons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muflone/gextractwinicons/3cbb541cc5852c014f6361b5ccc16515827c5beb/icons/96x96/gextractwinicons.png -------------------------------------------------------------------------------- /icons/scalable/gextractwinicons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 21 | 23 | 30 | 33 | 37 | 41 | 42 | 51 | 54 | 58 | 62 | 63 | 72 | 74 | 78 | 82 | 86 | 87 | 96 | 99 | 103 | 107 | 108 | 117 | 120 | 124 | 128 | 129 | 140 | 142 | 146 | 150 | 151 | 162 | 164 | 168 | 172 | 176 | 177 | 188 | 191 | 195 | 199 | 200 | 211 | 221 | 224 | 228 | 232 | 233 | 235 | 239 | 243 | 244 | 246 | 250 | 254 | 255 | 257 | 261 | 265 | 266 | 276 | 286 | 296 | 297 | 323 | 337 | 338 | 340 | 341 | 343 | image/svg+xml 344 | 346 | 347 | 348 | Muflone 349 | 350 | 351 | Document Print 352 | 354 | 355 | 356 | print 357 | document 358 | hardcopy 359 | 360 | 361 | 362 | 364 | 366 | 368 | 370 | 372 | 374 | 376 | 377 | 378 | 379 | 384 | 394 | 399 | 404 | 409 | 413 | 422 | 427 | 436 | 437 | 438 | 443 | 447 | 451 | 455 | 464 | 473 | 480 | 487 | 494 | 501 | 502 | 503 | 507 | 517 | 527 | 537 | 547 | 557 | 560 | 565 | 570 | 571 | 581 | 582 | 583 | 584 | -------------------------------------------------------------------------------- /man/gextractwinicons.1: -------------------------------------------------------------------------------- 1 | .\" $Id: gextractwinicons.1 0.3 2013-10-27 19:56 muflone $ 2 | .\" 3 | .\" Copyright (c) 2009-2022 Fabio Castelli 4 | 5 | .TH GEXTRACTWINICONS "1" "October 27, 2013" 6 | 7 | .SH NAME 8 | .B gExtractWinIcons 9 | \- Extract cursors and icons from MS Windows resource files 10 | 11 | .SH SYNOPSIS 12 | .B gextractwinicons 13 | \-h 14 | .br 15 | .B gextractwinicons 16 | [options] 17 | 18 | .SH DESCRIPTION 19 | .PP 20 | .B gExtractWinIcons 21 | is a GTK+ utility to extract cursors, icons and png images from MS Windows 22 | compatible resource files (.exe, .dll, .ocx, .cpl and many others). 23 | 24 | .PP 25 | To extract icons or cursors just to select a MS Windows compatible resource 26 | file and the contained resources will be shown. Select a destination directory 27 | where to save the selected resources, simply check the items to extract and 28 | press the save button to save them in the specified path. 29 | 30 | .SH "OPTIONS" 31 | This program follow the usual GNU command line syntax, with long 32 | options starting with two dashes (`\-'). 33 | A summary of options is included below. 34 | .TP 35 | .B \-h, \-\-help 36 | Show summary of options 37 | .TP 38 | .B \-v, \-\-verbose 39 | Be verbose (print additional useful status messages) 40 | .TP 41 | .B \-q, \-\-quiet 42 | Do not print any output to the stdout 43 | .TP 44 | .B \-d, \-\-destination 45 | Set destination folder for extracted resources 46 | .TP 47 | .B \-f, \-\-filename 48 | Set resources filename from which to extract the resources 49 | .TP 50 | .B \-r, \-\-refresh 51 | Automatically refresh the resources list if \-f (\-\-filename) was specified 52 | .TP 53 | .B \-n, \-\-nofreeze 54 | Do not freeze the treeview during the refresh (slower) 55 | 56 | .SH REPORTING BUGS 57 | Report bugs to https://github.com/muflone/gextractwinicons/issues/ 58 | 59 | .SH AUTHORS 60 | .B gExtractWinIcons 61 | was written by Fabio Castelli (Muflone) 62 | 63 | .SH HOMEPAGE 64 | Home page: http://www.muflone.com/gextractwinicons/ 65 | 66 | Source code: https://github.com/muflone/gextractwinicons/ 67 | 68 | .SH COPYRIGHT 69 | Copyright © 2009-2022 Fabio Castelli. 70 | License GPLv3+: GNU GPL version 3 or later . 71 | 72 | This is free software: you are free to change and redistribute it. 73 | There is NO WARRANTY, to the extent permitted by law. 74 | -------------------------------------------------------------------------------- /po/bg.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Bulgarian translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # sahwar , 2014 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2022-04-18 01:16+0200\n" 16 | "Last-Translator: sahwar \n" 17 | "Language-Team: Bulgarian\n" 18 | "Language: bg\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: gextractwinicons/ui/about.py:65 25 | #, python-brace-format 26 | msgid "Version {VERSION}" 27 | msgstr "Версия {VERSION}" 28 | 29 | #: gextractwinicons/ui/about.py:68 30 | msgid "Extract cursors and icons from MS Windows resource files" 31 | msgstr "" 32 | 33 | #: gextractwinicons/ui/about.py:77 34 | msgid "Contributors:" 35 | msgstr "" 36 | 37 | #: gextractwinicons/ui/about.py:84 38 | msgid "Project home page" 39 | msgstr "" 40 | 41 | #: gextractwinicons/ui/about.py:85 42 | msgid "Source code" 43 | msgstr "" 44 | 45 | #: gextractwinicons/ui/about.py:86 46 | msgid "Author information" 47 | msgstr "" 48 | 49 | #: gextractwinicons/ui/about.py:87 50 | msgid "Issues and bugs tracking" 51 | msgstr "" 52 | 53 | #: gextractwinicons/ui/about.py:88 54 | msgid "Translations" 55 | msgstr "" 56 | 57 | #: gextractwinicons/ui/main.py:96 58 | msgid "MS Windows compatible files" 59 | msgstr "MS Windows-съвместими файлове" 60 | 61 | #: gextractwinicons/ui/main.py:98 62 | msgid "All files" 63 | msgstr "Всички файлове" 64 | 65 | #: gextractwinicons/ui/main.py:133 66 | #, python-brace-format 67 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 68 | msgstr "{TOTAL} ресурс(а) ({SELECTED} ресурс(а) избран(и))" 69 | 70 | #: gextractwinicons/ui/main.py:212 71 | msgid "cursors" 72 | msgstr "курсори" 73 | 74 | #: gextractwinicons/ui/main.py:214 75 | msgid "icons" 76 | msgstr "икони" 77 | 78 | #: gextractwinicons/ui/main.py:231 79 | msgid "icon" 80 | msgstr "икона" 81 | 82 | #: gextractwinicons/ui/main.py:233 83 | msgid "cursor" 84 | msgstr "курсор" 85 | 86 | #: gextractwinicons/ui/main.py:307 87 | msgid "Extraction completed." 88 | msgstr "Извличането е завършено." 89 | 90 | #: ui/main.ui:25 ui/shortcuts.ui:28 91 | msgid "Keyboard shortcuts" 92 | msgstr "Клавишни комбинации" 93 | 94 | #: ui/main.ui:33 ui/main.ui:39 95 | msgid "Open the options menu" 96 | msgstr "" 97 | 98 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 99 | msgid "Save resources" 100 | msgstr "Запазване на pесурси" 101 | 102 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 103 | msgid "Deselect all" 104 | msgstr "Отмаркирване на всичко" 105 | 106 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 107 | msgid "Select only PNGs" 108 | msgstr "Избиране само на PNG изображения" 109 | 110 | #: ui/main.ui:135 ui/main.ui:225 111 | msgid "Select resources" 112 | msgstr "Избиране на pесурси" 113 | 114 | #: ui/main.ui:397 115 | msgid "File to open:" 116 | msgstr "Файл за отваряне:" 117 | 118 | #: ui/main.ui:421 119 | msgid "Destination folder:" 120 | msgstr "Целева папка:" 121 | 122 | #: ui/main.ui:435 123 | msgid "Select path for saving" 124 | msgstr "Избор на пътека за запис" 125 | 126 | #: ui/main.ui:446 127 | msgid "Available resources:" 128 | msgstr "Ресурси на разположение:" 129 | 130 | #: ui/main.ui:474 131 | msgid "Preview" 132 | msgstr "Предварителен преглед" 133 | 134 | #: ui/main.ui:523 135 | msgid "Height" 136 | msgstr "Дължина" 137 | 138 | #: ui/main.ui:535 139 | msgid "Bits" 140 | msgstr "Бита" 141 | 142 | #: ui/main.ui:562 143 | msgid "Extract" 144 | msgstr "Извличане" 145 | 146 | #: ui/main.ui:586 147 | msgid "Please select a file to list the available resources" 148 | msgstr "" 149 | "Моля, изберете файл, за да се покаже списък с ресурсите на разположение" 150 | 151 | #: ui/shortcuts.ui:21 152 | msgid "Show the about dialog" 153 | msgstr "" 154 | 155 | #: ui/shortcuts.ui:45 156 | msgid "Resources" 157 | msgstr "Ресурси" 158 | -------------------------------------------------------------------------------- /po/ca.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Catalan translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Adolfo Jayme-Barrientos , 2012 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2022-04-18 01:27+0200\n" 16 | "Last-Translator: Adolfo Jayme-Barrientos \n" 17 | "Language-Team: Catalan\n" 18 | "Language: ca\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: gextractwinicons/ui/about.py:65 25 | #, python-brace-format 26 | msgid "Version {VERSION}" 27 | msgstr "Versió {VERSION}" 28 | 29 | #: gextractwinicons/ui/about.py:68 30 | msgid "Extract cursors and icons from MS Windows resource files" 31 | msgstr "Extreure cursors i icones de MS de recursos de Windows." 32 | 33 | #: gextractwinicons/ui/about.py:77 34 | msgid "Contributors:" 35 | msgstr "" 36 | 37 | #: gextractwinicons/ui/about.py:84 38 | msgid "Project home page" 39 | msgstr "" 40 | 41 | #: gextractwinicons/ui/about.py:85 42 | msgid "Source code" 43 | msgstr "" 44 | 45 | #: gextractwinicons/ui/about.py:86 46 | msgid "Author information" 47 | msgstr "" 48 | 49 | #: gextractwinicons/ui/about.py:87 50 | msgid "Issues and bugs tracking" 51 | msgstr "" 52 | 53 | #: gextractwinicons/ui/about.py:88 54 | msgid "Translations" 55 | msgstr "" 56 | 57 | #: gextractwinicons/ui/main.py:96 58 | msgid "MS Windows compatible files" 59 | msgstr "Fitxers compatibles amb MS Windows" 60 | 61 | #: gextractwinicons/ui/main.py:98 62 | msgid "All files" 63 | msgstr "Tots els fitxers" 64 | 65 | #: gextractwinicons/ui/main.py:133 66 | #, python-brace-format 67 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 68 | msgstr "{TOTAL} recursos trobats ({SELECTED} recursos seleccionats)" 69 | 70 | #: gextractwinicons/ui/main.py:212 71 | msgid "cursors" 72 | msgstr "cursors" 73 | 74 | #: gextractwinicons/ui/main.py:214 75 | msgid "icons" 76 | msgstr "icones" 77 | 78 | #: gextractwinicons/ui/main.py:231 79 | msgid "icon" 80 | msgstr "icona" 81 | 82 | #: gextractwinicons/ui/main.py:233 83 | msgid "cursor" 84 | msgstr "cursor" 85 | 86 | #: gextractwinicons/ui/main.py:307 87 | msgid "Extraction completed." 88 | msgstr "S’ha completat la extracció." 89 | 90 | #: ui/main.ui:25 ui/shortcuts.ui:28 91 | msgid "Keyboard shortcuts" 92 | msgstr "Dreceres de teclat" 93 | 94 | #: ui/main.ui:33 ui/main.ui:39 95 | msgid "Open the options menu" 96 | msgstr "" 97 | 98 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 99 | msgid "Save resources" 100 | msgstr "Desa recursos" 101 | 102 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 103 | msgid "Deselect all" 104 | msgstr "Deselecciona tot" 105 | 106 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 107 | msgid "Select only PNGs" 108 | msgstr "Selecciona només PNG" 109 | 110 | #: ui/main.ui:135 ui/main.ui:225 111 | msgid "Select resources" 112 | msgstr "Selecciona recursos" 113 | 114 | #: ui/main.ui:397 115 | msgid "File to open:" 116 | msgstr "Fitxer a obrir:" 117 | 118 | #: ui/main.ui:421 119 | msgid "Destination folder:" 120 | msgstr "Carpeta de destinació:" 121 | 122 | #: ui/main.ui:435 123 | msgid "Select path for saving" 124 | msgstr "Seleccioneu la ruta per desar" 125 | 126 | #: ui/main.ui:446 127 | msgid "Available resources:" 128 | msgstr "Recursos disponibles:" 129 | 130 | #: ui/main.ui:474 131 | msgid "Preview" 132 | msgstr "Previsualitzar" 133 | 134 | #: ui/main.ui:523 135 | msgid "Height" 136 | msgstr "Alçada" 137 | 138 | #: ui/main.ui:535 139 | msgid "Bits" 140 | msgstr "Bits" 141 | 142 | #: ui/main.ui:562 143 | msgid "Extract" 144 | msgstr "Extreu" 145 | 146 | #: ui/main.ui:586 147 | msgid "Please select a file to list the available resources" 148 | msgstr "Seleccioneu un fitxer per llistar els recursos disponibles" 149 | 150 | #: ui/shortcuts.ui:21 151 | msgid "Show the about dialog" 152 | msgstr "" 153 | 154 | #: ui/shortcuts.ui:45 155 | msgid "Resources" 156 | msgstr "Recursos" 157 | -------------------------------------------------------------------------------- /po/de.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # German translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Ettore Atalan , 2014 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2022-04-18 01:37+0200\n" 16 | "Last-Translator: Ettore Atalan \n" 17 | "Language-Team: German\n" 18 | "Language: de\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: gextractwinicons/ui/about.py:65 25 | #, python-brace-format 26 | msgid "Version {VERSION}" 27 | msgstr "Version {VERSION}" 28 | 29 | #: gextractwinicons/ui/about.py:68 30 | msgid "Extract cursors and icons from MS Windows resource files" 31 | msgstr "Extrahieren von Zeigern, Symbolen von MS Windows-Ressourcendateien" 32 | 33 | #: gextractwinicons/ui/about.py:77 34 | msgid "Contributors:" 35 | msgstr "Beitragende:" 36 | 37 | #: gextractwinicons/ui/about.py:84 38 | msgid "Project home page" 39 | msgstr "" 40 | 41 | #: gextractwinicons/ui/about.py:85 42 | msgid "Source code" 43 | msgstr "" 44 | 45 | #: gextractwinicons/ui/about.py:86 46 | msgid "Author information" 47 | msgstr "" 48 | 49 | #: gextractwinicons/ui/about.py:87 50 | msgid "Issues and bugs tracking" 51 | msgstr "" 52 | 53 | #: gextractwinicons/ui/about.py:88 54 | msgid "Translations" 55 | msgstr "" 56 | 57 | #: gextractwinicons/ui/main.py:96 58 | msgid "MS Windows compatible files" 59 | msgstr "MS Windows-kompatible Dateien" 60 | 61 | #: gextractwinicons/ui/main.py:98 62 | msgid "All files" 63 | msgstr "Alle Dateien" 64 | 65 | #: gextractwinicons/ui/main.py:133 66 | #, python-brace-format 67 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 68 | msgstr "{TOTAL} Ressourcen gefunden ({SELECTED} Ressourcen ausgewählt)" 69 | 70 | #: gextractwinicons/ui/main.py:212 71 | msgid "cursors" 72 | msgstr "Zeiger" 73 | 74 | #: gextractwinicons/ui/main.py:214 75 | msgid "icons" 76 | msgstr "Symbole" 77 | 78 | #: gextractwinicons/ui/main.py:231 79 | msgid "icon" 80 | msgstr "Symbol" 81 | 82 | #: gextractwinicons/ui/main.py:233 83 | msgid "cursor" 84 | msgstr "Zeiger" 85 | 86 | #: gextractwinicons/ui/main.py:307 87 | msgid "Extraction completed." 88 | msgstr "Extrahierung abgeschlossen." 89 | 90 | #: ui/main.ui:25 ui/shortcuts.ui:28 91 | msgid "Keyboard shortcuts" 92 | msgstr "Tastenkürzel" 93 | 94 | #: ui/main.ui:33 ui/main.ui:39 95 | msgid "Open the options menu" 96 | msgstr "" 97 | 98 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 99 | msgid "Save resources" 100 | msgstr "Speichern ressourcen" 101 | 102 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 103 | msgid "Deselect all" 104 | msgstr "Alle abwählen" 105 | 106 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 107 | msgid "Select only PNGs" 108 | msgstr "Nur PNGs auswählen" 109 | 110 | #: ui/main.ui:135 ui/main.ui:225 111 | msgid "Select resources" 112 | msgstr "Schriftart ressourcen" 113 | 114 | #: ui/main.ui:397 115 | msgid "File to open:" 116 | msgstr "Zu öffnende Datei:" 117 | 118 | #: ui/main.ui:421 119 | msgid "Destination folder:" 120 | msgstr "Zielordner:" 121 | 122 | #: ui/main.ui:435 123 | msgid "Select path for saving" 124 | msgstr "Pfad zum Speichern auswählen" 125 | 126 | #: ui/main.ui:446 127 | msgid "Available resources:" 128 | msgstr "Verfügbare Ressourcen:" 129 | 130 | #: ui/main.ui:474 131 | msgid "Preview" 132 | msgstr "Vorschau" 133 | 134 | #: ui/main.ui:523 135 | msgid "Height" 136 | msgstr "Höhe" 137 | 138 | #: ui/main.ui:535 139 | msgid "Bits" 140 | msgstr "Bits" 141 | 142 | #: ui/main.ui:562 143 | msgid "Extract" 144 | msgstr "Extrahieren" 145 | 146 | #: ui/main.ui:586 147 | msgid "Please select a file to list the available resources" 148 | msgstr "" 149 | "Bitte wählen Sie eine Datei aus, um die verfügbaren Ressourcen aufzulisten" 150 | 151 | #: ui/shortcuts.ui:21 152 | msgid "Show the about dialog" 153 | msgstr "" 154 | 155 | #: ui/shortcuts.ui:45 156 | msgid "Resources" 157 | msgstr "Ressourcen" 158 | -------------------------------------------------------------------------------- /po/en.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # English translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Fabio Castelli (Muflone) , 2010-2022 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2022-04-18 01:39+0200\n" 16 | "Last-Translator: Fabio Castelli (Muflone) \n" 17 | "Language-Team: English (United States)\n" 18 | "Language: en_US\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: gextractwinicons/ui/about.py:65 25 | #, python-brace-format 26 | msgid "Version {VERSION}" 27 | msgstr "Version {VERSION}" 28 | 29 | #: gextractwinicons/ui/about.py:68 30 | msgid "Extract cursors and icons from MS Windows resource files" 31 | msgstr "Extract cursors and icons from MS Windows resource files" 32 | 33 | #: gextractwinicons/ui/about.py:77 34 | msgid "Contributors:" 35 | msgstr "Contributors:" 36 | 37 | #: gextractwinicons/ui/about.py:84 38 | msgid "Project home page" 39 | msgstr "Project home page" 40 | 41 | #: gextractwinicons/ui/about.py:85 42 | msgid "Source code" 43 | msgstr "Source code" 44 | 45 | #: gextractwinicons/ui/about.py:86 46 | msgid "Author information" 47 | msgstr "Author information" 48 | 49 | #: gextractwinicons/ui/about.py:87 50 | msgid "Issues and bugs tracking" 51 | msgstr "Issues and bugs tracking" 52 | 53 | #: gextractwinicons/ui/about.py:88 54 | msgid "Translations" 55 | msgstr "Translations" 56 | 57 | #: gextractwinicons/ui/main.py:96 58 | msgid "MS Windows compatible files" 59 | msgstr "MS Windows compatible files" 60 | 61 | #: gextractwinicons/ui/main.py:98 62 | msgid "All files" 63 | msgstr "All files" 64 | 65 | #: gextractwinicons/ui/main.py:133 66 | #, python-brace-format 67 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 68 | msgstr "{TOTAL} resources found ({SELECTED} resources selected)" 69 | 70 | #: gextractwinicons/ui/main.py:212 71 | msgid "cursors" 72 | msgstr "cursors" 73 | 74 | #: gextractwinicons/ui/main.py:214 75 | msgid "icons" 76 | msgstr "icons" 77 | 78 | #: gextractwinicons/ui/main.py:231 79 | msgid "icon" 80 | msgstr "icon" 81 | 82 | #: gextractwinicons/ui/main.py:233 83 | msgid "cursor" 84 | msgstr "cursor" 85 | 86 | #: gextractwinicons/ui/main.py:307 87 | msgid "Extraction completed." 88 | msgstr "Extraction completed." 89 | 90 | #: ui/main.ui:25 ui/shortcuts.ui:28 91 | msgid "Keyboard shortcuts" 92 | msgstr "Keyboard shortcuts" 93 | 94 | #: ui/main.ui:33 ui/main.ui:39 95 | msgid "Open the options menu" 96 | msgstr "Open the options menu" 97 | 98 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 99 | msgid "Save resources" 100 | msgstr "Save resources" 101 | 102 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 103 | msgid "Deselect all" 104 | msgstr "Deselect all" 105 | 106 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 107 | msgid "Select only PNGs" 108 | msgstr "Select only PNGs" 109 | 110 | #: ui/main.ui:135 ui/main.ui:225 111 | msgid "Select resources" 112 | msgstr "Select resources" 113 | 114 | #: ui/main.ui:397 115 | msgid "File to open:" 116 | msgstr "File to open:" 117 | 118 | #: ui/main.ui:421 119 | msgid "Destination folder:" 120 | msgstr "Destination folder:" 121 | 122 | #: ui/main.ui:435 123 | msgid "Select path for saving" 124 | msgstr "Select path for saving" 125 | 126 | #: ui/main.ui:446 127 | msgid "Available resources:" 128 | msgstr "Available resources:" 129 | 130 | #: ui/main.ui:474 131 | msgid "Preview" 132 | msgstr "Preview" 133 | 134 | #: ui/main.ui:523 135 | msgid "Height" 136 | msgstr "Height" 137 | 138 | #: ui/main.ui:535 139 | msgid "Bits" 140 | msgstr "Bits" 141 | 142 | #: ui/main.ui:562 143 | msgid "Extract" 144 | msgstr "Extract" 145 | 146 | #: ui/main.ui:586 147 | msgid "Please select a file to list the available resources" 148 | msgstr "Please select a file to list the available resources" 149 | 150 | #: ui/shortcuts.ui:21 151 | msgid "Show the about dialog" 152 | msgstr "Show the about dialog" 153 | 154 | #: ui/shortcuts.ui:45 155 | msgid "Resources" 156 | msgstr "Resources" 157 | -------------------------------------------------------------------------------- /po/es.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Spanish translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # pepeleproso 10 | # Federico Caiazza 11 | # Adolfo Jayme Barrientos , 2011 12 | msgid "" 13 | msgstr "" 14 | "Project-Id-Version: gExtractWinIcons\n" 15 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 16 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 17 | "PO-Revision-Date: 2022-04-18 01:45+0200\n" 18 | "Last-Translator: Adolfo Jayme-Barrientos \n" 19 | "Language-Team: Spanish\n" 20 | "Language: es\n" 21 | "MIME-Version: 1.0\n" 22 | "Content-Type: text/plain; charset=UTF-8\n" 23 | "Content-Transfer-Encoding: 8bit\n" 24 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 25 | 26 | #: gextractwinicons/ui/about.py:65 27 | #, python-brace-format 28 | msgid "Version {VERSION}" 29 | msgstr "Versión {VERSION}" 30 | 31 | #: gextractwinicons/ui/about.py:68 32 | msgid "Extract cursors and icons from MS Windows resource files" 33 | msgstr "Extraer cursores, iconos de archivos de recursos de Windows" 34 | 35 | #: gextractwinicons/ui/about.py:77 36 | msgid "Contributors:" 37 | msgstr "Contribuidores:" 38 | 39 | #: gextractwinicons/ui/about.py:84 40 | msgid "Project home page" 41 | msgstr "" 42 | 43 | #: gextractwinicons/ui/about.py:85 44 | msgid "Source code" 45 | msgstr "" 46 | 47 | #: gextractwinicons/ui/about.py:86 48 | msgid "Author information" 49 | msgstr "" 50 | 51 | #: gextractwinicons/ui/about.py:87 52 | msgid "Issues and bugs tracking" 53 | msgstr "" 54 | 55 | #: gextractwinicons/ui/about.py:88 56 | msgid "Translations" 57 | msgstr "" 58 | 59 | #: gextractwinicons/ui/main.py:96 60 | msgid "MS Windows compatible files" 61 | msgstr "Archivos compatibles con MS Windows" 62 | 63 | #: gextractwinicons/ui/main.py:98 64 | msgid "All files" 65 | msgstr "Todos los archivos" 66 | 67 | #: gextractwinicons/ui/main.py:133 68 | #, python-brace-format 69 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 70 | msgstr "{TOTAL} recursos encontrados ({SELECTED} recursos seleccionados)" 71 | 72 | #: gextractwinicons/ui/main.py:212 73 | msgid "cursors" 74 | msgstr "cursores" 75 | 76 | #: gextractwinicons/ui/main.py:214 77 | msgid "icons" 78 | msgstr "iconos" 79 | 80 | #: gextractwinicons/ui/main.py:231 81 | msgid "icon" 82 | msgstr "icono" 83 | 84 | #: gextractwinicons/ui/main.py:233 85 | msgid "cursor" 86 | msgstr "cursor" 87 | 88 | #: gextractwinicons/ui/main.py:307 89 | msgid "Extraction completed." 90 | msgstr "Extracción terminada." 91 | 92 | #: ui/main.ui:25 ui/shortcuts.ui:28 93 | msgid "Keyboard shortcuts" 94 | msgstr "Atajos del teclado" 95 | 96 | #: ui/main.ui:33 ui/main.ui:39 97 | msgid "Open the options menu" 98 | msgstr "" 99 | 100 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 101 | msgid "Save resources" 102 | msgstr "Guardar recursos" 103 | 104 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 105 | msgid "Deselect all" 106 | msgstr "Deseleccionar todos" 107 | 108 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 109 | msgid "Select only PNGs" 110 | msgstr "Seleccionar solo PNG" 111 | 112 | #: ui/main.ui:135 ui/main.ui:225 113 | msgid "Select resources" 114 | msgstr "Seleccionar recursos" 115 | 116 | #: ui/main.ui:397 117 | msgid "File to open:" 118 | msgstr "Archivo a abrir:" 119 | 120 | #: ui/main.ui:421 121 | msgid "Destination folder:" 122 | msgstr "Carpeta de destino:" 123 | 124 | #: ui/main.ui:435 125 | msgid "Select path for saving" 126 | msgstr "Seleccione una ruta donde guardar" 127 | 128 | #: ui/main.ui:446 129 | msgid "Available resources:" 130 | msgstr "Recursos disponibles:" 131 | 132 | #: ui/main.ui:474 133 | msgid "Preview" 134 | msgstr "Previsualización" 135 | 136 | #: ui/main.ui:523 137 | msgid "Height" 138 | msgstr "Altura" 139 | 140 | #: ui/main.ui:535 141 | msgid "Bits" 142 | msgstr "Bits" 143 | 144 | #: ui/main.ui:562 145 | msgid "Extract" 146 | msgstr "Extraer" 147 | 148 | #: ui/main.ui:586 149 | msgid "Please select a file to list the available resources" 150 | msgstr "Seleccione un archivo para listar los recursos disponibles" 151 | 152 | #: ui/shortcuts.ui:21 153 | msgid "Show the about dialog" 154 | msgstr "Mostrar el diálogo Acerca" 155 | 156 | #: ui/shortcuts.ui:45 157 | msgid "Resources" 158 | msgstr "Recursos" 159 | -------------------------------------------------------------------------------- /po/fr.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # French translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Emmanuel , 2010 10 | # Albano Battistella , 2022 11 | msgid "" 12 | msgstr "" 13 | "Project-Id-Version: gExtractWinIcons\n" 14 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 15 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 16 | "PO-Revision-Date: 2010-11-30 07:51+0000\n" 17 | "Last-Translator: Albano Battistella \n" 18 | "Language-Team: French\n" 19 | "Language: fr\n" 20 | "MIME-Version: 1.0\n" 21 | "Content-Type: text/plain; charset=UTF-8\n" 22 | "Content-Transfer-Encoding: 8bit\n" 23 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 24 | 25 | #: gextractwinicons/ui/about.py:65 26 | #, python-brace-format 27 | msgid "Version {VERSION}" 28 | msgstr "Version {VERSION}" 29 | 30 | #: gextractwinicons/ui/about.py:68 31 | msgid "Extract cursors and icons from MS Windows resource files" 32 | msgstr "Extraire pointeurs, icônes des fichiers de ressources pour MS Windows" 33 | 34 | #: gextractwinicons/ui/about.py:77 35 | msgid "Contributors:" 36 | msgstr "Contributeurs:" 37 | 38 | #: gextractwinicons/ui/about.py:84 39 | msgid "Project home page" 40 | msgstr "Page d'accueil du projet" 41 | 42 | #: gextractwinicons/ui/about.py:85 43 | msgid "Source code" 44 | msgstr "Code source" 45 | 46 | #: gextractwinicons/ui/about.py:86 47 | msgid "Author information" 48 | msgstr "Informations sur l'auteur" 49 | 50 | #: gextractwinicons/ui/about.py:87 51 | msgid "Issues and bugs tracking" 52 | msgstr "Suivi des problèmes et des bugs" 53 | 54 | #: gextractwinicons/ui/about.py:88 55 | msgid "Translations" 56 | msgstr "Traductions" 57 | 58 | #: gextractwinicons/ui/main.py:96 59 | msgid "MS Windows compatible files" 60 | msgstr "Fichiers compatibles avec MS Windows" 61 | 62 | #: gextractwinicons/ui/main.py:98 63 | msgid "All files" 64 | msgstr "Tous les fichiers" 65 | 66 | #: gextractwinicons/ui/main.py:133 67 | #, python-brace-format 68 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 69 | msgstr "{TOTAL} ressources trouvées ({SELECTED} ressources sélectionnées)" 70 | 71 | #: gextractwinicons/ui/main.py:212 72 | msgid "cursors" 73 | msgstr "pointeurs" 74 | 75 | #: gextractwinicons/ui/main.py:214 76 | msgid "icons" 77 | msgstr "icônes" 78 | 79 | #: gextractwinicons/ui/main.py:231 80 | msgid "icon" 81 | msgstr "icône" 82 | 83 | #: gextractwinicons/ui/main.py:233 84 | msgid "cursor" 85 | msgstr "pointeur" 86 | 87 | #: gextractwinicons/ui/main.py:307 88 | msgid "Extraction completed." 89 | msgstr "Extraction terminée." 90 | 91 | #: ui/main.ui:25 ui/shortcuts.ui:28 92 | msgid "Keyboard shortcuts" 93 | msgstr "Raccourcis clavier" 94 | 95 | #: ui/main.ui:33 ui/main.ui:39 96 | msgid "Open the options menu" 97 | msgstr "Ouvrir le menu options" 98 | 99 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 100 | msgid "Save resources" 101 | msgstr "Enregistrer ressources" 102 | 103 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 104 | msgid "Deselect all" 105 | msgstr "Tous désélectionner" 106 | 107 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 108 | msgid "Select only PNGs" 109 | msgstr "Sélectionner que PNG" 110 | 111 | #: ui/main.ui:135 ui/main.ui:225 112 | msgid "Select resources" 113 | msgstr "Sélectionner ressources" 114 | 115 | #: ui/main.ui:397 116 | msgid "File to open:" 117 | msgstr "Fichier à ouvrir :" 118 | 119 | #: ui/main.ui:421 120 | msgid "Destination folder:" 121 | msgstr "Dossier de destination:" 122 | 123 | #: ui/main.ui:435 124 | msgid "Select path for saving" 125 | msgstr "Sélectionner le parcours pour l'enregistrement" 126 | 127 | #: ui/main.ui:446 128 | msgid "Available resources:" 129 | msgstr "Ressources disponibles : " 130 | 131 | #: ui/main.ui:474 132 | msgid "Preview" 133 | msgstr "Aperçu" 134 | 135 | #: ui/main.ui:523 136 | msgid "Height" 137 | msgstr "Hauteur" 138 | 139 | #: ui/main.ui:535 140 | msgid "Bits" 141 | msgstr "Bits" 142 | 143 | #: ui/main.ui:562 144 | msgid "Extract" 145 | msgstr "Extraire" 146 | 147 | #: ui/main.ui:586 148 | msgid "Please select a file to list the available resources" 149 | msgstr "Sélectionner un fichier pour lister les ressources disponibles" 150 | 151 | #: ui/shortcuts.ui:21 152 | msgid "Show the about dialog" 153 | msgstr "Afficher la boîte de dialogue à propos" 154 | 155 | #: ui/shortcuts.ui:45 156 | msgid "Resources" 157 | msgstr "Ressources" 158 | -------------------------------------------------------------------------------- /po/gextractwinicons.pot: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # X translation for gExtractWinIcons 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: gExtractWinIcons\n" 10 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 11 | "POT-Creation-Date: 2022-08-20 17:09+0200\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=CHARSET\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: gextractwinicons/ui/about.py:65 21 | #, python-brace-format 22 | msgid "Version {VERSION}" 23 | msgstr "" 24 | 25 | #: gextractwinicons/ui/about.py:68 26 | msgid "Extract cursors and icons from MS Windows resource files" 27 | msgstr "" 28 | 29 | #: gextractwinicons/ui/about.py:77 30 | msgid "Contributors:" 31 | msgstr "" 32 | 33 | #: gextractwinicons/ui/about.py:84 34 | msgid "Project home page" 35 | msgstr "" 36 | 37 | #: gextractwinicons/ui/about.py:85 38 | msgid "Source code" 39 | msgstr "" 40 | 41 | #: gextractwinicons/ui/about.py:86 42 | msgid "Author information" 43 | msgstr "" 44 | 45 | #: gextractwinicons/ui/about.py:87 46 | msgid "Issues and bugs tracking" 47 | msgstr "" 48 | 49 | #: gextractwinicons/ui/about.py:88 50 | msgid "Translations" 51 | msgstr "" 52 | 53 | #: gextractwinicons/ui/main.py:96 54 | msgid "MS Windows compatible files" 55 | msgstr "" 56 | 57 | #: gextractwinicons/ui/main.py:98 58 | msgid "All files" 59 | msgstr "" 60 | 61 | #: gextractwinicons/ui/main.py:133 62 | #, python-brace-format 63 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 64 | msgstr "" 65 | 66 | #: gextractwinicons/ui/main.py:212 67 | msgid "cursors" 68 | msgstr "" 69 | 70 | #: gextractwinicons/ui/main.py:214 71 | msgid "icons" 72 | msgstr "" 73 | 74 | #: gextractwinicons/ui/main.py:231 75 | msgid "icon" 76 | msgstr "" 77 | 78 | #: gextractwinicons/ui/main.py:233 79 | msgid "cursor" 80 | msgstr "" 81 | 82 | #: gextractwinicons/ui/main.py:307 83 | msgid "Extraction completed." 84 | msgstr "" 85 | 86 | #: ui/main.ui:25 ui/shortcuts.ui:28 87 | msgid "Keyboard shortcuts" 88 | msgstr "" 89 | 90 | #: ui/main.ui:33 ui/main.ui:39 91 | msgid "Open the options menu" 92 | msgstr "" 93 | 94 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 95 | msgid "Save resources" 96 | msgstr "" 97 | 98 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 99 | msgid "Deselect all" 100 | msgstr "" 101 | 102 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 103 | msgid "Select only PNGs" 104 | msgstr "" 105 | 106 | #: ui/main.ui:135 ui/main.ui:225 107 | msgid "Select resources" 108 | msgstr "" 109 | 110 | #: ui/main.ui:397 111 | msgid "File to open:" 112 | msgstr "" 113 | 114 | #: ui/main.ui:421 115 | msgid "Destination folder:" 116 | msgstr "" 117 | 118 | #: ui/main.ui:435 119 | msgid "Select path for saving" 120 | msgstr "" 121 | 122 | #: ui/main.ui:446 123 | msgid "Available resources:" 124 | msgstr "" 125 | 126 | #: ui/main.ui:474 127 | msgid "Preview" 128 | msgstr "" 129 | 130 | #: ui/main.ui:523 131 | msgid "Height" 132 | msgstr "" 133 | 134 | #: ui/main.ui:535 135 | msgid "Bits" 136 | msgstr "" 137 | 138 | #: ui/main.ui:562 139 | msgid "Extract" 140 | msgstr "" 141 | 142 | #: ui/main.ui:586 143 | msgid "Please select a file to list the available resources" 144 | msgstr "" 145 | 146 | #: ui/shortcuts.ui:21 147 | msgid "Show the about dialog" 148 | msgstr "" 149 | 150 | #: ui/shortcuts.ui:45 151 | msgid "Resources" 152 | msgstr "" 153 | -------------------------------------------------------------------------------- /po/he.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Hebrew translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # GenghisKhan , 2013 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2022-04-18 02:00+0200\n" 16 | "Last-Translator: GenghisKhan \n" 17 | "Language-Team: Hebrew\n" 18 | "Language: he\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: gextractwinicons/ui/about.py:65 25 | #, python-brace-format 26 | msgid "Version {VERSION}" 27 | msgstr "{VERSION} גרסת" 28 | 29 | #: gextractwinicons/ui/about.py:68 30 | msgid "Extract cursors and icons from MS Windows resource files" 31 | msgstr "" 32 | 33 | #: gextractwinicons/ui/about.py:77 34 | msgid "Contributors:" 35 | msgstr "" 36 | 37 | #: gextractwinicons/ui/about.py:84 38 | msgid "Project home page" 39 | msgstr "" 40 | 41 | #: gextractwinicons/ui/about.py:85 42 | msgid "Source code" 43 | msgstr "" 44 | 45 | #: gextractwinicons/ui/about.py:86 46 | msgid "Author information" 47 | msgstr "" 48 | 49 | #: gextractwinicons/ui/about.py:87 50 | msgid "Issues and bugs tracking" 51 | msgstr "" 52 | 53 | #: gextractwinicons/ui/about.py:88 54 | msgid "Translations" 55 | msgstr "" 56 | 57 | #: gextractwinicons/ui/main.py:96 58 | msgid "MS Windows compatible files" 59 | msgstr "קבצים תואמים את MS Windows" 60 | 61 | #: gextractwinicons/ui/main.py:98 62 | msgid "All files" 63 | msgstr "כל הקבצים" 64 | 65 | #: gextractwinicons/ui/main.py:133 66 | #, python-brace-format 67 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 68 | msgstr "{TOTAL} מקורות נמצאו ({SELECTED} מקורות נבחרו)" 69 | 70 | #: gextractwinicons/ui/main.py:212 71 | msgid "cursors" 72 | msgstr "סמנים" 73 | 74 | #: gextractwinicons/ui/main.py:214 75 | msgid "icons" 76 | msgstr "צלמיות" 77 | 78 | #: gextractwinicons/ui/main.py:231 79 | msgid "icon" 80 | msgstr "צלמית" 81 | 82 | #: gextractwinicons/ui/main.py:233 83 | msgid "cursor" 84 | msgstr "סמן" 85 | 86 | #: gextractwinicons/ui/main.py:307 87 | msgid "Extraction completed." 88 | msgstr "חילוץ הושלם." 89 | 90 | #: ui/main.ui:25 ui/shortcuts.ui:28 91 | msgid "Keyboard shortcuts" 92 | msgstr "צירופי מקשים" 93 | 94 | #: ui/main.ui:33 ui/main.ui:39 95 | msgid "Open the options menu" 96 | msgstr "" 97 | 98 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 99 | msgid "Save resources" 100 | msgstr "" 101 | 102 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 103 | msgid "Deselect all" 104 | msgstr "אפס בחירות" 105 | 106 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 107 | msgid "Select only PNGs" 108 | msgstr "בחר PNG בלבד" 109 | 110 | #: ui/main.ui:135 ui/main.ui:225 111 | msgid "Select resources" 112 | msgstr "" 113 | 114 | #: ui/main.ui:397 115 | msgid "File to open:" 116 | msgstr "קובץ לפתיחה:" 117 | 118 | #: ui/main.ui:421 119 | msgid "Destination folder:" 120 | msgstr "תיקיית יעד:" 121 | 122 | #: ui/main.ui:435 123 | msgid "Select path for saving" 124 | msgstr "בחירת נתיב לשמירה" 125 | 126 | #: ui/main.ui:446 127 | msgid "Available resources:" 128 | msgstr "מקורות זמינים:" 129 | 130 | #: ui/main.ui:474 131 | msgid "Preview" 132 | msgstr "תצוגה מוקדמת" 133 | 134 | #: ui/main.ui:523 135 | msgid "Height" 136 | msgstr "גובה" 137 | 138 | #: ui/main.ui:535 139 | msgid "Bits" 140 | msgstr "ביטים" 141 | 142 | #: ui/main.ui:562 143 | msgid "Extract" 144 | msgstr "חלץ" 145 | 146 | #: ui/main.ui:586 147 | msgid "Please select a file to list the available resources" 148 | msgstr "אנא בחר קובץ כדי למנות את המקורות הזמינים" 149 | 150 | #: ui/shortcuts.ui:21 151 | msgid "Show the about dialog" 152 | msgstr "" 153 | 154 | #: ui/shortcuts.ui:45 155 | msgid "Resources" 156 | msgstr "מאשבים" 157 | -------------------------------------------------------------------------------- /po/it.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Italian translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Fabio Castelli (Muflone) , 2010-2022 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2022-04-18 02:06+0200\n" 16 | "Last-Translator: Fabio Castelli (Muflone) \n" 17 | "Language-Team: Italian\n" 18 | "Language: it\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: gextractwinicons/ui/about.py:65 25 | #, python-brace-format 26 | msgid "Version {VERSION}" 27 | msgstr "Versione {VERSION}" 28 | 29 | #: gextractwinicons/ui/about.py:68 30 | msgid "Extract cursors and icons from MS Windows resource files" 31 | msgstr "Estrae cursori e icone da file di risorse per MS Windows" 32 | 33 | #: gextractwinicons/ui/about.py:77 34 | msgid "Contributors:" 35 | msgstr "Contributori:" 36 | 37 | #: gextractwinicons/ui/about.py:84 38 | msgid "Project home page" 39 | msgstr "Home page del progetto" 40 | 41 | #: gextractwinicons/ui/about.py:85 42 | msgid "Source code" 43 | msgstr "Codice sorgente" 44 | 45 | #: gextractwinicons/ui/about.py:86 46 | msgid "Author information" 47 | msgstr "Informazioni sull'autore" 48 | 49 | #: gextractwinicons/ui/about.py:87 50 | msgid "Issues and bugs tracking" 51 | msgstr "Tracciamento di problemi e bug" 52 | 53 | #: gextractwinicons/ui/about.py:88 54 | msgid "Translations" 55 | msgstr "Traduzioni" 56 | 57 | #: gextractwinicons/ui/main.py:96 58 | msgid "MS Windows compatible files" 59 | msgstr "Files compatibili MS Windows" 60 | 61 | #: gextractwinicons/ui/main.py:98 62 | msgid "All files" 63 | msgstr "Tutti i files" 64 | 65 | #: gextractwinicons/ui/main.py:133 66 | #, python-brace-format 67 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 68 | msgstr "{TOTAL} risorse trovate ({SELECTED} risorse selezionate)" 69 | 70 | #: gextractwinicons/ui/main.py:212 71 | msgid "cursors" 72 | msgstr "cursori" 73 | 74 | #: gextractwinicons/ui/main.py:214 75 | msgid "icons" 76 | msgstr "icone" 77 | 78 | #: gextractwinicons/ui/main.py:231 79 | msgid "icon" 80 | msgstr "icona" 81 | 82 | #: gextractwinicons/ui/main.py:233 83 | msgid "cursor" 84 | msgstr "cursore" 85 | 86 | #: gextractwinicons/ui/main.py:307 87 | msgid "Extraction completed." 88 | msgstr "Estrazione completata." 89 | 90 | #: ui/main.ui:25 ui/shortcuts.ui:28 91 | msgid "Keyboard shortcuts" 92 | msgstr "Scorciatoie da tastiera" 93 | 94 | #: ui/main.ui:33 ui/main.ui:39 95 | msgid "Open the options menu" 96 | msgstr "Apri il menu opzioni" 97 | 98 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 99 | msgid "Save resources" 100 | msgstr "Salva risorse" 101 | 102 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 103 | msgid "Deselect all" 104 | msgstr "Deseleziona tutto" 105 | 106 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 107 | msgid "Select only PNGs" 108 | msgstr "Seleziona solo PNG" 109 | 110 | #: ui/main.ui:135 ui/main.ui:225 111 | msgid "Select resources" 112 | msgstr "Seleziona risorse" 113 | 114 | #: ui/main.ui:397 115 | msgid "File to open:" 116 | msgstr "File da aprire:" 117 | 118 | #: ui/main.ui:421 119 | msgid "Destination folder:" 120 | msgstr "Cartella di destinazione:" 121 | 122 | #: ui/main.ui:435 123 | msgid "Select path for saving" 124 | msgstr "Seleziona il percorso per il salvataggio" 125 | 126 | #: ui/main.ui:446 127 | msgid "Available resources:" 128 | msgstr "Risorse disponibili:" 129 | 130 | #: ui/main.ui:474 131 | msgid "Preview" 132 | msgstr "Anteprima" 133 | 134 | #: ui/main.ui:523 135 | msgid "Height" 136 | msgstr "Altezza" 137 | 138 | #: ui/main.ui:535 139 | msgid "Bits" 140 | msgstr "Bit" 141 | 142 | #: ui/main.ui:562 143 | msgid "Extract" 144 | msgstr "Estrarre" 145 | 146 | #: ui/main.ui:586 147 | msgid "Please select a file to list the available resources" 148 | msgstr "Scegliere un file per elencare le risorse disponibili" 149 | 150 | #: ui/shortcuts.ui:21 151 | msgid "Show the about dialog" 152 | msgstr "Mostra la finestra delle informazioni" 153 | 154 | #: ui/shortcuts.ui:45 155 | msgid "Resources" 156 | msgstr "Risorse" 157 | -------------------------------------------------------------------------------- /po/lt.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Lithuanian translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Moo, 2016-2022 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2022-04-18 02:14+0200\n" 16 | "Last-Translator: Moo\n" 17 | "Language-Team: Lithuanian\n" 18 | "Language: lt\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < " 23 | "11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? " 24 | "1 : n % 1 != 0 ? 2: 3);\n" 25 | 26 | #: gextractwinicons/ui/about.py:65 27 | #, python-brace-format 28 | msgid "Version {VERSION}" 29 | msgstr "Versija {VERSION}" 30 | 31 | #: gextractwinicons/ui/about.py:68 32 | msgid "Extract cursors and icons from MS Windows resource files" 33 | msgstr "Išskleisti žymeklius ir piktogramas iš MS Windows išteklių failų" 34 | 35 | #: gextractwinicons/ui/about.py:77 36 | msgid "Contributors:" 37 | msgstr "Talkininkai:" 38 | 39 | #: gextractwinicons/ui/about.py:84 40 | msgid "Project home page" 41 | msgstr "Projekto internetinė svetainė" 42 | 43 | #: gextractwinicons/ui/about.py:85 44 | msgid "Source code" 45 | msgstr "Pirminis kodas" 46 | 47 | #: gextractwinicons/ui/about.py:86 48 | msgid "Author information" 49 | msgstr "Informacija apie autorių" 50 | 51 | #: gextractwinicons/ui/about.py:87 52 | msgid "Issues and bugs tracking" 53 | msgstr "Klaidos ir klaidų sekiklis" 54 | 55 | #: gextractwinicons/ui/about.py:88 56 | msgid "Translations" 57 | msgstr "Vertimai" 58 | 59 | #: gextractwinicons/ui/main.py:96 60 | msgid "MS Windows compatible files" 61 | msgstr "MS Windows suderinami failai" 62 | 63 | #: gextractwinicons/ui/main.py:98 64 | msgid "All files" 65 | msgstr "Visi failai" 66 | 67 | #: gextractwinicons/ui/main.py:133 68 | #, python-brace-format 69 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 70 | msgstr "{TOTAL} išteklių rasta ({SELECTED} išteklių pažymėta)" 71 | 72 | #: gextractwinicons/ui/main.py:212 73 | msgid "cursors" 74 | msgstr "žymekliai" 75 | 76 | #: gextractwinicons/ui/main.py:214 77 | msgid "icons" 78 | msgstr "piktogramos" 79 | 80 | #: gextractwinicons/ui/main.py:231 81 | msgid "icon" 82 | msgstr "piktograma" 83 | 84 | #: gextractwinicons/ui/main.py:233 85 | msgid "cursor" 86 | msgstr "žymeklis" 87 | 88 | #: gextractwinicons/ui/main.py:307 89 | msgid "Extraction completed." 90 | msgstr "Išskleidimas užbaigtas." 91 | 92 | #: ui/main.ui:25 ui/shortcuts.ui:28 93 | msgid "Keyboard shortcuts" 94 | msgstr "Klaviatūros trumpiniai" 95 | 96 | #: ui/main.ui:33 ui/main.ui:39 97 | msgid "Open the options menu" 98 | msgstr "Atverti parinkčių meniu" 99 | 100 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 101 | msgid "Save resources" 102 | msgstr "Įrašyti ištekliai" 103 | 104 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 105 | msgid "Deselect all" 106 | msgstr "Nuimti žymėjimą nuo visų" 107 | 108 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 109 | msgid "Select only PNGs" 110 | msgstr "Pažymėti tik PNG failus" 111 | 112 | #: ui/main.ui:135 ui/main.ui:225 113 | msgid "Select resources" 114 | msgstr "Pažymėti ištekliai" 115 | 116 | #: ui/main.ui:397 117 | msgid "File to open:" 118 | msgstr "Failas, kurį atverti:" 119 | 120 | #: ui/main.ui:421 121 | msgid "Destination folder:" 122 | msgstr "Paskirties aplankas:" 123 | 124 | #: ui/main.ui:435 125 | msgid "Select path for saving" 126 | msgstr "Pasirinkti įrašymo kelią" 127 | 128 | #: ui/main.ui:446 129 | msgid "Available resources:" 130 | msgstr "Prieinami ištekliai:" 131 | 132 | #: ui/main.ui:474 133 | msgid "Preview" 134 | msgstr "Peržiūra" 135 | 136 | #: ui/main.ui:523 137 | msgid "Height" 138 | msgstr "Aukštis" 139 | 140 | #: ui/main.ui:535 141 | msgid "Bits" 142 | msgstr "Bitų" 143 | 144 | #: ui/main.ui:562 145 | msgid "Extract" 146 | msgstr "Išskleisti" 147 | 148 | #: ui/main.ui:586 149 | msgid "Please select a file to list the available resources" 150 | msgstr "Pasirinkite failą, kad būtų išvardyti visi prieinami ištekliai" 151 | 152 | #: ui/shortcuts.ui:21 153 | msgid "Show the about dialog" 154 | msgstr "Rodyti dialogą su informacija apie programą" 155 | 156 | #: ui/shortcuts.ui:45 157 | msgid "Resources" 158 | msgstr "Ištekliai" 159 | -------------------------------------------------------------------------------- /po/nl_NL.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Dutch translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Heimen Stoffels , 2015,2018 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2010-11-30 07:51+0000\n" 16 | "Last-Translator: Heimen Stoffels \n" 17 | "Language-Team: Dutch (Netherlands)\n" 18 | "Language: nl_NL\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: gextractwinicons/ui/about.py:65 25 | #, python-brace-format 26 | msgid "Version {VERSION}" 27 | msgstr "Versie {VERSION}" 28 | 29 | #: gextractwinicons/ui/about.py:68 30 | msgid "Extract cursors and icons from MS Windows resource files" 31 | msgstr "Extraheer cursors en pictogrammen uit MS Windows-resourcebestanden" 32 | 33 | #: gextractwinicons/ui/about.py:77 34 | msgid "Contributors:" 35 | msgstr "Bijdragers:" 36 | 37 | #: gextractwinicons/ui/about.py:84 38 | msgid "Project home page" 39 | msgstr "Website" 40 | 41 | #: gextractwinicons/ui/about.py:85 42 | msgid "Source code" 43 | msgstr "Broncode" 44 | 45 | #: gextractwinicons/ui/about.py:86 46 | msgid "Author information" 47 | msgstr "Informatie over de maker" 48 | 49 | #: gextractwinicons/ui/about.py:87 50 | msgid "Issues and bugs tracking" 51 | msgstr "Problemen en bugs" 52 | 53 | #: gextractwinicons/ui/about.py:88 54 | msgid "Translations" 55 | msgstr "Vertalingen" 56 | 57 | #: gextractwinicons/ui/main.py:96 58 | msgid "MS Windows compatible files" 59 | msgstr "MS Windows-compatibele bestanden" 60 | 61 | #: gextractwinicons/ui/main.py:98 62 | msgid "All files" 63 | msgstr "Alle bestanden" 64 | 65 | #: gextractwinicons/ui/main.py:133 66 | #, python-brace-format 67 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 68 | msgstr "{TOTAL} bronnen gevonden - ({SELECTED} bronnen geselecteerd)" 69 | 70 | #: gextractwinicons/ui/main.py:212 71 | msgid "cursors" 72 | msgstr "cursors" 73 | 74 | #: gextractwinicons/ui/main.py:214 75 | msgid "icons" 76 | msgstr "pictogrammen" 77 | 78 | #: gextractwinicons/ui/main.py:231 79 | msgid "icon" 80 | msgstr "pictogram" 81 | 82 | #: gextractwinicons/ui/main.py:233 83 | msgid "cursor" 84 | msgstr "cursor" 85 | 86 | #: gextractwinicons/ui/main.py:307 87 | msgid "Extraction completed." 88 | msgstr "Het extraheren is voltooid." 89 | 90 | #: ui/main.ui:25 ui/shortcuts.ui:28 91 | msgid "Keyboard shortcuts" 92 | msgstr "Sneltoetsen" 93 | 94 | #: ui/main.ui:33 ui/main.ui:39 95 | msgid "Open the options menu" 96 | msgstr "Open het optiesmenu" 97 | 98 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 99 | msgid "Save resources" 100 | msgstr "Bronnen opslaan" 101 | 102 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 103 | msgid "Deselect all" 104 | msgstr "Niets selecteren" 105 | 106 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 107 | msgid "Select only PNGs" 108 | msgstr "Alleen png-bestanden selecteren" 109 | 110 | #: ui/main.ui:135 ui/main.ui:225 111 | msgid "Select resources" 112 | msgstr "Bronnen selecteren" 113 | 114 | #: ui/main.ui:397 115 | msgid "File to open:" 116 | msgstr "Het te openen bestand:" 117 | 118 | #: ui/main.ui:421 119 | msgid "Destination folder:" 120 | msgstr "Doelmap:" 121 | 122 | #: ui/main.ui:435 123 | msgid "Select path for saving" 124 | msgstr "Kies een opslaglocatie" 125 | 126 | #: ui/main.ui:446 127 | msgid "Available resources:" 128 | msgstr "Beschikbare bronnen:" 129 | 130 | #: ui/main.ui:474 131 | msgid "Preview" 132 | msgstr "Voorvertoning" 133 | 134 | #: ui/main.ui:523 135 | msgid "Height" 136 | msgstr "Hoogte" 137 | 138 | #: ui/main.ui:535 139 | msgid "Bits" 140 | msgstr "Bits" 141 | 142 | #: ui/main.ui:562 143 | msgid "Extract" 144 | msgstr "Extraheren" 145 | 146 | #: ui/main.ui:586 147 | msgid "Please select a file to list the available resources" 148 | msgstr "" 149 | "Selecteer een bestand om een lijst op te maken met de beschikbare bronnen" 150 | 151 | #: ui/shortcuts.ui:21 152 | msgid "Show the about dialog" 153 | msgstr "Toon het venster ‘Over’" 154 | 155 | #: ui/shortcuts.ui:45 156 | msgid "Resources" 157 | msgstr "Bronnen" 158 | -------------------------------------------------------------------------------- /po/pt.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Portuguese translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Danielson Tavares , 2017-2022 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2022-04-18 02:36+0200\n" 16 | "Last-Translator: Danielson Tavares \n" 17 | "Language-Team: Portuguese\n" 18 | "Language: pt\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 23 | 24 | #: gextractwinicons/ui/about.py:65 25 | #, python-brace-format 26 | msgid "Version {VERSION}" 27 | msgstr "Versão {VERSION}" 28 | 29 | #: gextractwinicons/ui/about.py:68 30 | msgid "Extract cursors and icons from MS Windows resource files" 31 | msgstr "Extrair cursores, ícones dos arquivos de recursos do MS Windows" 32 | 33 | #: gextractwinicons/ui/about.py:77 34 | msgid "Contributors:" 35 | msgstr "Contribuidores:" 36 | 37 | #: gextractwinicons/ui/about.py:84 38 | msgid "Project home page" 39 | msgstr "" 40 | 41 | #: gextractwinicons/ui/about.py:85 42 | msgid "Source code" 43 | msgstr "" 44 | 45 | #: gextractwinicons/ui/about.py:86 46 | msgid "Author information" 47 | msgstr "" 48 | 49 | #: gextractwinicons/ui/about.py:87 50 | msgid "Issues and bugs tracking" 51 | msgstr "" 52 | 53 | #: gextractwinicons/ui/about.py:88 54 | msgid "Translations" 55 | msgstr "" 56 | 57 | #: gextractwinicons/ui/main.py:96 58 | msgid "MS Windows compatible files" 59 | msgstr "Arquivos compatíveis com MS Windows" 60 | 61 | #: gextractwinicons/ui/main.py:98 62 | msgid "All files" 63 | msgstr "Todos os arquivos" 64 | 65 | #: gextractwinicons/ui/main.py:133 66 | #, python-brace-format 67 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 68 | msgstr "{TOTAL} recursos encontrados ({SELECTED} recursos selecionados)" 69 | 70 | #: gextractwinicons/ui/main.py:212 71 | msgid "cursors" 72 | msgstr "Cursores" 73 | 74 | #: gextractwinicons/ui/main.py:214 75 | msgid "icons" 76 | msgstr "Ícones" 77 | 78 | #: gextractwinicons/ui/main.py:231 79 | msgid "icon" 80 | msgstr "Ícone" 81 | 82 | #: gextractwinicons/ui/main.py:233 83 | msgid "cursor" 84 | msgstr "Cursor" 85 | 86 | #: gextractwinicons/ui/main.py:307 87 | msgid "Extraction completed." 88 | msgstr "Extração Completada." 89 | 90 | #: ui/main.ui:25 ui/shortcuts.ui:28 91 | msgid "Keyboard shortcuts" 92 | msgstr "Atalhos de teclado" 93 | 94 | #: ui/main.ui:33 ui/main.ui:39 95 | msgid "Open the options menu" 96 | msgstr "Abrir o menu de opções" 97 | 98 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 99 | msgid "Save resources" 100 | msgstr "Gravar recursos" 101 | 102 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 103 | msgid "Deselect all" 104 | msgstr "Deselecionar todos" 105 | 106 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 107 | msgid "Select only PNGs" 108 | msgstr "Selecionar somente PNGs" 109 | 110 | #: ui/main.ui:135 ui/main.ui:225 111 | msgid "Select resources" 112 | msgstr "Selecionar recursos" 113 | 114 | #: ui/main.ui:397 115 | msgid "File to open:" 116 | msgstr "Arquivo para abrir:" 117 | 118 | #: ui/main.ui:421 119 | msgid "Destination folder:" 120 | msgstr "Pasta de destino:" 121 | 122 | #: ui/main.ui:435 123 | msgid "Select path for saving" 124 | msgstr "Selecione um local para salvar" 125 | 126 | #: ui/main.ui:446 127 | msgid "Available resources:" 128 | msgstr "Recursos Disponíveis:" 129 | 130 | #: ui/main.ui:474 131 | msgid "Preview" 132 | msgstr "Pré-Visualização" 133 | 134 | #: ui/main.ui:523 135 | msgid "Height" 136 | msgstr "Altura" 137 | 138 | #: ui/main.ui:535 139 | msgid "Bits" 140 | msgstr "Bits" 141 | 142 | #: ui/main.ui:562 143 | msgid "Extract" 144 | msgstr "Extrair" 145 | 146 | #: ui/main.ui:586 147 | msgid "Please select a file to list the available resources" 148 | msgstr "Por favor, selecione um arquivo para listar os recursos disponíveis" 149 | 150 | #: ui/shortcuts.ui:21 151 | msgid "Show the about dialog" 152 | msgstr "Mostrar diálogo sobre" 153 | 154 | #: ui/shortcuts.ui:45 155 | msgid "Resources" 156 | msgstr "Recursos" 157 | -------------------------------------------------------------------------------- /po/pt_BR.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Portuguese translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Danielson Tavares , 2017 10 | # Paguiar735 , 2022 11 | msgid "" 12 | msgstr "" 13 | "Project-Id-Version: gExtractWinIcons\n" 14 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 15 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 16 | "PO-Revision-Date: 2022-04-18 02:36+0200\n" 17 | "Last-Translator: Paguiar735 \n" 18 | "Language-Team: Portuguese (Brazil)\n" 19 | "Language: pt_BR\n" 20 | "MIME-Version: 1.0\n" 21 | "Content-Type: text/plain; charset=UTF-8\n" 22 | "Content-Transfer-Encoding: 8bit\n" 23 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 24 | 25 | #: gextractwinicons/ui/about.py:65 26 | #, python-brace-format 27 | msgid "Version {VERSION}" 28 | msgstr "Versão {VERSION}" 29 | 30 | #: gextractwinicons/ui/about.py:68 31 | msgid "Extract cursors and icons from MS Windows resource files" 32 | msgstr "Extrair cursores, ícones dos arquivos de recursos do MS Windows" 33 | 34 | #: gextractwinicons/ui/about.py:77 35 | msgid "Contributors:" 36 | msgstr "Contribuidores:" 37 | 38 | #: gextractwinicons/ui/about.py:84 39 | msgid "Project home page" 40 | msgstr "" 41 | 42 | #: gextractwinicons/ui/about.py:85 43 | msgid "Source code" 44 | msgstr "" 45 | 46 | #: gextractwinicons/ui/about.py:86 47 | msgid "Author information" 48 | msgstr "" 49 | 50 | #: gextractwinicons/ui/about.py:87 51 | msgid "Issues and bugs tracking" 52 | msgstr "" 53 | 54 | #: gextractwinicons/ui/about.py:88 55 | msgid "Translations" 56 | msgstr "" 57 | 58 | #: gextractwinicons/ui/main.py:96 59 | msgid "MS Windows compatible files" 60 | msgstr "Arquivos compatíveis com MS Windows" 61 | 62 | #: gextractwinicons/ui/main.py:98 63 | msgid "All files" 64 | msgstr "Todos os arquivos" 65 | 66 | #: gextractwinicons/ui/main.py:133 67 | #, python-brace-format 68 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 69 | msgstr "{TOTAL} recursos encontrados ({SELECTED} recursos selecionados)" 70 | 71 | #: gextractwinicons/ui/main.py:212 72 | msgid "cursors" 73 | msgstr "Cursores" 74 | 75 | #: gextractwinicons/ui/main.py:214 76 | msgid "icons" 77 | msgstr "Ícones" 78 | 79 | #: gextractwinicons/ui/main.py:231 80 | msgid "icon" 81 | msgstr "Ícone" 82 | 83 | #: gextractwinicons/ui/main.py:233 84 | msgid "cursor" 85 | msgstr "Cursor" 86 | 87 | #: gextractwinicons/ui/main.py:307 88 | msgid "Extraction completed." 89 | msgstr "Extração Completada." 90 | 91 | #: ui/main.ui:25 ui/shortcuts.ui:28 92 | msgid "Keyboard shortcuts" 93 | msgstr "Atalhos de teclado" 94 | 95 | #: ui/main.ui:33 ui/main.ui:39 96 | msgid "Open the options menu" 97 | msgstr "Abrir o menu de opções" 98 | 99 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 100 | msgid "Save resources" 101 | msgstr "Gravar recursos" 102 | 103 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 104 | msgid "Deselect all" 105 | msgstr "Deselecionar todos" 106 | 107 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 108 | msgid "Select only PNGs" 109 | msgstr "Selecionar somente PNGs" 110 | 111 | #: ui/main.ui:135 ui/main.ui:225 112 | msgid "Select resources" 113 | msgstr "Selecionar recursos" 114 | 115 | #: ui/main.ui:397 116 | msgid "File to open:" 117 | msgstr "Arquivo para abrir:" 118 | 119 | #: ui/main.ui:421 120 | msgid "Destination folder:" 121 | msgstr "Pasta de destino:" 122 | 123 | #: ui/main.ui:435 124 | msgid "Select path for saving" 125 | msgstr "Selecione um local para salvar" 126 | 127 | #: ui/main.ui:446 128 | msgid "Available resources:" 129 | msgstr "Recursos Disponíveis:" 130 | 131 | #: ui/main.ui:474 132 | msgid "Preview" 133 | msgstr "Pré-Visualização" 134 | 135 | #: ui/main.ui:523 136 | msgid "Height" 137 | msgstr "Altura" 138 | 139 | #: ui/main.ui:535 140 | msgid "Bits" 141 | msgstr "Bits" 142 | 143 | #: ui/main.ui:562 144 | msgid "Extract" 145 | msgstr "Extrair" 146 | 147 | #: ui/main.ui:586 148 | msgid "Please select a file to list the available resources" 149 | msgstr "Por favor, selecione um arquivo para listar os recursos disponíveis" 150 | 151 | #: ui/shortcuts.ui:21 152 | msgid "Show the about dialog" 153 | msgstr "Exibir caixa de diálogo sobre" 154 | 155 | #: ui/shortcuts.ui:45 156 | msgid "Resources" 157 | msgstr "Recursos" 158 | -------------------------------------------------------------------------------- /po/ru.po: -------------------------------------------------------------------------------- 1 | # gExtractWinIcons 2 | # Extract cursors and icons from MS Windows resource files 3 | # Copyright (C) 2009-2022 Fabio Castelli (Muflone) 4 | # Website: http://www.muflone.com/gextractwinicons/ 5 | # This file is distributed under the same license of gExtractWinIcons. 6 | # Russian translation for gExtractWinIcons 7 | # 8 | # Translators: 9 | # Сергей Богатов , 2010 10 | msgid "" 11 | msgstr "" 12 | "Project-Id-Version: gExtractWinIcons\n" 13 | "Report-Msgid-Bugs-To: https://github.com/muflone/gextractwinicons/issues/\n" 14 | "POT-Creation-Date: 2022-08-20 17:08+0200\n" 15 | "PO-Revision-Date: 2022-04-18 02:43+0200\n" 16 | "Last-Translator: Сергей Богатов \n" 17 | "Language-Team: Russian\n" 18 | "Language: ru\n" 19 | "MIME-Version: 1.0\n" 20 | "Content-Type: text/plain; charset=UTF-8\n" 21 | "Content-Transfer-Encoding: 8bit\n" 22 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " 23 | "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 24 | 25 | #: gextractwinicons/ui/about.py:65 26 | #, python-brace-format 27 | msgid "Version {VERSION}" 28 | msgstr "Версия {VERSION}" 29 | 30 | #: gextractwinicons/ui/about.py:68 31 | msgid "Extract cursors and icons from MS Windows resource files" 32 | msgstr "" 33 | 34 | #: gextractwinicons/ui/about.py:77 35 | msgid "Contributors:" 36 | msgstr "Контрибьюторы:" 37 | 38 | #: gextractwinicons/ui/about.py:84 39 | msgid "Project home page" 40 | msgstr "" 41 | 42 | #: gextractwinicons/ui/about.py:85 43 | msgid "Source code" 44 | msgstr "" 45 | 46 | #: gextractwinicons/ui/about.py:86 47 | msgid "Author information" 48 | msgstr "" 49 | 50 | #: gextractwinicons/ui/about.py:87 51 | msgid "Issues and bugs tracking" 52 | msgstr "" 53 | 54 | #: gextractwinicons/ui/about.py:88 55 | msgid "Translations" 56 | msgstr "" 57 | 58 | #: gextractwinicons/ui/main.py:96 59 | msgid "MS Windows compatible files" 60 | msgstr "Файлы ресурсов MS Windows" 61 | 62 | #: gextractwinicons/ui/main.py:98 63 | msgid "All files" 64 | msgstr "Все файлы" 65 | 66 | #: gextractwinicons/ui/main.py:133 67 | #, python-brace-format 68 | msgid "{TOTAL} resources found ({SELECTED} resources selected)" 69 | msgstr "{TOTAL} ресурсов найдено ({SELECTED} ресурсов выбрано)" 70 | 71 | #: gextractwinicons/ui/main.py:212 72 | msgid "cursors" 73 | msgstr "Курсоры" 74 | 75 | #: gextractwinicons/ui/main.py:214 76 | msgid "icons" 77 | msgstr "Значки" 78 | 79 | #: gextractwinicons/ui/main.py:231 80 | msgid "icon" 81 | msgstr "значок" 82 | 83 | #: gextractwinicons/ui/main.py:233 84 | msgid "cursor" 85 | msgstr "курсор" 86 | 87 | #: gextractwinicons/ui/main.py:307 88 | msgid "Extraction completed." 89 | msgstr "Извлечение завершеною" 90 | 91 | #: ui/main.ui:25 ui/shortcuts.ui:28 92 | msgid "Keyboard shortcuts" 93 | msgstr "Комбинации клавиш" 94 | 95 | #: ui/main.ui:33 ui/main.ui:39 96 | msgid "Open the options menu" 97 | msgstr "Открыть настройки" 98 | 99 | #: ui/main.ui:67 ui/main.ui:204 ui/shortcuts.ui:64 100 | msgid "Save resources" 101 | msgstr "Сохранить rесурсы" 102 | 103 | #: ui/main.ui:85 ui/main.ui:263 ui/shortcuts.ui:78 104 | msgid "Deselect all" 105 | msgstr "Отменить выбор" 106 | 107 | #: ui/main.ui:93 ui/main.ui:248 ui/shortcuts.ui:85 108 | msgid "Select only PNGs" 109 | msgstr "Выбрать только PNG" 110 | 111 | #: ui/main.ui:135 ui/main.ui:225 112 | msgid "Select resources" 113 | msgstr "Выбрать rесурсы" 114 | 115 | #: ui/main.ui:397 116 | msgid "File to open:" 117 | msgstr "Открыть файл:" 118 | 119 | #: ui/main.ui:421 120 | msgid "Destination folder:" 121 | msgstr "Каталог назначения:" 122 | 123 | #: ui/main.ui:435 124 | msgid "Select path for saving" 125 | msgstr "Выбрать каталог назначения" 126 | 127 | #: ui/main.ui:446 128 | msgid "Available resources:" 129 | msgstr "Найденные ресурсы:" 130 | 131 | #: ui/main.ui:474 132 | msgid "Preview" 133 | msgstr "Просмотр" 134 | 135 | #: ui/main.ui:523 136 | msgid "Height" 137 | msgstr "Высота" 138 | 139 | #: ui/main.ui:535 140 | msgid "Bits" 141 | msgstr "Бит" 142 | 143 | #: ui/main.ui:562 144 | msgid "Extract" 145 | msgstr "Извлечь" 146 | 147 | #: ui/main.ui:586 148 | msgid "Please select a file to list the available resources" 149 | msgstr "Выберите файл для просмотра доступных ресурсов" 150 | 151 | #: ui/shortcuts.ui:21 152 | msgid "Show the about dialog" 153 | msgstr "Показать диалог \"О программе\"" 154 | 155 | #: ui/shortcuts.ui:45 156 | msgid "Resources" 157 | msgstr "Ресурсы" 158 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pyxdg==0.28 2 | PyGObject==3.40.1 3 | -------------------------------------------------------------------------------- /requirements_ci.txt: -------------------------------------------------------------------------------- 1 | -r requirements.txt 2 | 3 | flake8==5.0.4 4 | -------------------------------------------------------------------------------- /requirements_development.txt: -------------------------------------------------------------------------------- 1 | -r requirements.txt 2 | 3 | PyGObject-stubs==1.0.0 4 | flake8==5.0.4 5 | transifex-client==0.12.5 6 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [easy_install] 2 | zip_ok = False 3 | 4 | [build] 5 | build_base = build 6 | 7 | [bdist] 8 | dist_dir = dist 9 | 10 | [bdist_wheel] 11 | dist_dir = dist 12 | 13 | [sdist] 14 | dist_dir = dist 15 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | ## 3 | # Project: gExtractWinIcons 4 | # Description: Extract cursors and icons from MS Windows resource files 5 | # Author: Fabio Castelli (Muflone) 6 | # Copyright: 2009-2022 Fabio Castelli 7 | # License: GPL-3+ 8 | # This program is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # This program is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with this program. If not, see . 20 | ## 21 | 22 | import itertools 23 | import pathlib 24 | import setuptools 25 | import setuptools.command.install_scripts 26 | import subprocess 27 | 28 | # Importing distutils after setuptools uses the setuptools distutils 29 | from distutils.command.install_data import install_data 30 | 31 | from gextractwinicons.constants import (APP_AUTHOR, 32 | APP_AUTHOR_EMAIL, 33 | APP_DESCRIPTION, 34 | APP_DOMAIN, 35 | APP_NAME, 36 | APP_VERSION, 37 | URL_APPLICATION, 38 | URL_SOURCES) 39 | 40 | 41 | class InstallScripts(setuptools.command.install_scripts.install_scripts): 42 | def run(self): 43 | setuptools.command.install_scripts.install_scripts.run(self) 44 | self.rename_python_scripts() 45 | 46 | def rename_python_scripts(self): 47 | """Rename main executable python script without .py extension""" 48 | for script in self.get_outputs(): 49 | path_file_script = pathlib.Path(script) 50 | path_destination = path_file_script.with_suffix(suffix='') 51 | if path_file_script.suffix == '.py': 52 | # noinspection PyUnresolvedReferences 53 | setuptools.distutils.log.info( 54 | 'renaming the python script ' 55 | f'{path_file_script.name} -> ' 56 | f'{path_destination.stem}') 57 | path_file_script.rename(path_destination) 58 | 59 | 60 | class InstallData(install_data): 61 | def run(self): 62 | self.install_icons() 63 | self.install_translations() 64 | install_data.run(self) 65 | 66 | def install_icons(self): 67 | # noinspection PyUnresolvedReferences 68 | setuptools.distutils.log.info('Installing icons...') 69 | path_icons = pathlib.Path('share') / 'icons' / 'hicolor' 70 | for path_format in pathlib.Path('icons').iterdir(): 71 | self.data_files.append((path_icons / path_format.name / 'apps', 72 | list(map(str, path_format.glob('*'))))) 73 | 74 | def install_translations(self): 75 | # noinspection PyUnresolvedReferences 76 | setuptools.distutils.log.info('Installing translations...') 77 | path_base = pathlib.Path(__file__).parent.absolute() 78 | # Find where to save the compiled translations 79 | try: 80 | # Use the install_data (when using "setup.py install --user") 81 | # noinspection PyUnresolvedReferences 82 | path_install = pathlib.Path(self.install_data) 83 | except AttributeError: 84 | # Use the install_dir (when using "setup.py install") 85 | path_install = pathlib.Path(self.install_dir) 86 | path_locale = path_install / 'share' / 'locale' 87 | for path_file_po in pathlib.Path('po').glob('*.po'): 88 | path_destination = path_locale / path_file_po.stem / 'LC_MESSAGES' 89 | path_file_mo = path_destination / f'{APP_DOMAIN}.mo' 90 | 91 | if not path_destination.exists(): 92 | # noinspection PyUnresolvedReferences 93 | setuptools.distutils.log.info(f'creating {path_destination}') 94 | path_destination.mkdir(parents=True) 95 | 96 | # noinspection PyUnresolvedReferences 97 | setuptools.distutils.log.info(f'compiling {path_file_po} -> ' 98 | f'{path_file_mo}') 99 | subprocess.call( 100 | args=('msgfmt', 101 | f'--output-file={path_file_mo}', 102 | path_file_po), 103 | cwd=path_base) 104 | 105 | 106 | class CommandCreatePOT(setuptools.Command): 107 | description = "create base POT file" 108 | user_options = [] 109 | 110 | def initialize_options(self): 111 | pass 112 | 113 | def finalize_options(self): 114 | pass 115 | 116 | def run(self): 117 | path_base = pathlib.Path(__file__).parent.absolute() 118 | path_po = path_base / 'po' 119 | path_ui = path_base / 'ui' 120 | path_pot = path_po / f'{APP_DOMAIN}.pot' 121 | list_files_process = [] 122 | # Add *.ui files to list of files to process 123 | for filename in path_ui.glob('*.ui'): 124 | list_files_process.append(filename.relative_to(path_base)) 125 | # Add *.py files to list of files to process 126 | for filename in path_base.rglob('*.py'): 127 | list_files_process.append(filename.relative_to(path_base)) 128 | # Sort the files to process them always in the same order (hopefully) 129 | list_files_process.sort() 130 | # Extract messages from the files to process 131 | # noinspection PyTypeChecker 132 | subprocess.call( 133 | args=itertools.chain(( 134 | 'xgettext', 135 | '--keyword=_', 136 | '--keyword=N_', 137 | f'--output={path_pot}', 138 | '--add-location', 139 | f'--package-name={APP_NAME}', 140 | f'--copyright-holder={APP_AUTHOR}', 141 | f'--msgid-bugs-address={URL_SOURCES}issues/'), 142 | list_files_process), 143 | cwd=path_base) 144 | 145 | 146 | class CommandCreatePO(setuptools.Command): 147 | description = "create translation PO file" 148 | user_options = [ 149 | ('locale=', None, 'Define locale'), 150 | ('output=', None, 'Define output file'), 151 | ] 152 | 153 | # noinspection PyUnusedLocal 154 | def __init__(self, dist, **kw): 155 | super().__init__(dist) 156 | self.locale = None 157 | self.output = None 158 | 159 | def initialize_options(self): 160 | pass 161 | 162 | def finalize_options(self): 163 | assert self.locale, 'Missing locale' 164 | assert self.output, 'Missing output file' 165 | 166 | def run(self): 167 | path_base = pathlib.Path(__file__).parent.absolute() 168 | path_file_pot = path_base / 'po' / f'{APP_DOMAIN}.pot' 169 | path_file_po = path_base / 'po' / f'{self.output}.po' 170 | # Create PO file 171 | subprocess.call( 172 | args=('msginit', 173 | f'--input={path_file_pot}', 174 | '--no-translator', 175 | f'--output-file={path_file_po}', 176 | f'--locale={self.locale}'), 177 | cwd=path_base) 178 | 179 | 180 | class CommandTranslations(setuptools.Command): 181 | description = "build translations" 182 | user_options = [] 183 | 184 | def initialize_options(self): 185 | pass 186 | 187 | def finalize_options(self): 188 | pass 189 | 190 | def run(self): 191 | path_base = pathlib.Path(__file__).parent.absolute() 192 | path_po = path_base / 'po' 193 | for file_po in path_po.glob('*.po'): 194 | subprocess.call(('msgmerge', 195 | '--update', 196 | '--backup=off', 197 | file_po, 198 | path_po / f'{APP_DOMAIN}.pot')) 199 | path_mo = path_base / 'locale' / file_po.stem / 'LC_MESSAGES' 200 | if not path_mo.exists(): 201 | path_mo.mkdir(parents=True) 202 | file_mo = path_mo / f'{APP_DOMAIN}.mo' 203 | subprocess.call(('msgfmt', 204 | '--output-file', 205 | file_mo, 206 | file_po)) 207 | 208 | 209 | setuptools.setup( 210 | name=APP_NAME, 211 | version=APP_VERSION, 212 | author=APP_AUTHOR, 213 | author_email=APP_AUTHOR_EMAIL, 214 | maintainer=APP_AUTHOR, 215 | maintainer_email=APP_AUTHOR_EMAIL, 216 | url=URL_APPLICATION, 217 | description=APP_DESCRIPTION, 218 | license='GPL v3', 219 | scripts=['gextractwinicons.py'], 220 | packages=['gextractwinicons', 221 | 'gextractwinicons.ui'], 222 | data_files=[ 223 | (f'share/{APP_DOMAIN}/data', 224 | ['data/gextractwinicons.png']), 225 | ('share/applications', 226 | ['data/gextractwinicons.desktop']), 227 | (f'share/doc/{APP_DOMAIN}', 228 | list(itertools.chain( 229 | list(map(str, pathlib.Path('doc').glob('*'))), 230 | list(map(str, pathlib.Path('.').glob('*.md')))))), 231 | ('share/man/man1', 232 | ['man/gextractwinicons.1']), 233 | (f'share/{APP_DOMAIN}/ui', [str(file) 234 | for file 235 | in pathlib.Path('ui').glob('*') 236 | if not file.name.endswith('~')]), 237 | ('share/metainfo', 238 | ['data/com.muflone.gextractwinicons.metainfo.xml']), 239 | ], 240 | cmdclass={ 241 | 'install_scripts': InstallScripts, 242 | 'install_data': InstallData, 243 | 'create_pot': CommandCreatePOT, 244 | 'create_po': CommandCreatePO, 245 | 'translations': CommandTranslations 246 | } 247 | ) 248 | -------------------------------------------------------------------------------- /ui/about.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | False 7 | 5 8 | True 9 | center-on-parent 10 | True 11 | dialog 12 | image-missing 13 | 14 | 15 | False 16 | vertical 17 | 2 18 | 19 | 20 | False 21 | end 22 | 23 | 24 | False 25 | True 26 | end 27 | 0 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /ui/main.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | accelerators 8 | 9 | 10 | Quit 11 | 12 | 13 | 14 | 15 | 16 | 17 | About 18 | help-about 19 | 20 | 21 | 22 | 23 | 24 | 25 | Keyboard shortcuts 26 | help-browser 27 | 28 | 29 | 30 | 31 | 32 | 33 | Open the options menu 34 | open-menu-symbolic 35 | 36 | 37 | 38 | 39 | Open the options menu 40 | 41 | 42 | 43 | 44 | 45 | 46 | accelerators 47 | 48 | 49 | Refresh 50 | view-refresh-symbolic 51 | False 52 | 53 | 54 | 55 | 56 | 57 | 58 | Stop 59 | process-stop-symbolic 60 | False 61 | 62 | 63 | 64 | 65 | 66 | 67 | Save resources 68 | document-save-symbolic 69 | True 70 | False 71 | 72 | 73 | 74 | 75 | 76 | 77 | Select all 78 | edit-select-all-symbolic 79 | 80 | 81 | 82 | 83 | 84 | 85 | Deselect all 86 | edit-clear-symbolic 87 | 88 | 89 | 90 | 91 | 92 | 93 | Select only PNGs 94 | applications-graphics-symbolic 95 | 96 | 97 | 98 | 99 | 100 | 101 | True 102 | False 103 | accelerators 104 | 105 | 106 | action_refresh 107 | True 108 | False 109 | Refresh 110 | True 111 | 112 | 113 | 114 | 115 | action_stop 116 | True 117 | False 118 | Stop 119 | True 120 | 121 | 122 | 123 | 124 | action_save 125 | True 126 | False 127 | Save resources 128 | True 129 | 130 | 131 | 132 | 133 | True 134 | False 135 | Select resources 136 | 137 | 138 | True 139 | False 140 | 141 | 142 | action_select_all 143 | True 144 | False 145 | Select all 146 | True 147 | 148 | 149 | 150 | 151 | action_select_png 152 | True 153 | False 154 | Select only PNGs 155 | True 156 | 157 | 158 | 159 | 160 | action_select_none 161 | True 162 | False 163 | Deselect all 164 | True 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | True 174 | False 175 | 176 | 177 | 178 | 179 | action_shortcuts 180 | True 181 | False 182 | Keyboard shortcuts 183 | True 184 | 185 | 186 | 187 | 188 | action_about 189 | True 190 | False 191 | About 192 | True 193 | 194 | 195 | 196 | 197 | True 198 | False 199 | gExtractWinIcons 200 | False 201 | True 202 | 203 | 204 | Save resources 205 | action_save 206 | True 207 | True 208 | True 209 | none 210 | 211 | 212 | 213 | 214 | True 215 | False 216 | 217 | 218 | 1 219 | 220 | 221 | 222 | 223 | True 224 | False 225 | Select resources 226 | 227 | 228 | 2 229 | 230 | 231 | 232 | 233 | Select all 234 | action_select_all 235 | True 236 | False 237 | True 238 | True 239 | none 240 | True 241 | 242 | 243 | 3 244 | 245 | 246 | 247 | 248 | Select only PNGs 249 | action_select_png 250 | True 251 | False 252 | True 253 | True 254 | none 255 | True 256 | 257 | 258 | 4 259 | 260 | 261 | 262 | 263 | Deselect all 264 | action_select_none 265 | True 266 | False 267 | True 268 | True 269 | none 270 | True 271 | 272 | 273 | 5 274 | 275 | 276 | 277 | 278 | action_options 279 | True 280 | True 281 | False 282 | True 283 | none 284 | menu_options 285 | 286 | 287 | 288 | 289 | 290 | end 291 | 6 292 | 293 | 294 | 295 | 296 | About 297 | action_about 298 | True 299 | True 300 | True 301 | none 302 | 303 | 304 | end 305 | 7 306 | 307 | 308 | 309 | 310 | Stop 311 | action_stop 312 | True 313 | True 314 | True 315 | none 316 | True 317 | 318 | 319 | end 320 | 8 321 | 322 | 323 | 324 | 325 | Refresh 326 | action_refresh 327 | True 328 | True 329 | True 330 | none 331 | True 332 | 333 | 334 | end 335 | 9 336 | 337 | 338 | 339 | 340 | 341 | * 342 | 343 | 344 | 345 | 346 | *.exe 347 | *.dll 348 | *.cpl 349 | *.ocx 350 | *.scr 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | False 379 | 600 380 | 400 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | True 389 | False 390 | 7 391 | 3 392 | 4 393 | 394 | 395 | True 396 | False 397 | File to open: 398 | 0 399 | 400 | 401 | 0 402 | 0 403 | 404 | 405 | 406 | 407 | True 408 | False 409 | True 410 | 411 | 412 | 413 | 1 414 | 0 415 | 416 | 417 | 418 | 419 | True 420 | False 421 | Destination folder: 422 | 0 423 | 424 | 425 | 0 426 | 1 427 | 428 | 429 | 430 | 431 | True 432 | False 433 | True 434 | select-folder 435 | Select path for saving 436 | 437 | 438 | 1 439 | 1 440 | 441 | 442 | 443 | 444 | True 445 | False 446 | <b>Available resources:</b> 447 | True 448 | 0 449 | 450 | 451 | 0 452 | 2 453 | 2 454 | 455 | 456 | 457 | 458 | True 459 | True 460 | True 461 | True 462 | in 463 | 464 | 465 | True 466 | True 467 | store_resources 468 | 469 | 470 | 471 | 472 | 473 | 474 | Preview 475 | 476 | 477 | 478 | 8 479 | 480 | 481 | 482 | 483 | 484 | 485 | Type 486 | 487 | 488 | 489 | 1 490 | 491 | 492 | 493 | 494 | 495 | 496 | Name 497 | True 498 | 499 | 500 | 501 | 2 502 | 503 | 504 | 505 | 506 | 507 | 508 | True 509 | Width 510 | 511 | 512 | 1 513 | 514 | 515 | 4 516 | 517 | 518 | 519 | 520 | 521 | 522 | True 523 | Height 524 | 525 | 526 | 527 | 5 528 | 529 | 530 | 531 | 532 | 533 | 534 | True 535 | Bits 536 | 537 | 538 | 1 539 | 540 | 541 | 6 542 | 543 | 544 | 545 | 546 | 547 | 548 | True 549 | Size 550 | 551 | 552 | 1 553 | 554 | 555 | 7 556 | 557 | 558 | 559 | 560 | 561 | 562 | Extract 563 | 564 | 565 | 566 | 567 | 568 | 0 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 0 578 | 3 579 | 2 580 | 581 | 582 | 583 | 584 | True 585 | False 586 | Please select a file to list the available resources 587 | 0 588 | 589 | 590 | 0 591 | 5 592 | 2 593 | 594 | 595 | 596 | 597 | False 598 | True 599 | True 600 | True 601 | 602 | 603 | 0 604 | 4 605 | 2 606 | 607 | 608 | 609 | 610 | 611 | 612 | -------------------------------------------------------------------------------- /ui/shortcuts.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 1 7 | 8 | 9 | 1 10 | shortcuts 11 | 15 12 | 13 | 14 | 15 | 1 16 | General 17 | 18 | 19 | 1 20 | F1 21 | Show the about dialog 22 | 23 | 24 | 25 | 26 | 1 27 | <ctrl>question 28 | Keyboard shortcuts 29 | 30 | 31 | 32 | 33 | 1 34 | <ctrl>Q 35 | Quit 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 1 44 | resources 45 | Resources 46 | 47 | 48 | 1 49 | <ctrl>R 50 | Refresh 51 | 52 | 53 | 54 | 55 | 1 56 | Escape 57 | Stop 58 | 59 | 60 | 61 | 62 | 1 63 | <ctrl>S 64 | Save resources 65 | 66 | 67 | 68 | 69 | 1 70 | <ctrl>A 71 | Select all 72 | 73 | 74 | 75 | 76 | 1 77 | <ctrl><shift>A 78 | Deselect all 79 | 80 | 81 | 82 | 83 | 1 84 | <ctrl>P 85 | Select only PNGs 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | --------------------------------------------------------------------------------