diff --git a/README.md b/README.md index fdc55bd2c..44c4bd7ef 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ Supported operating systems: * **Mac OS X** - 1. Install [Python 2.7](https://www.python.org) + 1. Install [Python 2.7](https://www.python.org) and [Homebrew](https://brew.sh) 2. Download and execute the [DMG package](https://github.com/FPGAwars/icestudio/releases) @@ -102,10 +102,10 @@ npm run dist |:----------:|:------------------------------------------:| | English | ![Progress](http://progressed.io/bar/100) | | Spanish | ![Progress](http://progressed.io/bar/100) | -| French | ![Progress](http://progressed.io/bar/100) | -| Basque | ![Progress](http://progressed.io/bar/97) | -| Galician | ![Progress](http://progressed.io/bar/93) | -| Catalan | ![Progress](http://progressed.io/bar/93) | +| French | ![Progress](http://progressed.io/bar/95) | +| Basque | ![Progress](http://progressed.io/bar/93) | +| Galician | ![Progress](http://progressed.io/bar/89) | +| Catalan | ![Progress](http://progressed.io/bar/89) | **Contribute!** @@ -115,7 +115,7 @@ Add or update the [app translations](https://github.com/FPGAwars/icestudio/tree/ ## Troubleshooting -If you get this error `npm ERR! peerinvalid The package grunt@1.0.1 does not satisfy its siblings' peerDependencies requirements!`, execute: +If you get this error `npm ERR! peerinvalid The package grunt@1.0.1 does not satisfy its siblings' peerDependencies requirements!`, try to update your **[nodejs](https://github.com/nodejs/node)** or execute: ```bash npm update -g diff --git a/app/bower.json b/app/bower.json index c28af528f..9ff2b8c13 100644 --- a/app/bower.json +++ b/app/bower.json @@ -2,8 +2,8 @@ "name": "icestudio", "description": "Experimental graphic editor for open FPGAs", "main": "index.html", - "authors": [ - "Jesús Arroyo Torrens ", + "author": "Jesús Arroyo Torrens ", + "contributors": [ "Tom Calvo " ], "license": "GPL-2.0", @@ -34,7 +34,7 @@ "async": "^1.5.2", "svg-pan-zoom": "~3.4.0", "alertify-js": "^1.8.0", - "jquery-resize": "*", + "jquery-resize": "v1.1", "angular-gettext": "https://github.com/Jesus89/angular-gettext.git#master" } } diff --git a/app/package.json b/app/package.json index f61b885f9..a5bb5a28f 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "icestudio", - "version": "0.3.0", + "version": "0.3.1-rc", "description": "Experimental graphic editor for open FPGAs", "author": "Jesús Arroyo Torrens ", "repository": "https://github.com/FPGAwars/icestudio", @@ -27,28 +27,28 @@ }, "dependencies": { "adm-zip": "^0.4.7", - "angular-gettext-tools": "~2.3.3", + "angular-gettext-tools": "2.3.5", "copy-paste": "^1.3.0", + "extract-zip": "^1.6.5", "fs-extra": "^1.0.0", - "getos": "^2.8.4", - "glob": "^7.1.1", + "getos": "^3.0.1", + "glob": "^7.1.2", "is-online": "^5.2.0", - "jquery": "^3.1.1", + "jquery": "^3.2.1", "node-lang-info": "^0.2.1", - "os": "^0.1.1", - "path": "^0.12.7", "rmdir": "^1.2.0", - "rsyncwrapper": "^2.0.0", + "rsyncwrapper": "^2.0.1", "sha1": "^1.1.1", "ssh-exec": "^2.0.0", - "sudo-prompt": "^6.2.0", - "svgo": "~0.7.1", - "tarball-extract": "~0.0.6" + "sudo-prompt": "^7.1.0", + "svgo": "~0.7.2", + "temporary": "0.0.8" }, "readme": "../README.md", "keywords": [ "FPGA", "open", + "editor", "hardware" ] } diff --git a/app/resources/config/80-icestick.rules b/app/resources/config/80-icestick.rules deleted file mode 100644 index 16be309c1..000000000 --- a/app/resources/config/80-icestick.rules +++ /dev/null @@ -1 +0,0 @@ -ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", OWNER="user", GROUP="dialout", MODE="0777" diff --git a/app/resources/locale/ca_ES/ca_ES.po b/app/resources/locale/ca_ES/ca_ES.po index a53bf767b..c804a7c00 100644 --- a/app/resources/locale/ca_ES/ca_ES.po +++ b/app/resources/locale/ca_ES/ca_ES.po @@ -12,11 +12,11 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 +#: app/scripts/services/drivers.js:211 app/scripts/services/drivers.js:87 msgid "Unplug and reconnect the board" msgstr "Desconnecta i connecta la placa" -#: app/scripts/services/drivers.js:189 +#: app/scripts/services/drivers.js:195 msgid "" "

FTDI driver installation instructions

  1. Connect the FPGA " "board
  2. Replace the (Interface 0) driver of the board by " @@ -26,7 +26,7 @@ msgstr "" "placa FPGA
  3. Reemplaça el driver de la (Interface 0) de la " "placa por libusbK
  4. Desconnecta i connecta la placa
" -#: app/scripts/services/drivers.js:207 +#: app/scripts/services/drivers.js:218 msgid "" "

FTDI driver uninstallation instructions

  1. Find the FPGA USB " "Device
  2. Select the board interface and uninstall the driver
" @@ -35,35 +35,35 @@ msgstr "" "dispositiu USB de la FPGA
  • Selecciona la interfície de la placa i " "desinstal·la el driver
  • " -#: app/views/menu.html:313 +#: app/views/menu.html:322 msgid "About Icestudio" msgstr "Quant a Icestudio" -#: app/views/menu.html:267 +#: app/views/menu.html:276 msgid "Add" msgstr "Afegir" -#: app/scripts/controllers/menu.js:511 +#: app/scripts/controllers/menu.js:562 msgid "Add a block to start" msgstr "Afegeix un bloc per a iniciar" -#: app/views/menu.html:43 +#: app/views/menu.html:46 msgid "Add as block" msgstr "Afegeix com a bloc" -#: app/scripts/services/tools.js:889 +#: app/scripts/services/tools.js:1036 msgid "All collections removed" msgstr "Col·leccions eliminades" -#: app/scripts/controllers/menu.js:533 +#: app/scripts/controllers/menu.js:586 msgid "All stored collections will be lost. Do you want to continue?" msgstr "Totes les col·leccions emmagatzemades es perdran. Vols continuar?" -#: app/scripts/services/utils.js:535 +#: app/scripts/services/utils.js:533 msgid "Author" msgstr "Autor" -#: app/views/menu.html:324 +#: app/views/menu.html:333 msgid "Basic" msgstr "Bàsic" @@ -71,50 +71,54 @@ msgstr "Bàsic" msgid "Basque" msgstr "Basc" -#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 -#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 -#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:928 -#: app/scripts/services/blocks.js:962 +#: app/scripts/services/blocks.js:757 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:833 app/scripts/services/blocks.js:852 +#: app/scripts/services/blocks.js:887 app/scripts/services/blocks.js:930 +#: app/scripts/services/blocks.js:965 msgid "Block updated" msgstr "Bloc actualitzat" -#: app/scripts/services/project.js:426 +#: app/scripts/services/project.js:433 msgid "Block {{name}} imported" msgstr "Bloc {{name}} importat" -#: app/views/menu.html:35 +#: app/views/menu.html:38 msgid "Blocks" msgstr "Blocs" -#: app/views/menu.html:174 +#: app/views/menu.html:183 msgid "Board" msgstr "Placa" -#: app/views/menu.html:115 app/views/menu.html:162 +#: app/views/menu.html:127 app/views/menu.html:170 msgid "Board rules" msgstr "Regles de la placa" -#: app/scripts/controllers/menu.js:337 +#: app/scripts/controllers/menu.js:371 msgid "Board rules disabled" msgstr "Regles de la placa inhabilitades" -#: app/scripts/controllers/menu.js:332 +#: app/scripts/controllers/menu.js:366 msgid "Board rules enabled" msgstr "Regles de la placa habilitades" -#: app/scripts/services/tools.js:254 +#: app/scripts/services/tools.js:333 msgid "Board {{name}} not detected" msgstr "Placa {{name}} no detectada" -#: app/scripts/controllers/menu.js:476 +#: app/scripts/controllers/menu.js:510 msgid "Board {{name}} selected" msgstr "Placa {{name}} seleccionada" -#: app/views/menu.html:213 +#: app/views/menu.html:222 msgid "Build" msgstr "Sintetitza" -#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:144 +#: app/scripts/controllers/menu.js:531 +msgid "Build done" +msgstr "Sintetitzat realitzat" + +#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:146 msgid "Cancel" msgstr "Cancel·la" @@ -122,87 +126,101 @@ msgstr "Cancel·la" msgid "Catalan" msgstr "Català" -#: app/scripts/services/tools.js:605 +#: app/scripts/services/tools.js:727 msgid "Check Internet connection..." msgstr "Comprovant connexió a Internet..." -#: app/scripts/services/tools.js:613 +#: app/scripts/services/tools.js:737 msgid "Check Python..." msgstr "Comprovant Python" -#: app/scripts/services/drivers.js:104 +#: app/scripts/services/tools.js:819 +msgid "Click here to setup the drivers" +msgstr "" + +#: app/scripts/services/drivers.js:110 app/scripts/services/drivers.js:203 +#: app/scripts/services/drivers.js:225 app/scripts/services/tools.js:132 +#: app/scripts/services/tools.js:246 msgid "Click here to install it" msgstr "" -#: app/views/menu.html:338 +#: app/scripts/controllers/menu.js:326 +msgid "Click here to view" +msgstr "" + +#: app/scripts/controllers/menu.js:247 +msgid "Close" +msgstr "" + +#: app/views/menu.html:347 msgid "Code" msgstr "Codi" -#: app/views/menu.html:185 +#: app/views/menu.html:194 msgid "Collection" msgstr "Col·lecció" -#: app/views/menu.html:165 +#: app/views/menu.html:174 msgid "Collection info" msgstr "" -#: app/scripts/controllers/menu.js:434 +#: app/scripts/controllers/menu.js:468 msgid "Collection {{collection}} info not defined" msgstr "" -#: app/scripts/services/tools.js:773 +#: app/scripts/services/tools.js:920 msgid "Collection {{name}} added" msgstr "Col·lecció {{name}} afegida" -#: app/scripts/services/tools.js:767 +#: app/scripts/services/tools.js:914 msgid "Collection {{name}} not replaced" msgstr "Col·lecció {{name}} no reemplaçada" -#: app/scripts/services/tools.js:883 +#: app/scripts/services/tools.js:1030 msgid "Collection {{name}} removed" msgstr "Col·lecció {{name}} eliminada" -#: app/scripts/services/tools.js:763 +#: app/scripts/services/tools.js:910 msgid "Collection {{name}} replaced" msgstr "Col·lecció {{name}} reemplaçada" -#: app/scripts/controllers/menu.js:442 +#: app/scripts/controllers/menu.js:476 msgid "Collection {{name}} selected" msgstr "Col·lecció {{name}} seleccionada" -#: app/views/menu.html:263 +#: app/views/menu.html:272 msgid "Collections" msgstr "Col·leccions" -#: app/views/menu.html:309 +#: app/views/menu.html:318 msgid "Community forum" msgstr "Fòrum de la comunitat" -#: app/views/menu.html:335 +#: app/views/menu.html:344 msgid "Constant" msgstr "Constant" -#: app/scripts/services/project.js:106 +#: app/scripts/services/project.js:108 msgid "Convert" msgstr "" -#: app/views/menu.html:91 +#: app/views/menu.html:104 msgid "Copy" msgstr "Copia" -#: app/views/menu.html:88 +#: app/views/menu.html:101 msgid "Cut" msgstr "Retalla" -#: app/views/menu.html:159 +#: app/views/menu.html:167 msgid "Datasheet" msgstr "Full de dades" -#: app/views/menu.html:190 +#: app/views/menu.html:199 msgid "Default" msgstr "Per defecte" -#: app/scripts/services/tools.js:481 +#: app/scripts/services/tools.js:603 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" @@ -210,43 +228,43 @@ msgstr "" "La toolchain per defecte no es troba, per la qual cosa serà descarregada. " "Aquesta operació requereix connexió a Internet. Vols continuar?" -#: app/scripts/services/utils.js:534 +#: app/scripts/services/utils.js:532 msgid "Description" msgstr "Descripció" -#: app/views/menu.html:126 app/views/menu.html:256 +#: app/views/menu.html:138 app/views/menu.html:265 msgid "Disable" msgstr "Inhabilita" -#: app/scripts/controllers/menu.js:237 +#: app/scripts/controllers/menu.js:250 msgid "Do you want to close the application?" msgstr "Vols tancar l'aplicació?" -#: app/scripts/controllers/menu.js:523 +#: app/scripts/controllers/menu.js:576 msgid "Do you want to remove the {{name}} collection?" msgstr "Vols eliminar la col·lecció {{name}}?" -#: app/scripts/services/tools.js:759 +#: app/scripts/services/tools.js:906 msgid "Do you want to replace it?" msgstr "Vols reemplaçar-la?" -#: app/views/menu.html:302 +#: app/views/menu.html:311 msgid "Documentation" msgstr "Documentació" -#: app/views/menu.html:247 +#: app/views/menu.html:256 msgid "Drivers" msgstr "Drivers" -#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 +#: app/scripts/services/drivers.js:134 app/scripts/services/drivers.js:72 msgid "Drivers disabled" msgstr "Drivers inhabilitats" -#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 +#: app/scripts/services/drivers.js:126 app/scripts/services/drivers.js:63 msgid "Drivers enabled" msgstr "Drivers habilitats" -#: app/scripts/services/tools.js:265 +#: app/scripts/services/tools.js:344 msgid "Duplicated FPGA I/O ports" msgstr "Ports d'E/S de la FPGA duplicats" @@ -254,15 +272,15 @@ msgstr "Ports d'E/S de la FPGA duplicats" msgid "Duplicated block attributes" msgstr "Atributs de bloc duplicats" -#: app/views/menu.html:78 +#: app/views/menu.html:91 msgid "Edit" msgstr "Edita" -#: app/scripts/services/tools.js:748 +#: app/scripts/services/tools.js:895 msgid "Edit the collection name" msgstr "" -#: app/views/menu.html:121 app/views/menu.html:251 +#: app/views/menu.html:133 app/views/menu.html:260 msgid "Enable" msgstr "Habilita" @@ -294,75 +312,75 @@ msgstr "Introdueix els ports de sortida" msgid "Enter the parameters" msgstr "Introdueix els paràmetres" -#: app/scripts/controllers/menu.js:324 +#: app/scripts/controllers/menu.js:358 msgid "Enter the remote hostname user@host (experimental)" msgstr "Introdueix el nom del host remot usuari@host" -#: app/scripts/services/tools.js:504 +#: app/scripts/services/tools.js:626 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "Error: toolchain per defecte no trobada en '{{dir}}'" -#: app/scripts/services/utils.js:675 +#: app/scripts/services/utils.js:678 msgid "Error: {{error}}" msgstr "Error: {{error}}" -#: app/scripts/services/tools.js:336 -msgid "Errors detected in the code" +#: app/scripts/services/tools.js:418 +msgid "Errors detected in the design" msgstr "" -#: app/views/menu.html:39 +#: app/views/menu.html:42 msgid "Examples" msgstr "Exemples" -#: app/scripts/services/tools.js:206 +#: app/scripts/services/tools.js:275 msgid "Execute remote {{label}} ..." msgstr "Executa {{label}} remot..." -#: app/views/menu.html:54 +#: app/views/menu.html:57 msgid "Export" msgstr "Exporta" -#: app/scripts/services/tools.js:637 +#: app/scripts/services/tools.js:762 msgid "Extract default apio files..." msgstr "Extreu fitxers de apio..." -#: app/scripts/services/tools.js:647 +#: app/scripts/services/tools.js:772 msgid "Extract default apio packages..." msgstr "Extreu paquets de apio..." -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:750 msgid "Extract virtual env files..." msgstr "Extreu fitxers de l'entorn virtual" -#: app/scripts/services/tools.js:262 +#: app/scripts/services/tools.js:341 msgid "FPGA I/O ports not defined" msgstr "Ports d'E/S de la FPGA no definits" #: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 +#: app/scripts/services/blocks.js:713 app/scripts/services/blocks.js:793 msgid "FPGA pin" msgstr "FPGA pin" -#: app/views/menu.html:26 +#: app/views/menu.html:29 msgid "File" msgstr "Fitxer" -#: app/scripts/services/project.js:438 +#: app/scripts/services/project.js:448 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" "El fitxer {{file}} ja existeix en el directori del projecte. Vols reemplaçar-" "lo?" -#: app/scripts/services/tools.js:182 +#: app/scripts/services/tools.js:214 msgid "File {{file}} does not exist" msgstr "El fitxer {{file}} no existeix" -#: app/scripts/services/project.js:472 +#: app/scripts/services/project.js:482 msgid "File {{file}} imported" msgstr "Fitxer {{file}} importat" -#: app/views/menu.html:104 +#: app/views/menu.html:114 msgid "Fit content" msgstr "Ajustar contingut" @@ -370,114 +388,114 @@ msgstr "Ajustar contingut" msgid "French" msgstr "Francès" -#: app/scripts/controllers/menu.js:216 -msgid "GTKWave exported" -msgstr "GTKWave exportat" - #: app/views/languages.html:16 msgid "Galician" msgstr "Gallec" -#: app/views/menu.html:292 +#: app/views/menu.html:301 msgid "Help" msgstr "Ajuda" -#: app/scripts/services/utils.js:548 +#: app/scripts/services/utils.js:546 msgid "Image" msgstr "Imatge" -#: app/scripts/controllers/menu.js:683 +#: app/scripts/controllers/menu.js:735 msgid "Image {{name}} saved" msgstr "Imatge {{name}} desada" -#: app/views/menu.html:341 +#: app/views/menu.html:350 msgid "Information" msgstr "Informació" -#: app/views/menu.html:329 +#: app/views/menu.html:338 msgid "Input" msgstr "Entrada" -#: app/views/menu.html:224 +#: app/views/menu.html:233 msgid "Install" msgstr "Instal·lar" -#: app/scripts/services/tools.js:642 +#: app/scripts/services/tools.js:767 msgid "Install default apio..." msgstr "Instal·lar apio" -#: app/scripts/services/tools.js:691 +#: app/scripts/services/tools.js:816 msgid "Installation completed" msgstr "Instal·lació completada" -#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 +#: app/scripts/services/tools.js:657 app/scripts/services/tools.js:692 msgid "Installing toolchain" msgstr "Instal·lant la toolchain" -#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 +#: app/scripts/services/drivers.js:118 app/scripts/services/tools.js:731 msgid "Internet connection required" msgstr "És necessari connexió a Internet" -#: app/scripts/services/graph.js:179 +#: app/scripts/services/graph.js:178 msgid "Invalid Pull up connection:
    block already connected" msgstr "Connexió de Pull up no vàlida: bloc ja connectat" -#: app/scripts/services/graph.js:193 +#: app/scripts/services/graph.js:192 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" "Connexió Pull up no vàlida:
    nomes blocs Entrada són " "permitits" -#: app/scripts/services/graph.js:185 +#: app/scripts/services/graph.js:184 msgid "Invalid block connection:
    Pull up already connected" msgstr "Connexió de blocs no vàlida:
    Pull up connectada" -#: app/scripts/services/tools.js:779 +#: app/scripts/services/tools.js:926 msgid "Invalid collection {{name}}" msgstr "Col·lecció {{name}} invàlida" -#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 -#: app/scripts/services/graph.js:157 +#: app/scripts/services/graph.js:142 app/scripts/services/graph.js:149 +#: app/scripts/services/graph.js:156 msgid "Invalid connection" msgstr "Connexió no vàlida" -#: app/scripts/services/graph.js:212 +#: app/scripts/services/graph.js:211 msgid "Invalid connection: {{a}} → {{b}}" msgstr "Connexió no vàlida: {{a}} → {{b}}" -#: app/scripts/services/graph.js:173 +#: app/scripts/services/graph.js:172 msgid "Invalid multiple input connections" msgstr "Connexions d'entrada múltiple no vàlides" -#: app/scripts/services/drivers.js:190 +#: app/scripts/services/utils.js:259 +msgid "Invalid project format" +msgstr "" + +#: app/scripts/services/drivers.js:196 msgid "It is recommended to use USB 2.0 ports" msgstr "" -#: app/views/menu.html:134 +#: app/views/menu.html:121 msgid "Language" msgstr "Idioma" -#: app/scripts/services/project.js:105 +#: app/scripts/services/project.js:107 msgid "Load" msgstr "" -#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:866 msgid "Local parameter" msgstr "Paràmetre local" -#: app/scripts/services/tools.js:630 +#: app/scripts/services/tools.js:755 msgid "Make virtual env..." msgstr "Crear entorn virtual" -#: app/scripts/services/utils.js:755 +#: app/scripts/services/utils.js:758 msgid "Maximum bus size: 96 bits" msgstr "" -#: app/scripts/services/utils.js:532 +#: app/scripts/services/utils.js:530 msgid "Name" msgstr "Nom" -#: app/views/menu.html:29 +#: app/views/menu.html:32 msgid "New" msgstr "Nou" @@ -485,131 +503,128 @@ msgstr "Nou" msgid "New project {{name}} created" msgstr "Nou projecte {{name}} creat" -#: app/scripts/controllers/menu.js:541 +#: app/scripts/controllers/menu.js:594 msgid "No collections stored" msgstr "Cap col·lecció emmagatzemada" -#: app/scripts/controllers/main.js:15 app/scripts/services/project.js:143 +#: app/scripts/controllers/main.js:15 app/scripts/controllers/menu.js:260 +#: app/scripts/services/project.js:145 msgid "OK" msgstr "D'acord" -#: app/scripts/services/project.js:377 app/scripts/services/project.js:99 +#: app/scripts/services/project.js:101 app/scripts/services/project.js:384 msgid "Old project format {{version}}" msgstr "Format de projecte antic {{version}}" -#: app/views/menu.html:32 +#: app/views/menu.html:35 msgid "Open" msgstr "Obre" -#: app/scripts/services/utils.js:555 +#: app/scripts/services/utils.js:553 msgid "Open SVG" msgstr "Obre SVG" -#: app/scripts/services/project.js:475 +#: app/scripts/services/project.js:485 msgid "Original file {{file}} does not exist" msgstr "El fitxer original {{file}} no existeix" -#: app/views/menu.html:332 +#: app/views/menu.html:341 msgid "Output" msgstr "Eixida" -#: app/scripts/controllers/menu.js:198 -msgid "PCF file exported" -msgstr "Fitxer PCF exportat" - -#: app/views/menu.html:94 +#: app/views/menu.html:107 msgid "Paste" msgstr "Enganxa" -#: app/scripts/services/utils.js:884 +#: app/scripts/services/utils.js:887 msgid "Please run: {{cmd}}" msgstr "" -#: app/views/menu.html:108 +#: app/views/menu.html:118 msgid "Preferences" msgstr "Preferències" -#: app/views/menu.html:111 +#: app/views/menu.html:152 msgid "Project information" msgstr "Informació del projecte" -#: app/scripts/services/project.js:131 +#: app/scripts/controllers/menu.js:326 app/scripts/controllers/menu.js:340 +msgid "Project information updated" +msgstr "" + +#: app/scripts/services/project.js:133 msgid "Project {{name}} loaded" msgstr "Projecte {{name}} carregat" -#: app/scripts/services/project.js:346 +#: app/scripts/services/project.js:349 msgid "Project {{name}} saved" msgstr "Projecte {{name}} desat" -#: app/scripts/services/tools.js:618 +#: app/scripts/services/tools.js:744 msgid "Python 2.7 is required" msgstr "És necessari Python 2.7" -#: app/views/menu.html:72 +#: app/views/menu.html:85 msgid "Quit" msgstr "Tanca" -#: app/scripts/services/blocks.js:948 app/views/design.html:5 +#: app/scripts/services/blocks.js:950 app/views/design.html:5 msgid "Read only" msgstr "Només lectura" -#: app/views/menu.html:84 +#: app/views/menu.html:97 msgid "Redo" msgstr "Refés" -#: app/scripts/services/tools.js:368 +#: app/scripts/services/tools.js:453 msgid "Remote host {{name}} not connected" msgstr "Host remot {{name}} no connectat" -#: app/views/menu.html:140 +#: app/views/menu.html:145 msgid "Remote hostname" msgstr "Nom del host remot" -#: app/views/menu.html:232 app/views/menu.html:271 +#: app/views/menu.html:241 app/views/menu.html:280 msgid "Remove" msgstr "Suprimir" -#: app/views/menu.html:283 +#: app/views/menu.html:292 msgid "Remove all" msgstr "Suprimir tot" -#: app/scripts/services/utils.js:557 +#: app/scripts/services/utils.js:555 msgid "Reset SVG" msgstr "Reseteja SVG" -#: app/views/menu.html:237 +#: app/views/menu.html:246 msgid "Reset default" msgstr "Resetejar els valors per defecte" -#: app/views/menu.html:101 -msgid "Reset view" -msgstr "Resetejar vista" - -#: app/views/menu.html:47 +#: app/views/menu.html:50 msgid "Save" msgstr "Desa" -#: app/scripts/services/utils.js:556 +#: app/scripts/services/utils.js:554 msgid "Save SVG" msgstr "Desa SVG" -#: app/views/menu.html:50 +#: app/views/menu.html:53 msgid "Save as" msgstr "Anomena i desa" -#: app/views/menu.html:171 +#: app/views/menu.html:180 msgid "Select" msgstr "Selecciona" -#: app/views/menu.html:97 +#: app/views/menu.html:110 msgid "Select all" msgstr "Selecciona tot" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:714 msgid "Show clock" msgstr "Mostra rellotge" -#: app/views/menu.html:305 +#: app/views/menu.html:314 msgid "Source code" msgstr "Codi font" @@ -617,23 +632,31 @@ msgstr "Codi font" msgid "Spanish" msgstr "Espanyol" -#: app/scripts/services/tools.js:195 +#: app/scripts/controllers/menu.js:530 +msgid "Start build" +msgstr "Iniciar sintetitzat" + +#: app/scripts/controllers/menu.js:542 +msgid "Start upload" +msgstr "Iniciar càrrega" + +#: app/scripts/controllers/menu.js:518 +msgid "Start verification" +msgstr "Iniciar verificació" + +#: app/scripts/services/tools.js:264 msgid "Synchronize remote files ..." msgstr "Sincronitza fitxers remots" -#: app/views/menu.html:63 +#: app/views/menu.html:66 msgid "Testbench" msgstr "Testbench" -#: app/scripts/controllers/menu.js:207 -msgid "Testbench exported" -msgstr "Testbench exportat" - -#: app/scripts/services/tools.js:758 +#: app/scripts/services/tools.js:905 msgid "The collection {{name}} already exists." msgstr "La col·leccio {{name}} ja existeix" -#: app/scripts/controllers/menu.js:463 +#: app/scripts/controllers/menu.js:497 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" @@ -641,15 +664,15 @@ msgstr "" "La configuració actual d'E/S de la FPGA es perdrà. Vols canviar a la placa " "{{name}}?" -#: app/scripts/services/tools.js:509 +#: app/scripts/services/tools.js:631 msgid "The toolchain will be removed. Do you want to continue?" msgstr "La toolchain serà eliminada. Vols continuar?" -#: app/scripts/services/tools.js:497 +#: app/scripts/services/tools.js:619 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "La toolchain serà restaurada als valors per defecte. Vols continuar?" -#: app/scripts/services/tools.js:489 +#: app/scripts/services/tools.js:611 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" @@ -657,7 +680,7 @@ msgstr "" "La toolchain serà actualitzada. Aquesta operació requereix connexió a " "Internet. Vols continuar?" -#: app/scripts/services/project.js:400 +#: app/scripts/services/project.js:407 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" @@ -665,87 +688,95 @@ msgstr "" "Aquesta operació d'importació requereix un directori de projecte. Has de " "desar el projecte actual. Vols continuar?" -#: app/scripts/services/project.js:109 +#: app/scripts/services/project.js:111 msgid "This project is designed for the {{name}} board." msgstr "Aquest projecte està dissenyat per a la placa {{name}}" -#: app/views/menu.html:220 +#: app/views/menu.html:229 msgid "Toolchain" msgstr "Toolchain" -#: app/scripts/services/tools.js:692 +#: app/scripts/services/tools.js:818 msgid "Toolchain installed" msgstr "Toolchain instal·lada" -#: app/scripts/services/tools.js:695 +#: app/scripts/services/drivers.js:203 app/scripts/services/drivers.js:225 +#: app/scripts/services/tools.js:132 app/scripts/services/tools.js:834 msgid "Toolchain not installed" msgstr "La toolchain no està instal·lada" -#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 -#: app/scripts/services/tools.js:94 -msgid "Toolchain not installed. Please, install the toolchain" -msgstr "Toolchain no instal·lada. Per favor, instal·la la toolchain" - -#: app/scripts/services/tools.js:514 +#: app/scripts/services/tools.js:636 msgid "Toolchain removed" msgstr "Toolchain eliminada" -#: app/views/menu.html:207 +#: app/scripts/services/tools.js:246 +msgid "Toolchain version does not match" +msgstr "" + +#: app/views/menu.html:216 msgid "Tools" msgstr "Eines" -#: app/views/menu.html:81 +#: app/views/menu.html:94 msgid "Undo" msgstr "Desfés" -#: app/scripts/services/tools.js:257 +#: app/scripts/services/tools.js:336 msgid "Unknown board" msgstr "Placa desconeguda" -#: app/scripts/app.js:44 +#: app/scripts/app.js:48 msgid "Untitled" msgstr "Sense títol" -#: app/views/menu.html:227 +#: app/views/menu.html:236 msgid "Update" msgstr "Actualitzar" -#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 -#: app/scripts/services/blocks.js:863 +#: app/scripts/services/blocks.js:712 app/scripts/services/blocks.js:792 +#: app/scripts/services/blocks.js:865 msgid "Update the block name" msgstr "Actualitza el nom del bloc" -#: app/views/menu.html:216 +#: app/views/menu.html:225 msgid "Upload" msgstr "Carrega" -#: app/views/menu.html:210 +#: app/scripts/controllers/menu.js:543 +msgid "Upload done" +msgstr "Càrrega realitzada" + +#: app/scripts/controllers/menu.js:519 +msgid "Verification done" +msgstr "Verificació realitzada" + +#: app/views/menu.html:219 msgid "Verify" msgstr "Verifica" -#: app/scripts/controllers/menu.js:189 -msgid "Verilog code exported" -msgstr "Codi Verilog exportat" - -#: app/scripts/services/utils.js:533 app/views/menu.html:298 +#: app/scripts/services/utils.js:531 app/views/menu.html:307 msgid "Version" msgstr "Versió" -#: app/views/menu.html:150 +#: app/views/menu.html:158 msgid "View" msgstr "Visualitza" -#: app/views/menu.html:295 +#: app/views/menu.html:304 msgid "View license" msgstr "Visualitzar llicència" +#: app/scripts/services/tools.js:421 +msgid "Warnings detected in the design" +msgstr "" + #: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Format de bloc incorrecte: {{type}}" #: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 -#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:783 +#: app/scripts/services/blocks.js:857 app/scripts/services/blocks.js:892 msgid "Wrong block name {{name}}" msgstr "Nom de bloc incorrecte" @@ -757,19 +788,19 @@ msgstr "Nom del paràmetre incorrecte" msgid "Wrong port name {{name}}" msgstr "Nom del port incorrecte" -#: app/scripts/services/project.js:139 +#: app/scripts/services/project.js:141 msgid "Wrong project format: {{name}}" msgstr "Format de projecte incorrecte: {{name}}" -#: app/scripts/services/tools.js:365 +#: app/scripts/services/tools.js:450 msgid "Wrong remote hostname {{name}}" msgstr "Nom del host remot incorrecte {{name}}" -#: app/scripts/services/project.js:110 +#: app/scripts/services/project.js:112 msgid "You can load it as it is or convert it for the {{name}} board." msgstr "" -#: app/scripts/controllers/menu.js:238 +#: app/scripts/controllers/menu.js:251 msgid "Your changes will be lost if you don’t save them" msgstr "Els teus canvis es perdran si no els deses" @@ -777,52 +808,62 @@ msgstr "Els teus canvis es perdran si no els deses" msgid "back" msgstr "enrere" -#. Build done -#: app/scripts/services/tools.js:380 -msgid "done_build" -msgstr "Sintetitzat realitzat" - -#. Upload done -#: app/scripts/services/tools.js:382 -msgid "done_upload" -msgstr "Càrrega realitzada" - -#. Verification done -#: app/scripts/services/tools.js:378 -msgid "done_verify" -msgstr "Verificació realitzada" - -#. Start building ... -#: app/scripts/services/tools.js:61 -msgid "start_build" -msgstr "Iniciar sintetitzat ..." - -#. Start uploading ... -#: app/scripts/services/tools.js:63 -msgid "start_upload" -msgstr "Iniciar càrrega ..." - -#. Start verification ... -#: app/scripts/services/tools.js:59 -msgid "start_verify" -msgstr "Iniciar verificació ..." - -#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:859 +#: app/scripts/services/drivers.js:109 app/scripts/services/utils.js:862 msgid "{{app}} is required." msgstr "" -#: app/scripts/controllers/menu.js:396 +#: app/scripts/controllers/menu.js:430 msgid "{{board}} datasheet not defined" msgstr "Full de dades de {{board}} no definit" -#: app/scripts/controllers/menu.js:386 +#: app/scripts/controllers/menu.js:420 msgid "{{board}} pinout not defined" msgstr "{{board}} pinout no definit" -#: app/scripts/controllers/menu.js:415 +#: app/scripts/controllers/menu.js:449 msgid "{{board}} rules not defined" msgstr "Regles de {{board}} no definides" +#: app/scripts/controllers/menu.js:201 app/scripts/controllers/menu.js:224 +msgid "{{name}} exported" +msgstr "" + +#~ msgid "GTKWave exported" +#~ msgstr "GTKWave exportat" + +#~ msgid "PCF file exported" +#~ msgstr "Fitxer PCF exportat" + +#~ msgid "Reset view" +#~ msgstr "Resetejar vista" + +#~ msgid "Testbench exported" +#~ msgstr "Testbench exportat" + +#~ msgid "Toolchain not installed. Please, install the toolchain" +#~ msgstr "Toolchain no instal·lada. Per favor, instal·la la toolchain" + +#~ msgid "Verilog code exported" +#~ msgstr "Codi Verilog exportat" + +#~ msgid "done_build" +#~ msgstr "Sintetitzat realitzat" + +#~ msgid "done_upload" +#~ msgstr "Càrrega realitzada" + +#~ msgid "done_verify" +#~ msgstr "Verificació realitzada" + +#~ msgid "start_build" +#~ msgstr "Iniciar sintetitzat ..." + +#~ msgid "start_upload" +#~ msgstr "Iniciar càrrega ..." + +#~ msgid "start_verify" +#~ msgstr "Iniciar verificació ..." + #~ msgid "Do you want to convert it?" #~ msgstr "Vols convertir-lo?" diff --git a/app/resources/locale/en/en.po b/app/resources/locale/en/en.po index 241e41b40..87876ba53 100644 --- a/app/resources/locale/en/en.po +++ b/app/resources/locale/en/en.po @@ -12,11 +12,11 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 +#: app/scripts/services/drivers.js:211 app/scripts/services/drivers.js:87 msgid "Unplug and reconnect the board" msgstr "Unplug and reconnect the board" -#: app/scripts/services/drivers.js:189 +#: app/scripts/services/drivers.js:195 msgid "" "

    FTDI driver installation instructions

    1. Connect the FPGA " "board
    2. Replace the (Interface 0) driver of the board by " @@ -26,7 +26,7 @@ msgstr "" "board
    3. Replace the (Interface 0) driver of the board by " "libusbK
    4. Unplug and reconnect the board
    " -#: app/scripts/services/drivers.js:207 +#: app/scripts/services/drivers.js:218 msgid "" "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB " "Device
    2. Select the board interface and uninstall the driver
    " @@ -34,35 +34,35 @@ msgstr "" "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB " "Device
    2. Select the board interface and uninstall the driver
    " -#: app/views/menu.html:313 +#: app/views/menu.html:322 msgid "About Icestudio" msgstr "About Icestudio" -#: app/views/menu.html:267 +#: app/views/menu.html:276 msgid "Add" msgstr "Add" -#: app/scripts/controllers/menu.js:511 +#: app/scripts/controllers/menu.js:562 msgid "Add a block to start" msgstr "Add a block to start" -#: app/views/menu.html:43 +#: app/views/menu.html:46 msgid "Add as block" msgstr "Add as block" -#: app/scripts/services/tools.js:889 +#: app/scripts/services/tools.js:1036 msgid "All collections removed" msgstr "All collections removed" -#: app/scripts/controllers/menu.js:533 +#: app/scripts/controllers/menu.js:586 msgid "All stored collections will be lost. Do you want to continue?" msgstr "All stored collections will be lost. Do you want to continue?" -#: app/scripts/services/utils.js:535 +#: app/scripts/services/utils.js:533 msgid "Author" msgstr "Author" -#: app/views/menu.html:324 +#: app/views/menu.html:333 msgid "Basic" msgstr "Basic" @@ -70,50 +70,54 @@ msgstr "Basic" msgid "Basque" msgstr "Basque" -#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 -#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 -#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:928 -#: app/scripts/services/blocks.js:962 +#: app/scripts/services/blocks.js:757 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:833 app/scripts/services/blocks.js:852 +#: app/scripts/services/blocks.js:887 app/scripts/services/blocks.js:930 +#: app/scripts/services/blocks.js:965 msgid "Block updated" msgstr "Block updated" -#: app/scripts/services/project.js:426 +#: app/scripts/services/project.js:433 msgid "Block {{name}} imported" msgstr "Block {{name}} imported" -#: app/views/menu.html:35 +#: app/views/menu.html:38 msgid "Blocks" msgstr "Blocks" -#: app/views/menu.html:174 +#: app/views/menu.html:183 msgid "Board" msgstr "Board" -#: app/views/menu.html:115 app/views/menu.html:162 +#: app/views/menu.html:127 app/views/menu.html:170 msgid "Board rules" msgstr "Board rules" -#: app/scripts/controllers/menu.js:337 +#: app/scripts/controllers/menu.js:371 msgid "Board rules disabled" msgstr "Board rules disabled" -#: app/scripts/controllers/menu.js:332 +#: app/scripts/controllers/menu.js:366 msgid "Board rules enabled" msgstr "Board rules enabled" -#: app/scripts/services/tools.js:254 +#: app/scripts/services/tools.js:333 msgid "Board {{name}} not detected" msgstr "Board {{name}} not detected" -#: app/scripts/controllers/menu.js:476 +#: app/scripts/controllers/menu.js:510 msgid "Board {{name}} selected" msgstr "Board {{name}} selected" -#: app/views/menu.html:213 +#: app/views/menu.html:222 msgid "Build" msgstr "Build" -#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:144 +#: app/scripts/controllers/menu.js:531 +msgid "Build done" +msgstr "Build done" + +#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:146 msgid "Cancel" msgstr "Cancel" @@ -121,87 +125,101 @@ msgstr "Cancel" msgid "Catalan" msgstr "Catalan" -#: app/scripts/services/tools.js:605 +#: app/scripts/services/tools.js:727 msgid "Check Internet connection..." msgstr "Check Internet connection..." -#: app/scripts/services/tools.js:613 +#: app/scripts/services/tools.js:737 msgid "Check Python..." msgstr "Check Python..." -#: app/scripts/services/drivers.js:104 +#: app/scripts/services/tools.js:819 +msgid "Click here to setup the drivers" +msgstr "Click here to setup the drivers" + +#: app/scripts/services/drivers.js:110 app/scripts/services/drivers.js:203 +#: app/scripts/services/drivers.js:225 app/scripts/services/tools.js:132 +#: app/scripts/services/tools.js:246 msgid "Click here to install it" msgstr "Click here to install it" -#: app/views/menu.html:338 +#: app/scripts/controllers/menu.js:326 +msgid "Click here to view" +msgstr "Click here to view" + +#: app/scripts/controllers/menu.js:247 +msgid "Close" +msgstr "Close" + +#: app/views/menu.html:347 msgid "Code" msgstr "Code" -#: app/views/menu.html:185 +#: app/views/menu.html:194 msgid "Collection" msgstr "Collection" -#: app/views/menu.html:165 +#: app/views/menu.html:174 msgid "Collection info" msgstr "Collection info" -#: app/scripts/controllers/menu.js:434 +#: app/scripts/controllers/menu.js:468 msgid "Collection {{collection}} info not defined" msgstr "Collection {{collection}} info not defined" -#: app/scripts/services/tools.js:773 +#: app/scripts/services/tools.js:920 msgid "Collection {{name}} added" msgstr "Collection {{name}} added" -#: app/scripts/services/tools.js:767 +#: app/scripts/services/tools.js:914 msgid "Collection {{name}} not replaced" msgstr "Collection {{name}} not replaced" -#: app/scripts/services/tools.js:883 +#: app/scripts/services/tools.js:1030 msgid "Collection {{name}} removed" msgstr "Collection {{name}} removed" -#: app/scripts/services/tools.js:763 +#: app/scripts/services/tools.js:910 msgid "Collection {{name}} replaced" msgstr "Collection {{name}} replaced" -#: app/scripts/controllers/menu.js:442 +#: app/scripts/controllers/menu.js:476 msgid "Collection {{name}} selected" msgstr "Collection {{name}} selected" -#: app/views/menu.html:263 +#: app/views/menu.html:272 msgid "Collections" msgstr "Collections" -#: app/views/menu.html:309 +#: app/views/menu.html:318 msgid "Community forum" msgstr "Community forum" -#: app/views/menu.html:335 +#: app/views/menu.html:344 msgid "Constant" msgstr "Constant" -#: app/scripts/services/project.js:106 +#: app/scripts/services/project.js:108 msgid "Convert" msgstr "Convert" -#: app/views/menu.html:91 +#: app/views/menu.html:104 msgid "Copy" msgstr "Copy" -#: app/views/menu.html:88 +#: app/views/menu.html:101 msgid "Cut" msgstr "Cut" -#: app/views/menu.html:159 +#: app/views/menu.html:167 msgid "Datasheet" msgstr "Datasheet" -#: app/views/menu.html:190 +#: app/views/menu.html:199 msgid "Default" msgstr "Default" -#: app/scripts/services/tools.js:481 +#: app/scripts/services/tools.js:603 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" @@ -209,43 +227,43 @@ msgstr "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" -#: app/scripts/services/utils.js:534 +#: app/scripts/services/utils.js:532 msgid "Description" msgstr "Description" -#: app/views/menu.html:126 app/views/menu.html:256 +#: app/views/menu.html:138 app/views/menu.html:265 msgid "Disable" msgstr "Disable" -#: app/scripts/controllers/menu.js:237 +#: app/scripts/controllers/menu.js:250 msgid "Do you want to close the application?" msgstr "Do you want to close the application?" -#: app/scripts/controllers/menu.js:523 +#: app/scripts/controllers/menu.js:576 msgid "Do you want to remove the {{name}} collection?" msgstr "Do you want to remove the {{name}} collection?" -#: app/scripts/services/tools.js:759 +#: app/scripts/services/tools.js:906 msgid "Do you want to replace it?" msgstr "Do you want to replace it?" -#: app/views/menu.html:302 +#: app/views/menu.html:311 msgid "Documentation" msgstr "Documentation" -#: app/views/menu.html:247 +#: app/views/menu.html:256 msgid "Drivers" msgstr "Drivers" -#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 +#: app/scripts/services/drivers.js:134 app/scripts/services/drivers.js:72 msgid "Drivers disabled" msgstr "Drivers disabled" -#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 +#: app/scripts/services/drivers.js:126 app/scripts/services/drivers.js:63 msgid "Drivers enabled" msgstr "Drivers enabled" -#: app/scripts/services/tools.js:265 +#: app/scripts/services/tools.js:344 msgid "Duplicated FPGA I/O ports" msgstr "Duplicated FPGA I/O ports" @@ -253,15 +271,15 @@ msgstr "Duplicated FPGA I/O ports" msgid "Duplicated block attributes" msgstr "Duplicated block attributes" -#: app/views/menu.html:78 +#: app/views/menu.html:91 msgid "Edit" msgstr "Edit" -#: app/scripts/services/tools.js:748 +#: app/scripts/services/tools.js:895 msgid "Edit the collection name" msgstr "Edit the collection name" -#: app/views/menu.html:121 app/views/menu.html:251 +#: app/views/menu.html:133 app/views/menu.html:260 msgid "Enable" msgstr "Enable" @@ -293,74 +311,74 @@ msgstr "Enter the output ports" msgid "Enter the parameters" msgstr "Enter the parameters" -#: app/scripts/controllers/menu.js:324 +#: app/scripts/controllers/menu.js:358 msgid "Enter the remote hostname user@host (experimental)" msgstr "Enter the remote hostname user@host (experimental)" -#: app/scripts/services/tools.js:504 +#: app/scripts/services/tools.js:626 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "Error: default toolchain not found in '{{dir}}'" -#: app/scripts/services/utils.js:675 +#: app/scripts/services/utils.js:678 msgid "Error: {{error}}" msgstr "Error: {{error}}" -#: app/scripts/services/tools.js:336 -msgid "Errors detected in the code" -msgstr "Errors detected in the code" +#: app/scripts/services/tools.js:418 +msgid "Errors detected in the design" +msgstr "Errors detected in the design" -#: app/views/menu.html:39 +#: app/views/menu.html:42 msgid "Examples" msgstr "Examples" -#: app/scripts/services/tools.js:206 +#: app/scripts/services/tools.js:275 msgid "Execute remote {{label}} ..." msgstr "Execute remote {{label}} ..." -#: app/views/menu.html:54 +#: app/views/menu.html:57 msgid "Export" msgstr "Export" -#: app/scripts/services/tools.js:637 +#: app/scripts/services/tools.js:762 msgid "Extract default apio files..." msgstr "Extract default apio files..." -#: app/scripts/services/tools.js:647 +#: app/scripts/services/tools.js:772 msgid "Extract default apio packages..." msgstr "Extract default apio packages..." -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:750 msgid "Extract virtual env files..." msgstr "Extract virtual env files..." -#: app/scripts/services/tools.js:262 +#: app/scripts/services/tools.js:341 msgid "FPGA I/O ports not defined" msgstr "FPGA I/O ports not defined" #: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 +#: app/scripts/services/blocks.js:713 app/scripts/services/blocks.js:793 msgid "FPGA pin" msgstr "FPGA pin" -#: app/views/menu.html:26 +#: app/views/menu.html:29 msgid "File" msgstr "File" -#: app/scripts/services/project.js:438 +#: app/scripts/services/project.js:448 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" "File {{file}} already exists in the project path. Do you want to replace it?" -#: app/scripts/services/tools.js:182 +#: app/scripts/services/tools.js:214 msgid "File {{file}} does not exist" msgstr "File {{file}} does not exist" -#: app/scripts/services/project.js:472 +#: app/scripts/services/project.js:482 msgid "File {{file}} imported" msgstr "File {{file}} imported" -#: app/views/menu.html:104 +#: app/views/menu.html:114 msgid "Fit content" msgstr "Fit content" @@ -368,112 +386,112 @@ msgstr "Fit content" msgid "French" msgstr "French" -#: app/scripts/controllers/menu.js:216 -msgid "GTKWave exported" -msgstr "GTKWave exported" - #: app/views/languages.html:16 msgid "Galician" msgstr "Galician" -#: app/views/menu.html:292 +#: app/views/menu.html:301 msgid "Help" msgstr "Help" -#: app/scripts/services/utils.js:548 +#: app/scripts/services/utils.js:546 msgid "Image" msgstr "Image" -#: app/scripts/controllers/menu.js:683 +#: app/scripts/controllers/menu.js:735 msgid "Image {{name}} saved" msgstr "Image {{name}} saved" -#: app/views/menu.html:341 +#: app/views/menu.html:350 msgid "Information" msgstr "Information" -#: app/views/menu.html:329 +#: app/views/menu.html:338 msgid "Input" msgstr "Input" -#: app/views/menu.html:224 +#: app/views/menu.html:233 msgid "Install" msgstr "Install" -#: app/scripts/services/tools.js:642 +#: app/scripts/services/tools.js:767 msgid "Install default apio..." msgstr "Install default apio..." -#: app/scripts/services/tools.js:691 +#: app/scripts/services/tools.js:816 msgid "Installation completed" msgstr "Installation completed" -#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 +#: app/scripts/services/tools.js:657 app/scripts/services/tools.js:692 msgid "Installing toolchain" msgstr "Installing toolchain" -#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 +#: app/scripts/services/drivers.js:118 app/scripts/services/tools.js:731 msgid "Internet connection required" msgstr "Internet connection required" -#: app/scripts/services/graph.js:179 +#: app/scripts/services/graph.js:178 msgid "Invalid Pull up connection:
    block already connected" msgstr "Invalid Pull up connection:
    block already connected" -#: app/scripts/services/graph.js:193 +#: app/scripts/services/graph.js:192 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "Invalid Pull up connection:
    only Input blocks allowed" -#: app/scripts/services/graph.js:185 +#: app/scripts/services/graph.js:184 msgid "Invalid block connection:
    Pull up already connected" msgstr "Invalid block connection:
    Pull up already connected" -#: app/scripts/services/tools.js:779 +#: app/scripts/services/tools.js:926 msgid "Invalid collection {{name}}" msgstr "Invalid collection {{name}}" -#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 -#: app/scripts/services/graph.js:157 +#: app/scripts/services/graph.js:142 app/scripts/services/graph.js:149 +#: app/scripts/services/graph.js:156 msgid "Invalid connection" msgstr "Invalid connection" -#: app/scripts/services/graph.js:212 +#: app/scripts/services/graph.js:211 msgid "Invalid connection: {{a}} → {{b}}" msgstr "Invalid connection: {{a}} → {{b}}" -#: app/scripts/services/graph.js:173 +#: app/scripts/services/graph.js:172 msgid "Invalid multiple input connections" msgstr "Invalid multiple input connections" -#: app/scripts/services/drivers.js:190 +#: app/scripts/services/utils.js:259 +msgid "Invalid project format" +msgstr "Invalid project format" + +#: app/scripts/services/drivers.js:196 msgid "It is recommended to use USB 2.0 ports" msgstr "It is recommended to use USB 2.0 ports" -#: app/views/menu.html:134 +#: app/views/menu.html:121 msgid "Language" msgstr "Language" -#: app/scripts/services/project.js:105 +#: app/scripts/services/project.js:107 msgid "Load" msgstr "Load" -#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:866 msgid "Local parameter" msgstr "Local parameter" -#: app/scripts/services/tools.js:630 +#: app/scripts/services/tools.js:755 msgid "Make virtual env..." msgstr "Make virtual env..." -#: app/scripts/services/utils.js:755 +#: app/scripts/services/utils.js:758 msgid "Maximum bus size: 96 bits" msgstr "Maximum bus size: 96 bits" -#: app/scripts/services/utils.js:532 +#: app/scripts/services/utils.js:530 msgid "Name" msgstr "Name" -#: app/views/menu.html:29 +#: app/views/menu.html:32 msgid "New" msgstr "New" @@ -481,131 +499,128 @@ msgstr "New" msgid "New project {{name}} created" msgstr "New project {{name}} created" -#: app/scripts/controllers/menu.js:541 +#: app/scripts/controllers/menu.js:594 msgid "No collections stored" msgstr "No collections stored" -#: app/scripts/controllers/main.js:15 app/scripts/services/project.js:143 +#: app/scripts/controllers/main.js:15 app/scripts/controllers/menu.js:260 +#: app/scripts/services/project.js:145 msgid "OK" msgstr "OK" -#: app/scripts/services/project.js:377 app/scripts/services/project.js:99 +#: app/scripts/services/project.js:101 app/scripts/services/project.js:384 msgid "Old project format {{version}}" msgstr "Old project format {{version}}" -#: app/views/menu.html:32 +#: app/views/menu.html:35 msgid "Open" msgstr "Open" -#: app/scripts/services/utils.js:555 +#: app/scripts/services/utils.js:553 msgid "Open SVG" msgstr "Open SVG" -#: app/scripts/services/project.js:475 +#: app/scripts/services/project.js:485 msgid "Original file {{file}} does not exist" msgstr "Original file {{file}} does not exist" -#: app/views/menu.html:332 +#: app/views/menu.html:341 msgid "Output" msgstr "Output" -#: app/scripts/controllers/menu.js:198 -msgid "PCF file exported" -msgstr "PCF file exported" - -#: app/views/menu.html:94 +#: app/views/menu.html:107 msgid "Paste" msgstr "Paste" -#: app/scripts/services/utils.js:884 +#: app/scripts/services/utils.js:887 msgid "Please run: {{cmd}}" msgstr "Please run: {{cmd}}" -#: app/views/menu.html:108 +#: app/views/menu.html:118 msgid "Preferences" msgstr "Preferences" -#: app/views/menu.html:111 +#: app/views/menu.html:152 msgid "Project information" msgstr "Project information" -#: app/scripts/services/project.js:131 +#: app/scripts/controllers/menu.js:326 app/scripts/controllers/menu.js:340 +msgid "Project information updated" +msgstr "Project information updated" + +#: app/scripts/services/project.js:133 msgid "Project {{name}} loaded" msgstr "Project {{name}} loaded" -#: app/scripts/services/project.js:346 +#: app/scripts/services/project.js:349 msgid "Project {{name}} saved" msgstr "Project {{name}} saved" -#: app/scripts/services/tools.js:618 +#: app/scripts/services/tools.js:744 msgid "Python 2.7 is required" msgstr "Python 2.7 is required" -#: app/views/menu.html:72 +#: app/views/menu.html:85 msgid "Quit" msgstr "Quit" -#: app/scripts/services/blocks.js:948 app/views/design.html:5 +#: app/scripts/services/blocks.js:950 app/views/design.html:5 msgid "Read only" msgstr "Read only" -#: app/views/menu.html:84 +#: app/views/menu.html:97 msgid "Redo" msgstr "Redo" -#: app/scripts/services/tools.js:368 +#: app/scripts/services/tools.js:453 msgid "Remote host {{name}} not connected" msgstr "Remote host {{name}} not connected" -#: app/views/menu.html:140 +#: app/views/menu.html:145 msgid "Remote hostname" msgstr "Remote hostname" -#: app/views/menu.html:232 app/views/menu.html:271 +#: app/views/menu.html:241 app/views/menu.html:280 msgid "Remove" msgstr "Remove" -#: app/views/menu.html:283 +#: app/views/menu.html:292 msgid "Remove all" msgstr "Remove all" -#: app/scripts/services/utils.js:557 +#: app/scripts/services/utils.js:555 msgid "Reset SVG" msgstr "Reset SVG" -#: app/views/menu.html:237 +#: app/views/menu.html:246 msgid "Reset default" msgstr "Reset default" -#: app/views/menu.html:101 -msgid "Reset view" -msgstr "Reset view" - -#: app/views/menu.html:47 +#: app/views/menu.html:50 msgid "Save" msgstr "Save" -#: app/scripts/services/utils.js:556 +#: app/scripts/services/utils.js:554 msgid "Save SVG" msgstr "Save SVG" -#: app/views/menu.html:50 +#: app/views/menu.html:53 msgid "Save as" msgstr "Save as" -#: app/views/menu.html:171 +#: app/views/menu.html:180 msgid "Select" msgstr "Select" -#: app/views/menu.html:97 +#: app/views/menu.html:110 msgid "Select all" msgstr "Select all" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:714 msgid "Show clock" msgstr "Show clock" -#: app/views/menu.html:305 +#: app/views/menu.html:314 msgid "Source code" msgstr "Source code" @@ -613,23 +628,31 @@ msgstr "Source code" msgid "Spanish" msgstr "Spanish" -#: app/scripts/services/tools.js:195 +#: app/scripts/controllers/menu.js:530 +msgid "Start build" +msgstr "Start build" + +#: app/scripts/controllers/menu.js:542 +msgid "Start upload" +msgstr "Start upload" + +#: app/scripts/controllers/menu.js:518 +msgid "Start verification" +msgstr "Start verification" + +#: app/scripts/services/tools.js:264 msgid "Synchronize remote files ..." msgstr "Synchronize remote files ..." -#: app/views/menu.html:63 +#: app/views/menu.html:66 msgid "Testbench" msgstr "Testbench" -#: app/scripts/controllers/menu.js:207 -msgid "Testbench exported" -msgstr "Testbench exported" - -#: app/scripts/services/tools.js:758 +#: app/scripts/services/tools.js:905 msgid "The collection {{name}} already exists." msgstr "The collection {{name}} already exists." -#: app/scripts/controllers/menu.js:463 +#: app/scripts/controllers/menu.js:497 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" @@ -637,15 +660,15 @@ msgstr "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" -#: app/scripts/services/tools.js:509 +#: app/scripts/services/tools.js:631 msgid "The toolchain will be removed. Do you want to continue?" msgstr "The toolchain will be removed. Do you want to continue?" -#: app/scripts/services/tools.js:497 +#: app/scripts/services/tools.js:619 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "The toolchain will be restored to default. Do you want to continue?" -#: app/scripts/services/tools.js:489 +#: app/scripts/services/tools.js:611 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" @@ -653,7 +676,7 @@ msgstr "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" -#: app/scripts/services/project.js:400 +#: app/scripts/services/project.js:407 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" @@ -661,87 +684,95 @@ msgstr "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" -#: app/scripts/services/project.js:109 +#: app/scripts/services/project.js:111 msgid "This project is designed for the {{name}} board." msgstr "This project is designed for the {{name}} board." -#: app/views/menu.html:220 +#: app/views/menu.html:229 msgid "Toolchain" msgstr "Toolchain" -#: app/scripts/services/tools.js:692 +#: app/scripts/services/tools.js:818 msgid "Toolchain installed" msgstr "Toolchain installed" -#: app/scripts/services/tools.js:695 +#: app/scripts/services/drivers.js:203 app/scripts/services/drivers.js:225 +#: app/scripts/services/tools.js:132 app/scripts/services/tools.js:834 msgid "Toolchain not installed" msgstr "Toolchain not installed" -#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 -#: app/scripts/services/tools.js:94 -msgid "Toolchain not installed. Please, install the toolchain" -msgstr "Toolchain not installed. Please, install the toolchain" - -#: app/scripts/services/tools.js:514 +#: app/scripts/services/tools.js:636 msgid "Toolchain removed" msgstr "Toolchain removed" -#: app/views/menu.html:207 +#: app/scripts/services/tools.js:246 +msgid "Toolchain version does not match" +msgstr "Toolchain version does not match" + +#: app/views/menu.html:216 msgid "Tools" msgstr "Tools" -#: app/views/menu.html:81 +#: app/views/menu.html:94 msgid "Undo" msgstr "Undo" -#: app/scripts/services/tools.js:257 +#: app/scripts/services/tools.js:336 msgid "Unknown board" msgstr "Unknown board" -#: app/scripts/app.js:44 +#: app/scripts/app.js:48 msgid "Untitled" msgstr "Untitled" -#: app/views/menu.html:227 +#: app/views/menu.html:236 msgid "Update" msgstr "Update" -#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 -#: app/scripts/services/blocks.js:863 +#: app/scripts/services/blocks.js:712 app/scripts/services/blocks.js:792 +#: app/scripts/services/blocks.js:865 msgid "Update the block name" msgstr "Update the block name" -#: app/views/menu.html:216 +#: app/views/menu.html:225 msgid "Upload" msgstr "Upload" -#: app/views/menu.html:210 +#: app/scripts/controllers/menu.js:543 +msgid "Upload done" +msgstr "Upload done" + +#: app/scripts/controllers/menu.js:519 +msgid "Verification done" +msgstr "Verification done" + +#: app/views/menu.html:219 msgid "Verify" msgstr "Verify" -#: app/scripts/controllers/menu.js:189 -msgid "Verilog code exported" -msgstr "Verilog code exported" - -#: app/scripts/services/utils.js:533 app/views/menu.html:298 +#: app/scripts/services/utils.js:531 app/views/menu.html:307 msgid "Version" msgstr "Version" -#: app/views/menu.html:150 +#: app/views/menu.html:158 msgid "View" msgstr "View" -#: app/views/menu.html:295 +#: app/views/menu.html:304 msgid "View license" msgstr "View license" +#: app/scripts/services/tools.js:421 +msgid "Warnings detected in the design" +msgstr "Warnings detected in the design" + #: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Wrong block format: {{type}}" #: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 -#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:783 +#: app/scripts/services/blocks.js:857 app/scripts/services/blocks.js:892 msgid "Wrong block name {{name}}" msgstr "Wrong block name {{name}}" @@ -753,19 +784,19 @@ msgstr "Wrong parameter name {{name}}" msgid "Wrong port name {{name}}" msgstr "Wrong port name {{name}}" -#: app/scripts/services/project.js:139 +#: app/scripts/services/project.js:141 msgid "Wrong project format: {{name}}" msgstr "Wrong project format: {{name}}" -#: app/scripts/services/tools.js:365 +#: app/scripts/services/tools.js:450 msgid "Wrong remote hostname {{name}}" msgstr "Wrong remote hostname {{name}}" -#: app/scripts/services/project.js:110 +#: app/scripts/services/project.js:112 msgid "You can load it as it is or convert it for the {{name}} board." msgstr "You can load it as it is or convert it for the {{name}} board." -#: app/scripts/controllers/menu.js:238 +#: app/scripts/controllers/menu.js:251 msgid "Your changes will be lost if you don’t save them" msgstr "Your changes will be lost if you don’t save them" @@ -773,52 +804,65 @@ msgstr "Your changes will be lost if you don’t save them" msgid "back" msgstr "back" -#. Build done -#: app/scripts/services/tools.js:380 -msgid "done_build" -msgstr "Build done" - -#. Upload done -#: app/scripts/services/tools.js:382 -msgid "done_upload" -msgstr "Upload done" - -#. Verification done -#: app/scripts/services/tools.js:378 -msgid "done_verify" -msgstr "Verification done" - -#. Start building ... -#: app/scripts/services/tools.js:61 -msgid "start_build" -msgstr "Start building ..." - -#. Start uploading ... -#: app/scripts/services/tools.js:63 -msgid "start_upload" -msgstr "Start uploading ..." - -#. Start verification ... -#: app/scripts/services/tools.js:59 -msgid "start_verify" -msgstr "Start verification ..." - -#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:859 +#: app/scripts/services/drivers.js:109 app/scripts/services/utils.js:862 msgid "{{app}} is required." msgstr "{{app}} is required." -#: app/scripts/controllers/menu.js:396 +#: app/scripts/controllers/menu.js:430 msgid "{{board}} datasheet not defined" msgstr "{{board}} datasheet not defined" -#: app/scripts/controllers/menu.js:386 +#: app/scripts/controllers/menu.js:420 msgid "{{board}} pinout not defined" msgstr "{{board}} pinout not defined" -#: app/scripts/controllers/menu.js:415 +#: app/scripts/controllers/menu.js:449 msgid "{{board}} rules not defined" msgstr "{{board}} rules not defined" +#: app/scripts/controllers/menu.js:201 app/scripts/controllers/menu.js:224 +msgid "{{name}} exported" +msgstr "{{name}} exported" + +#~ msgid "Errors detected in the code" +#~ msgstr "Errors detected in the code" + +#~ msgid "GTKWave exported" +#~ msgstr "GTKWave exported" + +#~ msgid "PCF file exported" +#~ msgstr "PCF file exported" + +#~ msgid "Reset view" +#~ msgstr "Reset view" + +#~ msgid "Testbench exported" +#~ msgstr "Testbench exported" + +#~ msgid "Toolchain not installed. Please, install the toolchain" +#~ msgstr "Toolchain not installed. Please, install the toolchain" + +#~ msgid "Verilog code exported" +#~ msgstr "Verilog code exported" + +#~ msgid "done_build" +#~ msgstr "Build done" + +#~ msgid "done_upload" +#~ msgstr "Upload done" + +#~ msgid "done_verify" +#~ msgstr "Verification done" + +#~ msgid "start_build" +#~ msgstr "Start building ..." + +#~ msgid "start_upload" +#~ msgstr "Start uploading ..." + +#~ msgid "start_verify" +#~ msgstr "Start verification ..." + #~ msgid "Do you want to convert it?" #~ msgstr "Do you want to convert it?" diff --git a/app/resources/locale/es_ES/es_ES.po b/app/resources/locale/es_ES/es_ES.po index 346c9727b..41cf483e5 100644 --- a/app/resources/locale/es_ES/es_ES.po +++ b/app/resources/locale/es_ES/es_ES.po @@ -12,11 +12,11 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 +#: app/scripts/services/drivers.js:211 app/scripts/services/drivers.js:87 msgid "Unplug and reconnect the board" msgstr "Desconecta y conecta la placa" -#: app/scripts/services/drivers.js:189 +#: app/scripts/services/drivers.js:195 msgid "" "

    FTDI driver installation instructions

    1. Connect the FPGA " "board
    2. Replace the (Interface 0) driver of the board by " @@ -26,7 +26,7 @@ msgstr "" "placa FPGA
    3. Reemplaza el driver de la (Interface 0) de la " "placa por libusbK
    4. Desconecta y conecta la placa
    " -#: app/scripts/services/drivers.js:207 +#: app/scripts/services/drivers.js:218 msgid "" "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB " "Device
    2. Select the board interface and uninstall the driver
    " @@ -35,35 +35,35 @@ msgstr "" "dispositivo USB FPGA
  • Selecciona la interfaz de la placa y desinstala " "el driver
  • " -#: app/views/menu.html:313 +#: app/views/menu.html:322 msgid "About Icestudio" msgstr "Sobre Icestudio" -#: app/views/menu.html:267 +#: app/views/menu.html:276 msgid "Add" msgstr "Añadir" -#: app/scripts/controllers/menu.js:511 +#: app/scripts/controllers/menu.js:562 msgid "Add a block to start" msgstr "Añade un bloque para comenzar" -#: app/views/menu.html:43 +#: app/views/menu.html:46 msgid "Add as block" msgstr "Añadir como bloque" -#: app/scripts/services/tools.js:889 +#: app/scripts/services/tools.js:1036 msgid "All collections removed" msgstr "Colecciones eliminadas" -#: app/scripts/controllers/menu.js:533 +#: app/scripts/controllers/menu.js:586 msgid "All stored collections will be lost. Do you want to continue?" msgstr "Todas las colecciones almacenadas se perderán. ¿Deseas continuar?" -#: app/scripts/services/utils.js:535 +#: app/scripts/services/utils.js:533 msgid "Author" msgstr "Autor" -#: app/views/menu.html:324 +#: app/views/menu.html:333 msgid "Basic" msgstr "Básico" @@ -71,50 +71,54 @@ msgstr "Básico" msgid "Basque" msgstr "Euskera" -#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 -#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 -#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:928 -#: app/scripts/services/blocks.js:962 +#: app/scripts/services/blocks.js:757 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:833 app/scripts/services/blocks.js:852 +#: app/scripts/services/blocks.js:887 app/scripts/services/blocks.js:930 +#: app/scripts/services/blocks.js:965 msgid "Block updated" msgstr "Bloque actualizado" -#: app/scripts/services/project.js:426 +#: app/scripts/services/project.js:433 msgid "Block {{name}} imported" msgstr "Bloque {{name}} importado" -#: app/views/menu.html:35 +#: app/views/menu.html:38 msgid "Blocks" msgstr "Bloques" -#: app/views/menu.html:174 +#: app/views/menu.html:183 msgid "Board" msgstr "Placa" -#: app/views/menu.html:115 app/views/menu.html:162 +#: app/views/menu.html:127 app/views/menu.html:170 msgid "Board rules" msgstr "Reglas de la placa" -#: app/scripts/controllers/menu.js:337 +#: app/scripts/controllers/menu.js:371 msgid "Board rules disabled" msgstr "Reglas de la placa deshabilitadas" -#: app/scripts/controllers/menu.js:332 +#: app/scripts/controllers/menu.js:366 msgid "Board rules enabled" msgstr "Reglas de la placa habilitadas" -#: app/scripts/services/tools.js:254 +#: app/scripts/services/tools.js:333 msgid "Board {{name}} not detected" msgstr "Placa {{name}} no detectada" -#: app/scripts/controllers/menu.js:476 +#: app/scripts/controllers/menu.js:510 msgid "Board {{name}} selected" msgstr "Placa {{name}} seleccionada" -#: app/views/menu.html:213 +#: app/views/menu.html:222 msgid "Build" msgstr "Sintetizar" -#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:144 +#: app/scripts/controllers/menu.js:531 +msgid "Build done" +msgstr "Sintetizado realizado" + +#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:146 msgid "Cancel" msgstr "Cancelar" @@ -122,87 +126,101 @@ msgstr "Cancelar" msgid "Catalan" msgstr "Catalán" -#: app/scripts/services/tools.js:605 +#: app/scripts/services/tools.js:727 msgid "Check Internet connection..." msgstr "Comprobando conexión a Internet..." -#: app/scripts/services/tools.js:613 +#: app/scripts/services/tools.js:737 msgid "Check Python..." msgstr "Comprobando Python..." -#: app/scripts/services/drivers.js:104 +#: app/scripts/services/tools.js:819 +msgid "Click here to setup the drivers" +msgstr "Haz clic aquí para configurar los drivers" + +#: app/scripts/services/drivers.js:110 app/scripts/services/drivers.js:203 +#: app/scripts/services/drivers.js:225 app/scripts/services/tools.js:132 +#: app/scripts/services/tools.js:246 msgid "Click here to install it" -msgstr "Haga clic aquí para instalarlo" +msgstr "Haz clic aquí para instalarlo" -#: app/views/menu.html:338 +#: app/scripts/controllers/menu.js:326 +msgid "Click here to view" +msgstr "Haz clic aquí para ver" + +#: app/scripts/controllers/menu.js:247 +msgid "Close" +msgstr "Cerrar" + +#: app/views/menu.html:347 msgid "Code" msgstr "Código" -#: app/views/menu.html:185 +#: app/views/menu.html:194 msgid "Collection" msgstr "Colección" -#: app/views/menu.html:165 +#: app/views/menu.html:174 msgid "Collection info" msgstr "Información de la colección" -#: app/scripts/controllers/menu.js:434 +#: app/scripts/controllers/menu.js:468 msgid "Collection {{collection}} info not defined" msgstr "Información de la colección {{collection}} no definida" -#: app/scripts/services/tools.js:773 +#: app/scripts/services/tools.js:920 msgid "Collection {{name}} added" msgstr "Colección {{name}} añadida" -#: app/scripts/services/tools.js:767 +#: app/scripts/services/tools.js:914 msgid "Collection {{name}} not replaced" msgstr "Colección {{name}} no reemplazada" -#: app/scripts/services/tools.js:883 +#: app/scripts/services/tools.js:1030 msgid "Collection {{name}} removed" msgstr "Colección {{name}} eliminada" -#: app/scripts/services/tools.js:763 +#: app/scripts/services/tools.js:910 msgid "Collection {{name}} replaced" msgstr "Colección {{name}} reemplazada" -#: app/scripts/controllers/menu.js:442 +#: app/scripts/controllers/menu.js:476 msgid "Collection {{name}} selected" msgstr "Colección {{name}} seleccionada" -#: app/views/menu.html:263 +#: app/views/menu.html:272 msgid "Collections" msgstr "Colecciones" -#: app/views/menu.html:309 +#: app/views/menu.html:318 msgid "Community forum" msgstr "Foro de la comunidad" -#: app/views/menu.html:335 +#: app/views/menu.html:344 msgid "Constant" msgstr "Constante" -#: app/scripts/services/project.js:106 +#: app/scripts/services/project.js:108 msgid "Convert" msgstr "Convertir" -#: app/views/menu.html:91 +#: app/views/menu.html:104 msgid "Copy" msgstr "Copiar" -#: app/views/menu.html:88 +#: app/views/menu.html:101 msgid "Cut" msgstr "Cortar" -#: app/views/menu.html:159 +#: app/views/menu.html:167 msgid "Datasheet" msgstr "Datasheet" -#: app/views/menu.html:190 +#: app/views/menu.html:199 msgid "Default" msgstr "Por defecto" -#: app/scripts/services/tools.js:481 +#: app/scripts/services/tools.js:603 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" @@ -210,43 +228,43 @@ msgstr "" "No se encuentra la toolchain por defecto, por lo que será descargada. Esta " "operación requiere conexión a Internet. ¿Deseas continuar?" -#: app/scripts/services/utils.js:534 +#: app/scripts/services/utils.js:532 msgid "Description" msgstr "Descripción" -#: app/views/menu.html:126 app/views/menu.html:256 +#: app/views/menu.html:138 app/views/menu.html:265 msgid "Disable" msgstr "Deshabilitar" -#: app/scripts/controllers/menu.js:237 +#: app/scripts/controllers/menu.js:250 msgid "Do you want to close the application?" msgstr "¿Deseas cerrar la aplicación?" -#: app/scripts/controllers/menu.js:523 +#: app/scripts/controllers/menu.js:576 msgid "Do you want to remove the {{name}} collection?" msgstr "¿Deseas eliminar la colección {{name}}?" -#: app/scripts/services/tools.js:759 +#: app/scripts/services/tools.js:906 msgid "Do you want to replace it?" msgstr "¿Deseas reemplazarla?" -#: app/views/menu.html:302 +#: app/views/menu.html:311 msgid "Documentation" msgstr "Documentación" -#: app/views/menu.html:247 +#: app/views/menu.html:256 msgid "Drivers" msgstr "Drivers" -#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 +#: app/scripts/services/drivers.js:134 app/scripts/services/drivers.js:72 msgid "Drivers disabled" msgstr "Drivers deshabilitados" -#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 +#: app/scripts/services/drivers.js:126 app/scripts/services/drivers.js:63 msgid "Drivers enabled" msgstr "Drivers habilitados" -#: app/scripts/services/tools.js:265 +#: app/scripts/services/tools.js:344 msgid "Duplicated FPGA I/O ports" msgstr "Puertos E/S de la FPGA duplicados" @@ -254,15 +272,15 @@ msgstr "Puertos E/S de la FPGA duplicados" msgid "Duplicated block attributes" msgstr "Atributos del bloque duplicados" -#: app/views/menu.html:78 +#: app/views/menu.html:91 msgid "Edit" msgstr "Editar" -#: app/scripts/services/tools.js:748 +#: app/scripts/services/tools.js:895 msgid "Edit the collection name" msgstr "Edita el nombre de la colección" -#: app/views/menu.html:121 app/views/menu.html:251 +#: app/views/menu.html:133 app/views/menu.html:260 msgid "Enable" msgstr "Habilitar" @@ -294,75 +312,75 @@ msgstr "Introduce los puertos de salida" msgid "Enter the parameters" msgstr "Introduce los parámetros" -#: app/scripts/controllers/menu.js:324 +#: app/scripts/controllers/menu.js:358 msgid "Enter the remote hostname user@host (experimental)" msgstr "Introduce el nombre del host remoto usuario@host (experimental)" -#: app/scripts/services/tools.js:504 +#: app/scripts/services/tools.js:626 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "Error: toolchain por defecto no encontrada en '{{dir}}'" -#: app/scripts/services/utils.js:675 +#: app/scripts/services/utils.js:678 msgid "Error: {{error}}" msgstr "Error: {{error}}" -#: app/scripts/services/tools.js:336 -msgid "Errors detected in the code" -msgstr "Errores detectados en el código" +#: app/scripts/services/tools.js:418 +msgid "Errors detected in the design" +msgstr "Errores detectados en el diseño" -#: app/views/menu.html:39 +#: app/views/menu.html:42 msgid "Examples" msgstr "Ejemplos" -#: app/scripts/services/tools.js:206 +#: app/scripts/services/tools.js:275 msgid "Execute remote {{label}} ..." msgstr "Ejecutar {{label}} remoto ..." -#: app/views/menu.html:54 +#: app/views/menu.html:57 msgid "Export" msgstr "Exportar" -#: app/scripts/services/tools.js:637 +#: app/scripts/services/tools.js:762 msgid "Extract default apio files..." msgstr "Extraer ficheros de apio..." -#: app/scripts/services/tools.js:647 +#: app/scripts/services/tools.js:772 msgid "Extract default apio packages..." msgstr "Extraer paquetes de apio..." -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:750 msgid "Extract virtual env files..." msgstr "Extraer ficheros del virtual env" -#: app/scripts/services/tools.js:262 +#: app/scripts/services/tools.js:341 msgid "FPGA I/O ports not defined" msgstr "Puertos E/S de la FPGA no definidos" #: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 +#: app/scripts/services/blocks.js:713 app/scripts/services/blocks.js:793 msgid "FPGA pin" msgstr "FPGA pin" -#: app/views/menu.html:26 +#: app/views/menu.html:29 msgid "File" msgstr "Archivo" -#: app/scripts/services/project.js:438 +#: app/scripts/services/project.js:448 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" "El archivo {{file}} ya existe en el directorio del proyecto. ¿Deseas " "reemplazarlo?" -#: app/scripts/services/tools.js:182 +#: app/scripts/services/tools.js:214 msgid "File {{file}} does not exist" msgstr "El archivo {{file}} no existe" -#: app/scripts/services/project.js:472 +#: app/scripts/services/project.js:482 msgid "File {{file}} imported" msgstr "Archivo {{file}} importado" -#: app/views/menu.html:104 +#: app/views/menu.html:114 msgid "Fit content" msgstr "Ajustar contenido" @@ -370,114 +388,114 @@ msgstr "Ajustar contenido" msgid "French" msgstr "Francés" -#: app/scripts/controllers/menu.js:216 -msgid "GTKWave exported" -msgstr "GTKWave exportado" - #: app/views/languages.html:16 msgid "Galician" msgstr "Gallego" -#: app/views/menu.html:292 +#: app/views/menu.html:301 msgid "Help" msgstr "Ayuda" -#: app/scripts/services/utils.js:548 +#: app/scripts/services/utils.js:546 msgid "Image" msgstr "Imagen" -#: app/scripts/controllers/menu.js:683 +#: app/scripts/controllers/menu.js:735 msgid "Image {{name}} saved" msgstr "Imagen {{name}} guardada" -#: app/views/menu.html:341 +#: app/views/menu.html:350 msgid "Information" msgstr "Información" -#: app/views/menu.html:329 +#: app/views/menu.html:338 msgid "Input" msgstr "Entrada" -#: app/views/menu.html:224 +#: app/views/menu.html:233 msgid "Install" msgstr "Instalar" -#: app/scripts/services/tools.js:642 +#: app/scripts/services/tools.js:767 msgid "Install default apio..." msgstr "Instalar apio..." -#: app/scripts/services/tools.js:691 +#: app/scripts/services/tools.js:816 msgid "Installation completed" msgstr "Instalación completada" -#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 +#: app/scripts/services/tools.js:657 app/scripts/services/tools.js:692 msgid "Installing toolchain" msgstr "Instalando la toolchain" -#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 +#: app/scripts/services/drivers.js:118 app/scripts/services/tools.js:731 msgid "Internet connection required" msgstr "Es necesario conexión a Internet" -#: app/scripts/services/graph.js:179 +#: app/scripts/services/graph.js:178 msgid "Invalid Pull up connection:
    block already connected" msgstr "Conexión de Pull up no válida:
    hay un bloque conectado" -#: app/scripts/services/graph.js:193 +#: app/scripts/services/graph.js:192 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" "Conexión de Pull up no válida:
    sólo se permiten bloques " "Entrada" -#: app/scripts/services/graph.js:185 +#: app/scripts/services/graph.js:184 msgid "Invalid block connection:
    Pull up already connected" msgstr "Conexión de bloque no válida:
    hay un Pull up conectado" -#: app/scripts/services/tools.js:779 +#: app/scripts/services/tools.js:926 msgid "Invalid collection {{name}}" msgstr "Colección {{name}} no válida" -#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 -#: app/scripts/services/graph.js:157 +#: app/scripts/services/graph.js:142 app/scripts/services/graph.js:149 +#: app/scripts/services/graph.js:156 msgid "Invalid connection" msgstr "Conexión no válida" -#: app/scripts/services/graph.js:212 +#: app/scripts/services/graph.js:211 msgid "Invalid connection: {{a}} → {{b}}" msgstr "Conexión no válida: {{a}} → {{b}}" -#: app/scripts/services/graph.js:173 +#: app/scripts/services/graph.js:172 msgid "Invalid multiple input connections" msgstr "Conexiones de entrada múltiple no válidas" -#: app/scripts/services/drivers.js:190 +#: app/scripts/services/utils.js:259 +msgid "Invalid project format" +msgstr "Formato de proyecto no válido" + +#: app/scripts/services/drivers.js:196 msgid "It is recommended to use USB 2.0 ports" msgstr "Se recomienda utilizar puertos USB 2.0" -#: app/views/menu.html:134 +#: app/views/menu.html:121 msgid "Language" msgstr "Idioma" -#: app/scripts/services/project.js:105 +#: app/scripts/services/project.js:107 msgid "Load" msgstr "Cargar" -#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:866 msgid "Local parameter" msgstr "Parámetro local" -#: app/scripts/services/tools.js:630 +#: app/scripts/services/tools.js:755 msgid "Make virtual env..." msgstr "Crear virtual env..." -#: app/scripts/services/utils.js:755 +#: app/scripts/services/utils.js:758 msgid "Maximum bus size: 96 bits" msgstr "Tamaño máximo del bus: 96 bits" -#: app/scripts/services/utils.js:532 +#: app/scripts/services/utils.js:530 msgid "Name" msgstr "Nombre" -#: app/views/menu.html:29 +#: app/views/menu.html:32 msgid "New" msgstr "Nuevo" @@ -485,131 +503,128 @@ msgstr "Nuevo" msgid "New project {{name}} created" msgstr "Nuevo proyecto {{name}} creado" -#: app/scripts/controllers/menu.js:541 +#: app/scripts/controllers/menu.js:594 msgid "No collections stored" msgstr "Ninguna colección almacenada" -#: app/scripts/controllers/main.js:15 app/scripts/services/project.js:143 +#: app/scripts/controllers/main.js:15 app/scripts/controllers/menu.js:260 +#: app/scripts/services/project.js:145 msgid "OK" msgstr "OK" -#: app/scripts/services/project.js:377 app/scripts/services/project.js:99 +#: app/scripts/services/project.js:101 app/scripts/services/project.js:384 msgid "Old project format {{version}}" msgstr "Formato de proyecto antiguo {{version}}" -#: app/views/menu.html:32 +#: app/views/menu.html:35 msgid "Open" msgstr "Abrir" -#: app/scripts/services/utils.js:555 +#: app/scripts/services/utils.js:553 msgid "Open SVG" msgstr "Abrir SVG" -#: app/scripts/services/project.js:475 +#: app/scripts/services/project.js:485 msgid "Original file {{file}} does not exist" msgstr "El archivo original {{file}} no existe" -#: app/views/menu.html:332 +#: app/views/menu.html:341 msgid "Output" msgstr "Salida" -#: app/scripts/controllers/menu.js:198 -msgid "PCF file exported" -msgstr "Fichero PCF exportado" - -#: app/views/menu.html:94 +#: app/views/menu.html:107 msgid "Paste" msgstr "Pegar" -#: app/scripts/services/utils.js:884 +#: app/scripts/services/utils.js:887 msgid "Please run: {{cmd}}" msgstr "Por favor ejecuta: {{cmd}}" -#: app/views/menu.html:108 +#: app/views/menu.html:118 msgid "Preferences" msgstr "Preferencias" -#: app/views/menu.html:111 +#: app/views/menu.html:152 msgid "Project information" msgstr "Información del proyecto" -#: app/scripts/services/project.js:131 +#: app/scripts/controllers/menu.js:326 app/scripts/controllers/menu.js:340 +msgid "Project information updated" +msgstr "Información del proyecto actualizada" + +#: app/scripts/services/project.js:133 msgid "Project {{name}} loaded" msgstr "Proyecto {{name}} cargado" -#: app/scripts/services/project.js:346 +#: app/scripts/services/project.js:349 msgid "Project {{name}} saved" msgstr "Proyecto {{name}} guardado" -#: app/scripts/services/tools.js:618 +#: app/scripts/services/tools.js:744 msgid "Python 2.7 is required" msgstr "Es necesario Python 2.7" -#: app/views/menu.html:72 +#: app/views/menu.html:85 msgid "Quit" msgstr "Salir" -#: app/scripts/services/blocks.js:948 app/views/design.html:5 +#: app/scripts/services/blocks.js:950 app/views/design.html:5 msgid "Read only" msgstr "Solo lectura" -#: app/views/menu.html:84 +#: app/views/menu.html:97 msgid "Redo" msgstr "Rehacer" -#: app/scripts/services/tools.js:368 +#: app/scripts/services/tools.js:453 msgid "Remote host {{name}} not connected" msgstr "Host remoto {{name}} no conectado" -#: app/views/menu.html:140 +#: app/views/menu.html:145 msgid "Remote hostname" msgstr "Nombre del host remoto" -#: app/views/menu.html:232 app/views/menu.html:271 +#: app/views/menu.html:241 app/views/menu.html:280 msgid "Remove" msgstr "Eliminar" -#: app/views/menu.html:283 +#: app/views/menu.html:292 msgid "Remove all" msgstr "Eliminar todo" -#: app/scripts/services/utils.js:557 +#: app/scripts/services/utils.js:555 msgid "Reset SVG" msgstr "Resetear SVG" -#: app/views/menu.html:237 +#: app/views/menu.html:246 msgid "Reset default" msgstr "Reset default" -#: app/views/menu.html:101 -msgid "Reset view" -msgstr "Resetear vista" - -#: app/views/menu.html:47 +#: app/views/menu.html:50 msgid "Save" msgstr "Guardar" -#: app/scripts/services/utils.js:556 +#: app/scripts/services/utils.js:554 msgid "Save SVG" msgstr "Guardar SVG" -#: app/views/menu.html:50 +#: app/views/menu.html:53 msgid "Save as" msgstr "Guardar como" -#: app/views/menu.html:171 +#: app/views/menu.html:180 msgid "Select" msgstr "Seleccionar" -#: app/views/menu.html:97 +#: app/views/menu.html:110 msgid "Select all" msgstr "Seleccionar todo" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:714 msgid "Show clock" msgstr "Mostrar reloj" -#: app/views/menu.html:305 +#: app/views/menu.html:314 msgid "Source code" msgstr "Código fuente" @@ -617,23 +632,31 @@ msgstr "Código fuente" msgid "Spanish" msgstr "Español" -#: app/scripts/services/tools.js:195 +#: app/scripts/controllers/menu.js:530 +msgid "Start build" +msgstr "Comenzar sintetizado" + +#: app/scripts/controllers/menu.js:542 +msgid "Start upload" +msgstr "Comenzar carga" + +#: app/scripts/controllers/menu.js:518 +msgid "Start verification" +msgstr "Comenzar verificación" + +#: app/scripts/services/tools.js:264 msgid "Synchronize remote files ..." msgstr "Sincronizando ficheros remotos ..." -#: app/views/menu.html:63 +#: app/views/menu.html:66 msgid "Testbench" msgstr "Testbench" -#: app/scripts/controllers/menu.js:207 -msgid "Testbench exported" -msgstr "Testbench exportado" - -#: app/scripts/services/tools.js:758 +#: app/scripts/services/tools.js:905 msgid "The collection {{name}} already exists." msgstr "La colección {{name}} ya existe." -#: app/scripts/controllers/menu.js:463 +#: app/scripts/controllers/menu.js:497 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" @@ -641,16 +664,16 @@ msgstr "" "La configuración actual de E/S de la FPGA se perderá. ¿Deseas cambiar a la " "placa {{name}}?" -#: app/scripts/services/tools.js:509 +#: app/scripts/services/tools.js:631 msgid "The toolchain will be removed. Do you want to continue?" msgstr "La toolchain será eliminada. ¿Deseas continuar?" -#: app/scripts/services/tools.js:497 +#: app/scripts/services/tools.js:619 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "" "La toolchain será restaurada a los valores por defecto: ¿Deseas continuar?" -#: app/scripts/services/tools.js:489 +#: app/scripts/services/tools.js:611 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" @@ -658,7 +681,7 @@ msgstr "" "La toolchain será actualizada. Esta operación requiere conexión a Internet. " "¿Deseas continuar?" -#: app/scripts/services/project.js:400 +#: app/scripts/services/project.js:407 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" @@ -666,87 +689,95 @@ msgstr "" "Esta operación de importación requiere una ruta del proyecto. Debes guardar " "el proyecto actual. ¿Deseas continuar?" -#: app/scripts/services/project.js:109 +#: app/scripts/services/project.js:111 msgid "This project is designed for the {{name}} board." msgstr "Este proyecto está diseñado para la placa {{name}}." -#: app/views/menu.html:220 +#: app/views/menu.html:229 msgid "Toolchain" msgstr "Toolchain" -#: app/scripts/services/tools.js:692 +#: app/scripts/services/tools.js:818 msgid "Toolchain installed" msgstr "Toolchain instalada" -#: app/scripts/services/tools.js:695 +#: app/scripts/services/drivers.js:203 app/scripts/services/drivers.js:225 +#: app/scripts/services/tools.js:132 app/scripts/services/tools.js:834 msgid "Toolchain not installed" msgstr "La toolchain no está instalada" -#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 -#: app/scripts/services/tools.js:94 -msgid "Toolchain not installed. Please, install the toolchain" -msgstr "La toolchain no está instalada. Por favor, instala la toolchain" - -#: app/scripts/services/tools.js:514 +#: app/scripts/services/tools.js:636 msgid "Toolchain removed" msgstr "Toolchain eliminada" -#: app/views/menu.html:207 +#: app/scripts/services/tools.js:246 +msgid "Toolchain version does not match" +msgstr "La versión de la toolchain no coincide" + +#: app/views/menu.html:216 msgid "Tools" msgstr "Herramientas" -#: app/views/menu.html:81 +#: app/views/menu.html:94 msgid "Undo" msgstr "Deshacer" -#: app/scripts/services/tools.js:257 +#: app/scripts/services/tools.js:336 msgid "Unknown board" msgstr "Placa desconocida" -#: app/scripts/app.js:44 +#: app/scripts/app.js:48 msgid "Untitled" msgstr "Sin título" -#: app/views/menu.html:227 +#: app/views/menu.html:236 msgid "Update" msgstr "Actualizar" -#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 -#: app/scripts/services/blocks.js:863 +#: app/scripts/services/blocks.js:712 app/scripts/services/blocks.js:792 +#: app/scripts/services/blocks.js:865 msgid "Update the block name" msgstr "Actualiza el nombre del bloque" -#: app/views/menu.html:216 +#: app/views/menu.html:225 msgid "Upload" msgstr "Cargar" -#: app/views/menu.html:210 +#: app/scripts/controllers/menu.js:543 +msgid "Upload done" +msgstr "Carga realizada" + +#: app/scripts/controllers/menu.js:519 +msgid "Verification done" +msgstr "Verificación realizada" + +#: app/views/menu.html:219 msgid "Verify" msgstr "Verificar" -#: app/scripts/controllers/menu.js:189 -msgid "Verilog code exported" -msgstr "Código Verilog exportado" - -#: app/scripts/services/utils.js:533 app/views/menu.html:298 +#: app/scripts/services/utils.js:531 app/views/menu.html:307 msgid "Version" msgstr "Versión" -#: app/views/menu.html:150 +#: app/views/menu.html:158 msgid "View" msgstr "Ver" -#: app/views/menu.html:295 +#: app/views/menu.html:304 msgid "View license" msgstr "Ver licencia" +#: app/scripts/services/tools.js:421 +msgid "Warnings detected in the design" +msgstr "Advertencias detectadas en el diseño" + #: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Formato de bloque incorrecto: {{type}}" #: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 -#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:783 +#: app/scripts/services/blocks.js:857 app/scripts/services/blocks.js:892 msgid "Wrong block name {{name}}" msgstr "Nombre del bloque {{name}} incorrecto" @@ -758,19 +789,19 @@ msgstr "Nombre del parámetro {{name}} incorrecto" msgid "Wrong port name {{name}}" msgstr "Nombre del puerto {{name}} incorrecto" -#: app/scripts/services/project.js:139 +#: app/scripts/services/project.js:141 msgid "Wrong project format: {{name}}" msgstr "Formato de proyecto incorrecto: {{name}}" -#: app/scripts/services/tools.js:365 +#: app/scripts/services/tools.js:450 msgid "Wrong remote hostname {{name}}" msgstr "Nombre del host remoto incorrecto {{name}}" -#: app/scripts/services/project.js:110 +#: app/scripts/services/project.js:112 msgid "You can load it as it is or convert it for the {{name}} board." msgstr "Puedes cargarlo como está o convertirlo para la placa {{name}}." -#: app/scripts/controllers/menu.js:238 +#: app/scripts/controllers/menu.js:251 msgid "Your changes will be lost if you don’t save them" msgstr "Tus cambios se perderán si no los guardas" @@ -778,52 +809,65 @@ msgstr "Tus cambios se perderán si no los guardas" msgid "back" msgstr "volver" -#. Build done -#: app/scripts/services/tools.js:380 -msgid "done_build" -msgstr "Sintetizado realizado" - -#. Upload done -#: app/scripts/services/tools.js:382 -msgid "done_upload" -msgstr "Carga realizada" - -#. Verification done -#: app/scripts/services/tools.js:378 -msgid "done_verify" -msgstr "Verificación realizada" - -#. Start building ... -#: app/scripts/services/tools.js:61 -msgid "start_build" -msgstr "Comenzar sintetizado ..." - -#. Start uploading ... -#: app/scripts/services/tools.js:63 -msgid "start_upload" -msgstr "Comenzar carga ..." - -#. Start verification ... -#: app/scripts/services/tools.js:59 -msgid "start_verify" -msgstr "Comenzar verificación ..." - -#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:859 +#: app/scripts/services/drivers.js:109 app/scripts/services/utils.js:862 msgid "{{app}} is required." msgstr "Es necesario {{app}}." -#: app/scripts/controllers/menu.js:396 +#: app/scripts/controllers/menu.js:430 msgid "{{board}} datasheet not defined" msgstr "{{board}} datasheet no definido" -#: app/scripts/controllers/menu.js:386 +#: app/scripts/controllers/menu.js:420 msgid "{{board}} pinout not defined" msgstr "{{board}} pinout no definido" -#: app/scripts/controllers/menu.js:415 +#: app/scripts/controllers/menu.js:449 msgid "{{board}} rules not defined" msgstr "Reglas de {{board}} no definidas" +#: app/scripts/controllers/menu.js:201 app/scripts/controllers/menu.js:224 +msgid "{{name}} exported" +msgstr "{{name}} exportado" + +#~ msgid "Errors detected in the code" +#~ msgstr "Errores detectados en el código" + +#~ msgid "GTKWave exported" +#~ msgstr "GTKWave exportado" + +#~ msgid "PCF file exported" +#~ msgstr "Fichero PCF exportado" + +#~ msgid "Reset view" +#~ msgstr "Resetear vista" + +#~ msgid "Testbench exported" +#~ msgstr "Testbench exportado" + +#~ msgid "Toolchain not installed. Please, install the toolchain" +#~ msgstr "La toolchain no está instalada. Por favor, instala la toolchain" + +#~ msgid "Verilog code exported" +#~ msgstr "Código Verilog exportado" + +#~ msgid "done_build" +#~ msgstr "Sintetizado realizado" + +#~ msgid "done_upload" +#~ msgstr "Carga realizada" + +#~ msgid "done_verify" +#~ msgstr "Verificación realizada" + +#~ msgid "start_build" +#~ msgstr "Comenzar sintetizado ..." + +#~ msgid "start_upload" +#~ msgstr "Comenzar carga ..." + +#~ msgid "start_verify" +#~ msgstr "Comenzar verificación ..." + #~ msgid "Do you want to convert it?" #~ msgstr "¿Deseas convertirlo?" diff --git a/app/resources/locale/eu_ES/eu_ES.po b/app/resources/locale/eu_ES/eu_ES.po index 8ce913b22..68edcfa8f 100644 --- a/app/resources/locale/eu_ES/eu_ES.po +++ b/app/resources/locale/eu_ES/eu_ES.po @@ -12,11 +12,11 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 +#: app/scripts/services/drivers.js:211 app/scripts/services/drivers.js:87 msgid "Unplug and reconnect the board" msgstr "Txartela deskonektatu eta konekta ezazu berriro" -#: app/scripts/services/drivers.js:189 +#: app/scripts/services/drivers.js:195 msgid "" "

    FTDI driver installation instructions

    1. Connect the FPGA " "board
    2. Replace the (Interface 0) driver of the board by " @@ -27,7 +27,7 @@ msgstr "" "jar ezazu honakoa: libusbK
    3. Txartela deskonektatu eta konekta " "ezazu berriro
    " -#: app/scripts/services/drivers.js:207 +#: app/scripts/services/drivers.js:218 msgid "" "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB " "Device
    2. Select the board interface and uninstall the driver
    " @@ -36,35 +36,35 @@ msgstr "" "gailua bila ezazu
  • Txartelaren interfazea hauta ezazu eta driver-a " "desinstalatu
  • " -#: app/views/menu.html:313 +#: app/views/menu.html:322 msgid "About Icestudio" msgstr "Icestudio-ri buruz..." -#: app/views/menu.html:267 +#: app/views/menu.html:276 msgid "Add" msgstr "Gehitu" -#: app/scripts/controllers/menu.js:511 +#: app/scripts/controllers/menu.js:562 msgid "Add a block to start" msgstr "Gehi ezazu bloke bat hasteko" -#: app/views/menu.html:43 +#: app/views/menu.html:46 msgid "Add as block" msgstr "Blokea sortu" -#: app/scripts/services/tools.js:889 +#: app/scripts/services/tools.js:1036 msgid "All collections removed" msgstr "Bildumak ezabatu dira" -#: app/scripts/controllers/menu.js:533 +#: app/scripts/controllers/menu.js:586 msgid "All stored collections will be lost. Do you want to continue?" msgstr "Gordetako bildumak galduko dira. Jarraitu nahi al duzu?" -#: app/scripts/services/utils.js:535 +#: app/scripts/services/utils.js:533 msgid "Author" msgstr "Egilea" -#: app/views/menu.html:324 +#: app/views/menu.html:333 msgid "Basic" msgstr "Oinarrizkoa" @@ -72,50 +72,54 @@ msgstr "Oinarrizkoa" msgid "Basque" msgstr "Euskara" -#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 -#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 -#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:928 -#: app/scripts/services/blocks.js:962 +#: app/scripts/services/blocks.js:757 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:833 app/scripts/services/blocks.js:852 +#: app/scripts/services/blocks.js:887 app/scripts/services/blocks.js:930 +#: app/scripts/services/blocks.js:965 msgid "Block updated" msgstr "Etiketa freskatua dago" -#: app/scripts/services/project.js:426 +#: app/scripts/services/project.js:433 msgid "Block {{name}} imported" msgstr "{{name}} blokea inportatu duzu" -#: app/views/menu.html:35 +#: app/views/menu.html:38 msgid "Blocks" msgstr "Blokeak" -#: app/views/menu.html:174 +#: app/views/menu.html:183 msgid "Board" msgstr "Txartela" -#: app/views/menu.html:115 app/views/menu.html:162 +#: app/views/menu.html:127 app/views/menu.html:170 msgid "Board rules" msgstr "Txartelaren arauak" -#: app/scripts/controllers/menu.js:337 +#: app/scripts/controllers/menu.js:371 msgid "Board rules disabled" msgstr "Txartelaren arauak desgaituta" -#: app/scripts/controllers/menu.js:332 +#: app/scripts/controllers/menu.js:366 msgid "Board rules enabled" msgstr "Txartelaren arauak gaituta" -#: app/scripts/services/tools.js:254 +#: app/scripts/services/tools.js:333 msgid "Board {{name}} not detected" msgstr "{{name}} txartela ez da aurkitu" -#: app/scripts/controllers/menu.js:476 +#: app/scripts/controllers/menu.js:510 msgid "Board {{name}} selected" msgstr "{{name}} txartela hautatu duzu" -#: app/views/menu.html:213 +#: app/views/menu.html:222 msgid "Build" msgstr "Sintetizatu" -#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:144 +#: app/scripts/controllers/menu.js:531 +msgid "Build done" +msgstr "Sintetizatua egin da" + +#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:146 msgid "Cancel" msgstr "Utzi" @@ -123,87 +127,101 @@ msgstr "Utzi" msgid "Catalan" msgstr "Katalan" -#: app/scripts/services/tools.js:605 +#: app/scripts/services/tools.js:727 msgid "Check Internet connection..." msgstr "Interneteko sarbidea egiaztatu..." -#: app/scripts/services/tools.js:613 +#: app/scripts/services/tools.js:737 msgid "Check Python..." msgstr "Python egiaztatu..." -#: app/scripts/services/drivers.js:104 +#: app/scripts/services/tools.js:819 +msgid "Click here to setup the drivers" +msgstr "" + +#: app/scripts/services/drivers.js:110 app/scripts/services/drivers.js:203 +#: app/scripts/services/drivers.js:225 app/scripts/services/tools.js:132 +#: app/scripts/services/tools.js:246 msgid "Click here to install it" msgstr "Instalatzeko hemen klik egin" -#: app/views/menu.html:338 +#: app/scripts/controllers/menu.js:326 +msgid "Click here to view" +msgstr "" + +#: app/scripts/controllers/menu.js:247 +msgid "Close" +msgstr "" + +#: app/views/menu.html:347 msgid "Code" msgstr "Kodea" -#: app/views/menu.html:185 +#: app/views/menu.html:194 msgid "Collection" msgstr "Bilduma" -#: app/views/menu.html:165 +#: app/views/menu.html:174 msgid "Collection info" msgstr "Bildumaren informazioa" -#: app/scripts/controllers/menu.js:434 +#: app/scripts/controllers/menu.js:468 msgid "Collection {{collection}} info not defined" msgstr "{{collection}} bildumaren informazioa zehaztuta gabe dago" -#: app/scripts/services/tools.js:773 +#: app/scripts/services/tools.js:920 msgid "Collection {{name}} added" msgstr "{{name}} bilduma gehitu da" -#: app/scripts/services/tools.js:767 +#: app/scripts/services/tools.js:914 msgid "Collection {{name}} not replaced" msgstr "{{name}} bilduma ez da ordeztu" -#: app/scripts/services/tools.js:883 +#: app/scripts/services/tools.js:1030 msgid "Collection {{name}} removed" msgstr "{{name}} bilduma ezabatu da" -#: app/scripts/services/tools.js:763 +#: app/scripts/services/tools.js:910 msgid "Collection {{name}} replaced" msgstr "{{name}} bilduma ordeztu da" -#: app/scripts/controllers/menu.js:442 +#: app/scripts/controllers/menu.js:476 msgid "Collection {{name}} selected" msgstr "{{name}} bilduma hautatu da" -#: app/views/menu.html:263 +#: app/views/menu.html:272 msgid "Collections" msgstr "Bildumak" -#: app/views/menu.html:309 +#: app/views/menu.html:318 msgid "Community forum" msgstr "Komunitatearen foroa" -#: app/views/menu.html:335 +#: app/views/menu.html:344 msgid "Constant" msgstr "Konstantea" -#: app/scripts/services/project.js:106 +#: app/scripts/services/project.js:108 msgid "Convert" msgstr "" -#: app/views/menu.html:91 +#: app/views/menu.html:104 msgid "Copy" msgstr "Kopiatu" -#: app/views/menu.html:88 +#: app/views/menu.html:101 msgid "Cut" msgstr "Ebaki" -#: app/views/menu.html:159 +#: app/views/menu.html:167 msgid "Datasheet" msgstr "Datu-fitxa" -#: app/views/menu.html:190 +#: app/views/menu.html:199 msgid "Default" msgstr "Lehenetsia" -#: app/scripts/services/tools.js:481 +#: app/scripts/services/tools.js:603 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" @@ -211,43 +229,43 @@ msgstr "" "Toolchain lehenetsia ez da aurkitu. Hortaz, deskargatu egingo da. Eragiketak " "Interneteko sarbidea behar du, jarraitu nahi al duzu?" -#: app/scripts/services/utils.js:534 +#: app/scripts/services/utils.js:532 msgid "Description" msgstr "Azalpena" -#: app/views/menu.html:126 app/views/menu.html:256 +#: app/views/menu.html:138 app/views/menu.html:265 msgid "Disable" msgstr "Desgaitu" -#: app/scripts/controllers/menu.js:237 +#: app/scripts/controllers/menu.js:250 msgid "Do you want to close the application?" msgstr "Aplikazioa itxi nahi al duzu?" -#: app/scripts/controllers/menu.js:523 +#: app/scripts/controllers/menu.js:576 msgid "Do you want to remove the {{name}} collection?" msgstr "{{name}} bilduma ezabatu nahi al duzu?" -#: app/scripts/services/tools.js:759 +#: app/scripts/services/tools.js:906 msgid "Do you want to replace it?" msgstr "Ordeztu nahi al duzu?" -#: app/views/menu.html:302 +#: app/views/menu.html:311 msgid "Documentation" msgstr "Dokumentazioa" -#: app/views/menu.html:247 +#: app/views/menu.html:256 msgid "Drivers" msgstr "Driverrak" -#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 +#: app/scripts/services/drivers.js:134 app/scripts/services/drivers.js:72 msgid "Drivers disabled" msgstr "Driverrak desgaitu dira" -#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 +#: app/scripts/services/drivers.js:126 app/scripts/services/drivers.js:63 msgid "Drivers enabled" msgstr "Driverrak gaitu dira" -#: app/scripts/services/tools.js:265 +#: app/scripts/services/tools.js:344 msgid "Duplicated FPGA I/O ports" msgstr "FPGAren E/S portuak bikoiztu dira" @@ -255,15 +273,15 @@ msgstr "FPGAren E/S portuak bikoiztu dira" msgid "Duplicated block attributes" msgstr "Blokearen ezaugarriak bikoiztu dira" -#: app/views/menu.html:78 +#: app/views/menu.html:91 msgid "Edit" msgstr "Aldatu" -#: app/scripts/services/tools.js:748 +#: app/scripts/services/tools.js:895 msgid "Edit the collection name" msgstr "Bildumaren izena aldatu" -#: app/views/menu.html:121 app/views/menu.html:251 +#: app/views/menu.html:133 app/views/menu.html:260 msgid "Enable" msgstr "Onartu" @@ -295,76 +313,76 @@ msgstr "Irteerako portuak sar itzazu" msgid "Enter the parameters" msgstr "Parametroak sar itzazu" -#: app/scripts/controllers/menu.js:324 +#: app/scripts/controllers/menu.js:358 msgid "Enter the remote hostname user@host (experimental)" msgstr "" "Urrutiko ostalariaren izena sar ezazu erabiltzailea@host (esperimentala)" -#: app/scripts/services/tools.js:504 +#: app/scripts/services/tools.js:626 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "Errorea: Toolchain lehenetsia ez da '{{dir}}'-en aurkitu" -#: app/scripts/services/utils.js:675 +#: app/scripts/services/utils.js:678 msgid "Error: {{error}}" msgstr "Errorea: {{error}}" -#: app/scripts/services/tools.js:336 -msgid "Errors detected in the code" -msgstr "Kodean erroreak aurkitu dira" +#: app/scripts/services/tools.js:418 +msgid "Errors detected in the design" +msgstr "" -#: app/views/menu.html:39 +#: app/views/menu.html:42 msgid "Examples" msgstr "Adibideak" -#: app/scripts/services/tools.js:206 +#: app/scripts/services/tools.js:275 msgid "Execute remote {{label}} ..." msgstr "Exekutatu urrutiko {{label}} ..." -#: app/views/menu.html:54 +#: app/views/menu.html:57 msgid "Export" msgstr "Esportatu" -#: app/scripts/services/tools.js:637 +#: app/scripts/services/tools.js:762 msgid "Extract default apio files..." msgstr "Apio fitxategiak atera..." -#: app/scripts/services/tools.js:647 +#: app/scripts/services/tools.js:772 msgid "Extract default apio packages..." msgstr "Apio pakete lehenetsiak atera..." -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:750 msgid "Extract virtual env files..." msgstr "Env birtualaren fitxategiak atera..." -#: app/scripts/services/tools.js:262 +#: app/scripts/services/tools.js:341 msgid "FPGA I/O ports not defined" msgstr "FPGAren E/S portuak definitu gabe daude" #: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 +#: app/scripts/services/blocks.js:713 app/scripts/services/blocks.js:793 msgid "FPGA pin" msgstr "FPGA pina" -#: app/views/menu.html:26 +#: app/views/menu.html:29 msgid "File" msgstr "Fitxategia" -#: app/scripts/services/project.js:438 +#: app/scripts/services/project.js:448 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" "Proiektuaren direktorioan {{file}} fitxategia dagoeneko bada. Fitxategia " "ordeztu nahi al duzu?" -#: app/scripts/services/tools.js:182 +#: app/scripts/services/tools.js:214 msgid "File {{file}} does not exist" msgstr "Ez dago {{file}} izeneko fitxategirik" -#: app/scripts/services/project.js:472 +#: app/scripts/services/project.js:482 msgid "File {{file}} imported" msgstr "{{file}} fitxategia inportatu da" -#: app/views/menu.html:104 +#: app/views/menu.html:114 msgid "Fit content" msgstr "Edukia doitu" @@ -372,115 +390,115 @@ msgstr "Edukia doitu" msgid "French" msgstr "Frantsesa" -#: app/scripts/controllers/menu.js:216 -msgid "GTKWave exported" -msgstr "GTKWave-a esportatu da" - #: app/views/languages.html:16 msgid "Galician" msgstr "Galegoa" -#: app/views/menu.html:292 +#: app/views/menu.html:301 msgid "Help" msgstr "Laguntza" -#: app/scripts/services/utils.js:548 +#: app/scripts/services/utils.js:546 msgid "Image" msgstr "Irudia" -#: app/scripts/controllers/menu.js:683 +#: app/scripts/controllers/menu.js:735 msgid "Image {{name}} saved" msgstr "{{name}} izeneko irudia gorde da" -#: app/views/menu.html:341 +#: app/views/menu.html:350 msgid "Information" msgstr "Informazioa" -#: app/views/menu.html:329 +#: app/views/menu.html:338 msgid "Input" msgstr "Sarrera" -#: app/views/menu.html:224 +#: app/views/menu.html:233 msgid "Install" msgstr "Instalatu" -#: app/scripts/services/tools.js:642 +#: app/scripts/services/tools.js:767 msgid "Install default apio..." msgstr "Apio lehenetsia instalatu..." -#: app/scripts/services/tools.js:691 +#: app/scripts/services/tools.js:816 msgid "Installation completed" msgstr "Instalazioa amaitu da" -#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 +#: app/scripts/services/tools.js:657 app/scripts/services/tools.js:692 msgid "Installing toolchain" msgstr "Toolchain-a instalatzen ari da" -#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 +#: app/scripts/services/drivers.js:118 app/scripts/services/tools.js:731 msgid "Internet connection required" msgstr "Interneteko sarbidea behar da" -#: app/scripts/services/graph.js:179 +#: app/scripts/services/graph.js:178 msgid "Invalid Pull up connection:
    block already connected" msgstr "Pull up konexio baliogabea:
    blokea dagoeneko konektatua dago" -#: app/scripts/services/graph.js:193 +#: app/scripts/services/graph.js:192 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" "Pull up konexio baliogabea:
    sarrera blokeak soilik dira " "onargarriak" -#: app/scripts/services/graph.js:185 +#: app/scripts/services/graph.js:184 msgid "Invalid block connection:
    Pull up already connected" msgstr "" "Bloke konexio baliogabeak:
    Pull up -a dagoeneko konektatua dago" -#: app/scripts/services/tools.js:779 +#: app/scripts/services/tools.js:926 msgid "Invalid collection {{name}}" msgstr "{{name}} bilduma baliogabea" -#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 -#: app/scripts/services/graph.js:157 +#: app/scripts/services/graph.js:142 app/scripts/services/graph.js:149 +#: app/scripts/services/graph.js:156 msgid "Invalid connection" msgstr "Konexio baliogabea" -#: app/scripts/services/graph.js:212 +#: app/scripts/services/graph.js:211 msgid "Invalid connection: {{a}} → {{b}}" msgstr "Konexio baliogabea: {{a}} → {{b}}" -#: app/scripts/services/graph.js:173 +#: app/scripts/services/graph.js:172 msgid "Invalid multiple input connections" msgstr "Sarrerako konexio anitzak baliogabeak" -#: app/scripts/services/drivers.js:190 +#: app/scripts/services/utils.js:259 +msgid "Invalid project format" +msgstr "" + +#: app/scripts/services/drivers.js:196 msgid "It is recommended to use USB 2.0 ports" msgstr "USB 2.0 atakak erabiltzea gomendatzen da" -#: app/views/menu.html:134 +#: app/views/menu.html:121 msgid "Language" msgstr "Hizkuntza" -#: app/scripts/services/project.js:105 +#: app/scripts/services/project.js:107 msgid "Load" msgstr "" -#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:866 msgid "Local parameter" msgstr "Parametro lokala" -#: app/scripts/services/tools.js:630 +#: app/scripts/services/tools.js:755 msgid "Make virtual env..." msgstr "Env birtuala sortu..." -#: app/scripts/services/utils.js:755 +#: app/scripts/services/utils.js:758 msgid "Maximum bus size: 96 bits" msgstr "" -#: app/scripts/services/utils.js:532 +#: app/scripts/services/utils.js:530 msgid "Name" msgstr "Izena" -#: app/views/menu.html:29 +#: app/views/menu.html:32 msgid "New" msgstr "Berria" @@ -488,131 +506,128 @@ msgstr "Berria" msgid "New project {{name}} created" msgstr "{{name}} proiektua sortu da" -#: app/scripts/controllers/menu.js:541 +#: app/scripts/controllers/menu.js:594 msgid "No collections stored" msgstr "Ez dago gordeta bildumarik" -#: app/scripts/controllers/main.js:15 app/scripts/services/project.js:143 +#: app/scripts/controllers/main.js:15 app/scripts/controllers/menu.js:260 +#: app/scripts/services/project.js:145 msgid "OK" msgstr "Ok" -#: app/scripts/services/project.js:377 app/scripts/services/project.js:99 +#: app/scripts/services/project.js:101 app/scripts/services/project.js:384 msgid "Old project format {{version}}" msgstr "{{version}} formatu zaharra duen proiektua" -#: app/views/menu.html:32 +#: app/views/menu.html:35 msgid "Open" msgstr "Ireki" -#: app/scripts/services/utils.js:555 +#: app/scripts/services/utils.js:553 msgid "Open SVG" msgstr "SVGa ireki" -#: app/scripts/services/project.js:475 +#: app/scripts/services/project.js:485 msgid "Original file {{file}} does not exist" msgstr "Jatorrizko {{file}} fitxategia ez dago" -#: app/views/menu.html:332 +#: app/views/menu.html:341 msgid "Output" msgstr "Irteera" -#: app/scripts/controllers/menu.js:198 -msgid "PCF file exported" -msgstr "PCF fitxategia esportatu da" - -#: app/views/menu.html:94 +#: app/views/menu.html:107 msgid "Paste" msgstr "Itsatsi" -#: app/scripts/services/utils.js:884 +#: app/scripts/services/utils.js:887 msgid "Please run: {{cmd}}" msgstr "Mesedez {{cmd}} exekutatu" -#: app/views/menu.html:108 +#: app/views/menu.html:118 msgid "Preferences" msgstr "Lehentasunak" -#: app/views/menu.html:111 +#: app/views/menu.html:152 msgid "Project information" msgstr "Proiektuaren informazioa" -#: app/scripts/services/project.js:131 +#: app/scripts/controllers/menu.js:326 app/scripts/controllers/menu.js:340 +msgid "Project information updated" +msgstr "" + +#: app/scripts/services/project.js:133 msgid "Project {{name}} loaded" msgstr "{{name}} proiektua kargatu da" -#: app/scripts/services/project.js:346 +#: app/scripts/services/project.js:349 msgid "Project {{name}} saved" msgstr "{{name}} proiektua gorde da" -#: app/scripts/services/tools.js:618 +#: app/scripts/services/tools.js:744 msgid "Python 2.7 is required" msgstr "Python 2.7 behar da" -#: app/views/menu.html:72 +#: app/views/menu.html:85 msgid "Quit" msgstr "Utzi" -#: app/scripts/services/blocks.js:948 app/views/design.html:5 +#: app/scripts/services/blocks.js:950 app/views/design.html:5 msgid "Read only" msgstr "Irakurtzeko soilik" -#: app/views/menu.html:84 +#: app/views/menu.html:97 msgid "Redo" msgstr "Berregin" -#: app/scripts/services/tools.js:368 +#: app/scripts/services/tools.js:453 msgid "Remote host {{name}} not connected" msgstr "{{name}} urrutiko ostalaria ez dago konektatua" -#: app/views/menu.html:140 +#: app/views/menu.html:145 msgid "Remote hostname" msgstr "Urrutiko ostalariaren izena" -#: app/views/menu.html:232 app/views/menu.html:271 +#: app/views/menu.html:241 app/views/menu.html:280 msgid "Remove" msgstr "Ezabatu" -#: app/views/menu.html:283 +#: app/views/menu.html:292 msgid "Remove all" msgstr "Dena ezabatu" -#: app/scripts/services/utils.js:557 +#: app/scripts/services/utils.js:555 msgid "Reset SVG" msgstr "SVGa berrezarri" -#: app/views/menu.html:237 +#: app/views/menu.html:246 msgid "Reset default" msgstr "Jatorrizkoa berrezarri" -#: app/views/menu.html:101 -msgid "Reset view" -msgstr "Bista berrezarri" - -#: app/views/menu.html:47 +#: app/views/menu.html:50 msgid "Save" msgstr "Gorde" -#: app/scripts/services/utils.js:556 +#: app/scripts/services/utils.js:554 msgid "Save SVG" msgstr "SVGa gorde" -#: app/views/menu.html:50 +#: app/views/menu.html:53 msgid "Save as" msgstr "Gorde honela" -#: app/views/menu.html:171 +#: app/views/menu.html:180 msgid "Select" msgstr "Hautatu" -#: app/views/menu.html:97 +#: app/views/menu.html:110 msgid "Select all" msgstr "Dena hautatu" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:714 msgid "Show clock" msgstr "Ordularia erakutsi" -#: app/views/menu.html:305 +#: app/views/menu.html:314 msgid "Source code" msgstr "Iturburu kodea" @@ -620,39 +635,47 @@ msgstr "Iturburu kodea" msgid "Spanish" msgstr "Gaztelera" -#: app/scripts/services/tools.js:195 +#: app/scripts/controllers/menu.js:530 +msgid "Start build" +msgstr "Sintetizatua hasi" + +#: app/scripts/controllers/menu.js:542 +msgid "Start upload" +msgstr "Karga hasi" + +#: app/scripts/controllers/menu.js:518 +msgid "Start verification" +msgstr "Egiaztapena hasi" + +#: app/scripts/services/tools.js:264 msgid "Synchronize remote files ..." msgstr "Urrutiko fitxategiak sinkronizatu..." -#: app/views/menu.html:63 +#: app/views/menu.html:66 msgid "Testbench" msgstr "Testbench " -#: app/scripts/controllers/menu.js:207 -msgid "Testbench exported" -msgstr "Testbench-a esportatu da" - -#: app/scripts/services/tools.js:758 +#: app/scripts/services/tools.js:905 msgid "The collection {{name}} already exists." msgstr "{{name}} bilduma badago" -#: app/scripts/controllers/menu.js:463 +#: app/scripts/controllers/menu.js:497 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" msgstr "" "FPGAaren E/S konfigurazioa galduko da. {{name}} txartela aldatu nahi al duzu?" -#: app/scripts/services/tools.js:509 +#: app/scripts/services/tools.js:631 msgid "The toolchain will be removed. Do you want to continue?" msgstr "Toolchain-a ezabatuko da. Jarraitu nahi al duzu?" -#: app/scripts/services/tools.js:497 +#: app/scripts/services/tools.js:619 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "" "Toolchain-aren jatorrizko balioak berrezarriko dira. Jarraitu nahi al duzu?" -#: app/scripts/services/tools.js:489 +#: app/scripts/services/tools.js:611 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" @@ -660,7 +683,7 @@ msgstr "" "Toolchain-a eguneratuko da. Operazio horrek Interneteko sarbidea behar du. " "Jarraitu nahi al duzu?" -#: app/scripts/services/project.js:400 +#: app/scripts/services/project.js:407 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" @@ -668,87 +691,95 @@ msgstr "" "Inportazio operazioak proiektu-bidea behar du. Uneko proiektua gorde " "beharko duzu. Jarraitu nahi al duzu?" -#: app/scripts/services/project.js:109 +#: app/scripts/services/project.js:111 msgid "This project is designed for the {{name}} board." msgstr "Proiektua {{name}} txartelarentzat diseinatu da." -#: app/views/menu.html:220 +#: app/views/menu.html:229 msgid "Toolchain" msgstr "Toolchain" -#: app/scripts/services/tools.js:692 +#: app/scripts/services/tools.js:818 msgid "Toolchain installed" msgstr "Toolchain-a instalatu da" -#: app/scripts/services/tools.js:695 +#: app/scripts/services/drivers.js:203 app/scripts/services/drivers.js:225 +#: app/scripts/services/tools.js:132 app/scripts/services/tools.js:834 msgid "Toolchain not installed" msgstr "Toolchain-a ez da instalatu" -#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 -#: app/scripts/services/tools.js:94 -msgid "Toolchain not installed. Please, install the toolchain" -msgstr "Toolchain-a ez da instalatu. Mesedez, toolchaina instala ezazu" - -#: app/scripts/services/tools.js:514 +#: app/scripts/services/tools.js:636 msgid "Toolchain removed" msgstr "Toolchain-a ezabatu da" -#: app/views/menu.html:207 +#: app/scripts/services/tools.js:246 +msgid "Toolchain version does not match" +msgstr "" + +#: app/views/menu.html:216 msgid "Tools" msgstr "Tresnak" -#: app/views/menu.html:81 +#: app/views/menu.html:94 msgid "Undo" msgstr "Desegin" -#: app/scripts/services/tools.js:257 +#: app/scripts/services/tools.js:336 msgid "Unknown board" msgstr "Txartel ezezaguna" -#: app/scripts/app.js:44 +#: app/scripts/app.js:48 msgid "Untitled" msgstr "Izenik gabe" -#: app/views/menu.html:227 +#: app/views/menu.html:236 msgid "Update" msgstr "Eguneratu" -#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 -#: app/scripts/services/blocks.js:863 +#: app/scripts/services/blocks.js:712 app/scripts/services/blocks.js:792 +#: app/scripts/services/blocks.js:865 msgid "Update the block name" msgstr "Blokearen izena egunera ezazu" -#: app/views/menu.html:216 +#: app/views/menu.html:225 msgid "Upload" msgstr "Kargatu" -#: app/views/menu.html:210 +#: app/scripts/controllers/menu.js:543 +msgid "Upload done" +msgstr "Karga egin da" + +#: app/scripts/controllers/menu.js:519 +msgid "Verification done" +msgstr "Egiaztapena egin da" + +#: app/views/menu.html:219 msgid "Verify" msgstr "Egiaztatu" -#: app/scripts/controllers/menu.js:189 -msgid "Verilog code exported" -msgstr "Verilog kodea esportatu da" - -#: app/scripts/services/utils.js:533 app/views/menu.html:298 +#: app/scripts/services/utils.js:531 app/views/menu.html:307 msgid "Version" msgstr "Bertsioa" -#: app/views/menu.html:150 +#: app/views/menu.html:158 msgid "View" msgstr "Ikusi" -#: app/views/menu.html:295 +#: app/views/menu.html:304 msgid "View license" msgstr "Lizentzia ikusi" +#: app/scripts/services/tools.js:421 +msgid "Warnings detected in the design" +msgstr "" + #: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Blokearen formatua okerra da: {{type}}" #: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 -#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:783 +#: app/scripts/services/blocks.js:857 app/scripts/services/blocks.js:892 msgid "Wrong block name {{name}}" msgstr "{{name}} blokearen izena okerra da" @@ -760,19 +791,19 @@ msgstr "Parametroaren formatua okerra da: {{name}}" msgid "Wrong port name {{name}}" msgstr "Portuaren izena okerra da: {{name}}" -#: app/scripts/services/project.js:139 +#: app/scripts/services/project.js:141 msgid "Wrong project format: {{name}}" msgstr "Proiektuaren formatua okerra da: {{name}}" -#: app/scripts/services/tools.js:365 +#: app/scripts/services/tools.js:450 msgid "Wrong remote hostname {{name}}" msgstr "Urrutiko ostalariaren {{name}} izena okerra da" -#: app/scripts/services/project.js:110 +#: app/scripts/services/project.js:112 msgid "You can load it as it is or convert it for the {{name}} board." msgstr "" -#: app/scripts/controllers/menu.js:238 +#: app/scripts/controllers/menu.js:251 msgid "Your changes will be lost if you don’t save them" msgstr "Aldaketak galduko dituzu gordetzen ez badituzu" @@ -780,52 +811,65 @@ msgstr "Aldaketak galduko dituzu gordetzen ez badituzu" msgid "back" msgstr "atzera" -#. Build done -#: app/scripts/services/tools.js:380 -msgid "done_build" -msgstr "Sintetizatua egin da" - -#. Upload done -#: app/scripts/services/tools.js:382 -msgid "done_upload" -msgstr "Karga egin da" - -#. Verification done -#: app/scripts/services/tools.js:378 -msgid "done_verify" -msgstr "Egiaztapena egin da" - -#. Start building ... -#: app/scripts/services/tools.js:61 -msgid "start_build" -msgstr "Sintetizatua hasi ..." - -#. Start uploading ... -#: app/scripts/services/tools.js:63 -msgid "start_upload" -msgstr "Karga hasi ..." - -#. Start verification ... -#: app/scripts/services/tools.js:59 -msgid "start_verify" -msgstr "Egiaztapena hasi ..." - -#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:859 +#: app/scripts/services/drivers.js:109 app/scripts/services/utils.js:862 msgid "{{app}} is required." msgstr "{{app}} behar da" -#: app/scripts/controllers/menu.js:396 +#: app/scripts/controllers/menu.js:430 msgid "{{board}} datasheet not defined" msgstr "{{board}} ez zehaztua" -#: app/scripts/controllers/menu.js:386 +#: app/scripts/controllers/menu.js:420 msgid "{{board}} pinout not defined" msgstr "{{board}} pinout ez zehaztua" -#: app/scripts/controllers/menu.js:415 +#: app/scripts/controllers/menu.js:449 msgid "{{board}} rules not defined" msgstr "{{board}} txartelaren arauak ez daude definituta" +#: app/scripts/controllers/menu.js:201 app/scripts/controllers/menu.js:224 +msgid "{{name}} exported" +msgstr "" + +#~ msgid "Errors detected in the code" +#~ msgstr "Kodean erroreak aurkitu dira" + +#~ msgid "GTKWave exported" +#~ msgstr "GTKWave-a esportatu da" + +#~ msgid "PCF file exported" +#~ msgstr "PCF fitxategia esportatu da" + +#~ msgid "Reset view" +#~ msgstr "Bista berrezarri" + +#~ msgid "Testbench exported" +#~ msgstr "Testbench-a esportatu da" + +#~ msgid "Toolchain not installed. Please, install the toolchain" +#~ msgstr "Toolchain-a ez da instalatu. Mesedez, toolchaina instala ezazu" + +#~ msgid "Verilog code exported" +#~ msgstr "Verilog kodea esportatu da" + +#~ msgid "done_build" +#~ msgstr "Sintetizatua egin da" + +#~ msgid "done_upload" +#~ msgstr "Karga egin da" + +#~ msgid "done_verify" +#~ msgstr "Egiaztapena egin da" + +#~ msgid "start_build" +#~ msgstr "Sintetizatua hasi ..." + +#~ msgid "start_upload" +#~ msgstr "Karga hasi ..." + +#~ msgid "start_verify" +#~ msgstr "Egiaztapena hasi ..." + #~ msgid "Do you want to convert it?" #~ msgstr "Bihurtu nahi al duzu?" diff --git a/app/resources/locale/fr_FR/fr_FR.po b/app/resources/locale/fr_FR/fr_FR.po index fa3fcb6a9..b9c854e51 100644 --- a/app/resources/locale/fr_FR/fr_FR.po +++ b/app/resources/locale/fr_FR/fr_FR.po @@ -9,14 +9,14 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.2\n" +"X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 +#: app/scripts/services/drivers.js:211 app/scripts/services/drivers.js:87 msgid "Unplug and reconnect the board" msgstr "Débrancher et reconnecter la carte" -#: app/scripts/services/drivers.js:189 +#: app/scripts/services/drivers.js:195 msgid "" "

    FTDI driver installation instructions

    1. Connect the FPGA " "board
    2. Replace the (Interface 0) driver of the board by " @@ -26,7 +26,7 @@ msgstr "" "carte FPGA
    3. Remplacer le pilote (Interface 0) de la carte par " "libusbK
    4. Débrancher puis rebrancher la carte
    " -#: app/scripts/services/drivers.js:207 +#: app/scripts/services/drivers.js:218 msgid "" "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB " "Device
    2. Select the board interface and uninstall the driver
    " @@ -35,36 +35,36 @@ msgstr "" "périphérique USB FPGA
  • Sélectionner la carte interface et " "désinstaller le pilote
  • " -#: app/views/menu.html:313 +#: app/views/menu.html:322 msgid "About Icestudio" msgstr "À propos d'Icestudio" -#: app/views/menu.html:267 +#: app/views/menu.html:276 msgid "Add" msgstr "Ajouter" -#: app/scripts/controllers/menu.js:511 +#: app/scripts/controllers/menu.js:562 msgid "Add a block to start" msgstr "Ajouter un bloc pour commencer" -#: app/views/menu.html:43 +#: app/views/menu.html:46 msgid "Add as block" msgstr "Ajouter un bloc" -#: app/scripts/services/tools.js:889 +#: app/scripts/services/tools.js:1036 msgid "All collections removed" msgstr "Toutes les collections ont été supprimées" -#: app/scripts/controllers/menu.js:533 +#: app/scripts/controllers/menu.js:586 msgid "All stored collections will be lost. Do you want to continue?" msgstr "" "Toutes les collections enregistrées seront perdues. Voulez-vous continuer ?" -#: app/scripts/services/utils.js:535 +#: app/scripts/services/utils.js:533 msgid "Author" msgstr "Auteur" -#: app/views/menu.html:324 +#: app/views/menu.html:333 msgid "Basic" msgstr "Basique" @@ -72,50 +72,54 @@ msgstr "Basique" msgid "Basque" msgstr "Basque" -#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 -#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 -#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:928 -#: app/scripts/services/blocks.js:962 +#: app/scripts/services/blocks.js:757 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:833 app/scripts/services/blocks.js:852 +#: app/scripts/services/blocks.js:887 app/scripts/services/blocks.js:930 +#: app/scripts/services/blocks.js:965 msgid "Block updated" msgstr "Bloc mis à jour" -#: app/scripts/services/project.js:426 +#: app/scripts/services/project.js:433 msgid "Block {{name}} imported" msgstr "Bloc {{name}} importé" -#: app/views/menu.html:35 +#: app/views/menu.html:38 msgid "Blocks" msgstr "Blocs" -#: app/views/menu.html:174 +#: app/views/menu.html:183 msgid "Board" msgstr "Carte" -#: app/views/menu.html:115 app/views/menu.html:162 +#: app/views/menu.html:127 app/views/menu.html:170 msgid "Board rules" msgstr "Règles de la carte" -#: app/scripts/controllers/menu.js:337 +#: app/scripts/controllers/menu.js:371 msgid "Board rules disabled" msgstr "Règles de la carte désactivées" -#: app/scripts/controllers/menu.js:332 +#: app/scripts/controllers/menu.js:366 msgid "Board rules enabled" msgstr "Règles de la carte activées" -#: app/scripts/services/tools.js:254 +#: app/scripts/services/tools.js:333 msgid "Board {{name}} not detected" msgstr "Carte {{name}} non détectée" -#: app/scripts/controllers/menu.js:476 +#: app/scripts/controllers/menu.js:510 msgid "Board {{name}} selected" msgstr "Carte {{name}} séléctionnée" -#: app/views/menu.html:213 +#: app/views/menu.html:222 msgid "Build" msgstr "Construire" -#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:144 +#: app/scripts/controllers/menu.js:531 +msgid "Build done" +msgstr "Construction terminée" + +#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:146 msgid "Cancel" msgstr "Annuler" @@ -123,87 +127,101 @@ msgstr "Annuler" msgid "Catalan" msgstr "Catalan" -#: app/scripts/services/tools.js:605 +#: app/scripts/services/tools.js:727 msgid "Check Internet connection..." msgstr "Vérifier la connexion Internet..." -#: app/scripts/services/tools.js:613 +#: app/scripts/services/tools.js:737 msgid "Check Python..." msgstr "Vérifier Python..." -#: app/scripts/services/drivers.js:104 +#: app/scripts/services/tools.js:819 +msgid "Click here to setup the drivers" +msgstr "" + +#: app/scripts/services/drivers.js:110 app/scripts/services/drivers.js:203 +#: app/scripts/services/drivers.js:225 app/scripts/services/tools.js:132 +#: app/scripts/services/tools.js:246 msgid "Click here to install it" msgstr "Cliquer ici pour l'installer" -#: app/views/menu.html:338 +#: app/scripts/controllers/menu.js:326 +msgid "Click here to view" +msgstr "" + +#: app/scripts/controllers/menu.js:247 +msgid "Close" +msgstr "" + +#: app/views/menu.html:347 msgid "Code" msgstr "Code" -#: app/views/menu.html:185 +#: app/views/menu.html:194 msgid "Collection" msgstr "Collection" -#: app/views/menu.html:165 +#: app/views/menu.html:174 msgid "Collection info" msgstr "Informations sur la collection" -#: app/scripts/controllers/menu.js:434 +#: app/scripts/controllers/menu.js:468 msgid "Collection {{collection}} info not defined" msgstr "Informations sur la collection {{name}} non définies" -#: app/scripts/services/tools.js:773 +#: app/scripts/services/tools.js:920 msgid "Collection {{name}} added" msgstr "Collection {{name}} ajoutée" -#: app/scripts/services/tools.js:767 +#: app/scripts/services/tools.js:914 msgid "Collection {{name}} not replaced" msgstr "Collection {{name}} non remplacée" -#: app/scripts/services/tools.js:883 +#: app/scripts/services/tools.js:1030 msgid "Collection {{name}} removed" msgstr "Collection {{name}} supprimée" -#: app/scripts/services/tools.js:763 +#: app/scripts/services/tools.js:910 msgid "Collection {{name}} replaced" msgstr "Collection {{name}} remplacée" -#: app/scripts/controllers/menu.js:442 +#: app/scripts/controllers/menu.js:476 msgid "Collection {{name}} selected" msgstr "Collection {{name}} sélectionée" -#: app/views/menu.html:263 +#: app/views/menu.html:272 msgid "Collections" msgstr "Collections" -#: app/views/menu.html:309 +#: app/views/menu.html:318 msgid "Community forum" msgstr "Forum communautaire" -#: app/views/menu.html:335 +#: app/views/menu.html:344 msgid "Constant" msgstr "Constante" -#: app/scripts/services/project.js:106 +#: app/scripts/services/project.js:108 msgid "Convert" msgstr "Convertir" -#: app/views/menu.html:91 +#: app/views/menu.html:104 msgid "Copy" msgstr "Copier" -#: app/views/menu.html:88 +#: app/views/menu.html:101 msgid "Cut" msgstr "Couper" -#: app/views/menu.html:159 +#: app/views/menu.html:167 msgid "Datasheet" msgstr "Documentation" -#: app/views/menu.html:190 +#: app/views/menu.html:199 msgid "Default" msgstr "Défaut" -#: app/scripts/services/tools.js:481 +#: app/scripts/services/tools.js:603 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" @@ -212,43 +230,43 @@ msgstr "" "téléchargée. Cette opération nécessite une connexion Internet. Voulez-vous " "continuer ?" -#: app/scripts/services/utils.js:534 +#: app/scripts/services/utils.js:532 msgid "Description" msgstr "Description" -#: app/views/menu.html:126 app/views/menu.html:256 +#: app/views/menu.html:138 app/views/menu.html:265 msgid "Disable" msgstr "Désactiver" -#: app/scripts/controllers/menu.js:237 +#: app/scripts/controllers/menu.js:250 msgid "Do you want to close the application?" msgstr "Voulez-vous fermer l'application ?" -#: app/scripts/controllers/menu.js:523 +#: app/scripts/controllers/menu.js:576 msgid "Do you want to remove the {{name}} collection?" msgstr "Voulez-vous supprimer la collection {{name}} ?" -#: app/scripts/services/tools.js:759 +#: app/scripts/services/tools.js:906 msgid "Do you want to replace it?" msgstr "Voulez-vous le remplacer ?" -#: app/views/menu.html:302 +#: app/views/menu.html:311 msgid "Documentation" msgstr "Documentation" -#: app/views/menu.html:247 +#: app/views/menu.html:256 msgid "Drivers" msgstr "Pilote" -#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 +#: app/scripts/services/drivers.js:134 app/scripts/services/drivers.js:72 msgid "Drivers disabled" msgstr "Pilote désactivé" -#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 +#: app/scripts/services/drivers.js:126 app/scripts/services/drivers.js:63 msgid "Drivers enabled" msgstr "Pilote activé" -#: app/scripts/services/tools.js:265 +#: app/scripts/services/tools.js:344 msgid "Duplicated FPGA I/O ports" msgstr "Ports d'entrée/sortie FPGA dupliqués" @@ -256,15 +274,15 @@ msgstr "Ports d'entrée/sortie FPGA dupliqués" msgid "Duplicated block attributes" msgstr "Attributs de bloc dupliqués" -#: app/views/menu.html:78 +#: app/views/menu.html:91 msgid "Edit" msgstr "Édition" -#: app/scripts/services/tools.js:748 +#: app/scripts/services/tools.js:895 msgid "Edit the collection name" msgstr "Éditer le nom de la collection" -#: app/views/menu.html:121 app/views/menu.html:251 +#: app/views/menu.html:133 app/views/menu.html:260 msgid "Enable" msgstr "Activer" @@ -296,75 +314,75 @@ msgstr "Entrer les ports de sortie" msgid "Enter the parameters" msgstr "Entrer les paramètres" -#: app/scripts/controllers/menu.js:324 +#: app/scripts/controllers/menu.js:358 msgid "Enter the remote hostname user@host (experimental)" msgstr "Entrer le nom d'hôte distant user@host (expérimental)" -#: app/scripts/services/tools.js:504 +#: app/scripts/services/tools.js:626 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "Erreur: La toolchain par défaut n'a pas été trouvée dans '{{dir}}'" -#: app/scripts/services/utils.js:675 +#: app/scripts/services/utils.js:678 msgid "Error: {{error}}" msgstr "Erreur : {{error}}" -#: app/scripts/services/tools.js:336 -msgid "Errors detected in the code" -msgstr "Erreurs détectées dans le code" +#: app/scripts/services/tools.js:418 +msgid "Errors detected in the design" +msgstr "" -#: app/views/menu.html:39 +#: app/views/menu.html:42 msgid "Examples" msgstr "Exemples" -#: app/scripts/services/tools.js:206 +#: app/scripts/services/tools.js:275 msgid "Execute remote {{label}} ..." msgstr "Exécuter à distance {{label}} ..." -#: app/views/menu.html:54 +#: app/views/menu.html:57 msgid "Export" msgstr "Exporter" -#: app/scripts/services/tools.js:637 +#: app/scripts/services/tools.js:762 msgid "Extract default apio files..." msgstr "Extraction des fichiers apio par défaut..." -#: app/scripts/services/tools.js:647 +#: app/scripts/services/tools.js:772 msgid "Extract default apio packages..." msgstr "Extraction des paquets apio par défaut..." -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:750 msgid "Extract virtual env files..." msgstr "Extraction des fichiers d'environnement virtuels..." -#: app/scripts/services/tools.js:262 +#: app/scripts/services/tools.js:341 msgid "FPGA I/O ports not defined" msgstr "Ports d'entrée/sortie FPGA non définis" #: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 +#: app/scripts/services/blocks.js:713 app/scripts/services/blocks.js:793 msgid "FPGA pin" msgstr "Pin FPGA" -#: app/views/menu.html:26 +#: app/views/menu.html:29 msgid "File" msgstr "Fichier" -#: app/scripts/services/project.js:438 +#: app/scripts/services/project.js:448 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" "Le fichier {{file}} existe déjà dans le chemin du projet. Voulez vous le " "remplacer ?" -#: app/scripts/services/tools.js:182 +#: app/scripts/services/tools.js:214 msgid "File {{file}} does not exist" msgstr "Le fichier {{file}} n'existe pas" -#: app/scripts/services/project.js:472 +#: app/scripts/services/project.js:482 msgid "File {{file}} imported" msgstr "Fichier {{file}} importé" -#: app/views/menu.html:104 +#: app/views/menu.html:114 msgid "Fit content" msgstr "Adapter le contenu" @@ -372,114 +390,114 @@ msgstr "Adapter le contenu" msgid "French" msgstr "Français" -#: app/scripts/controllers/menu.js:216 -msgid "GTKWave exported" -msgstr "GTKWave exporté" - #: app/views/languages.html:16 msgid "Galician" msgstr "Galicien" -#: app/views/menu.html:292 +#: app/views/menu.html:301 msgid "Help" msgstr "Aide" -#: app/scripts/services/utils.js:548 +#: app/scripts/services/utils.js:546 msgid "Image" msgstr "Image" -#: app/scripts/controllers/menu.js:683 +#: app/scripts/controllers/menu.js:735 msgid "Image {{name}} saved" msgstr "Image {{name}} sauvegardée" -#: app/views/menu.html:341 +#: app/views/menu.html:350 msgid "Information" msgstr "Information" -#: app/views/menu.html:329 +#: app/views/menu.html:338 msgid "Input" msgstr "Entrée" -#: app/views/menu.html:224 +#: app/views/menu.html:233 msgid "Install" msgstr "Installation" -#: app/scripts/services/tools.js:642 +#: app/scripts/services/tools.js:767 msgid "Install default apio..." msgstr "Installer l'apio par défaut..." -#: app/scripts/services/tools.js:691 +#: app/scripts/services/tools.js:816 msgid "Installation completed" msgstr "Installation terminée" -#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 +#: app/scripts/services/tools.js:657 app/scripts/services/tools.js:692 msgid "Installing toolchain" msgstr "Installation de la toolchain" -#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 +#: app/scripts/services/drivers.js:118 app/scripts/services/tools.js:731 msgid "Internet connection required" msgstr "Une connexion Internet est requise" -#: app/scripts/services/graph.js:179 +#: app/scripts/services/graph.js:178 msgid "Invalid Pull up connection:
    block already connected" msgstr "Connexion de Pull up invalide:
    le bloc est déjà connecté" -#: app/scripts/services/graph.js:193 +#: app/scripts/services/graph.js:192 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" "Connexion de Pull up invalide:
    seules les entrées sont " "autorisées" -#: app/scripts/services/graph.js:185 +#: app/scripts/services/graph.js:184 msgid "Invalid block connection:
    Pull up already connected" msgstr "Connexion de bloc invalide:
    Pull up déjà connectée" -#: app/scripts/services/tools.js:779 +#: app/scripts/services/tools.js:926 msgid "Invalid collection {{name}}" msgstr "Collection {{name}} invalide" -#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 -#: app/scripts/services/graph.js:157 +#: app/scripts/services/graph.js:142 app/scripts/services/graph.js:149 +#: app/scripts/services/graph.js:156 msgid "Invalid connection" msgstr "Connexion invalide" -#: app/scripts/services/graph.js:212 +#: app/scripts/services/graph.js:211 msgid "Invalid connection: {{a}} → {{b}}" msgstr "Connexion invalide: {{a}} → {{b}}" -#: app/scripts/services/graph.js:173 +#: app/scripts/services/graph.js:172 msgid "Invalid multiple input connections" msgstr "Connexions de multiples entrées invalides" -#: app/scripts/services/drivers.js:190 +#: app/scripts/services/utils.js:259 +msgid "Invalid project format" +msgstr "" + +#: app/scripts/services/drivers.js:196 msgid "It is recommended to use USB 2.0 ports" msgstr "Des ports USB 2.0 sont recommandés" -#: app/views/menu.html:134 +#: app/views/menu.html:121 msgid "Language" msgstr "Langue" -#: app/scripts/services/project.js:105 +#: app/scripts/services/project.js:107 msgid "Load" msgstr "Charger" -#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:866 msgid "Local parameter" msgstr "Paramètre local" -#: app/scripts/services/tools.js:630 +#: app/scripts/services/tools.js:755 msgid "Make virtual env..." msgstr "Créer l'environnement virtuel..." -#: app/scripts/services/utils.js:755 +#: app/scripts/services/utils.js:758 msgid "Maximum bus size: 96 bits" msgstr "Taille maximale du bus : 96 bits" -#: app/scripts/services/utils.js:532 +#: app/scripts/services/utils.js:530 msgid "Name" msgstr "Nom" -#: app/views/menu.html:29 +#: app/views/menu.html:32 msgid "New" msgstr "Nouveau" @@ -487,131 +505,128 @@ msgstr "Nouveau" msgid "New project {{name}} created" msgstr "Nouveau projet {{name}} créé" -#: app/scripts/controllers/menu.js:541 +#: app/scripts/controllers/menu.js:594 msgid "No collections stored" msgstr "Pas de collections sauvegardées" -#: app/scripts/controllers/main.js:15 app/scripts/services/project.js:143 +#: app/scripts/controllers/main.js:15 app/scripts/controllers/menu.js:260 +#: app/scripts/services/project.js:145 msgid "OK" msgstr "OK" -#: app/scripts/services/project.js:377 app/scripts/services/project.js:99 +#: app/scripts/services/project.js:101 app/scripts/services/project.js:384 msgid "Old project format {{version}}" msgstr "Vieux format de projet {{version}}" -#: app/views/menu.html:32 +#: app/views/menu.html:35 msgid "Open" msgstr "Ouvrir" -#: app/scripts/services/utils.js:555 +#: app/scripts/services/utils.js:553 msgid "Open SVG" msgstr "Ouvrir SVG" -#: app/scripts/services/project.js:475 +#: app/scripts/services/project.js:485 msgid "Original file {{file}} does not exist" msgstr "Le fichier original {{file}} n'existe pas" -#: app/views/menu.html:332 +#: app/views/menu.html:341 msgid "Output" msgstr "Sortie" -#: app/scripts/controllers/menu.js:198 -msgid "PCF file exported" -msgstr "Fichier PCF exporté" - -#: app/views/menu.html:94 +#: app/views/menu.html:107 msgid "Paste" msgstr "Coller" -#: app/scripts/services/utils.js:884 +#: app/scripts/services/utils.js:887 msgid "Please run: {{cmd}}" msgstr "Veuillez exécuter : {{cmd}}" -#: app/views/menu.html:108 +#: app/views/menu.html:118 msgid "Preferences" msgstr "Préférences" -#: app/views/menu.html:111 +#: app/views/menu.html:152 msgid "Project information" msgstr "Informations du projet" -#: app/scripts/services/project.js:131 +#: app/scripts/controllers/menu.js:326 app/scripts/controllers/menu.js:340 +msgid "Project information updated" +msgstr "" + +#: app/scripts/services/project.js:133 msgid "Project {{name}} loaded" msgstr "Projet {{name}} chargé" -#: app/scripts/services/project.js:346 +#: app/scripts/services/project.js:349 msgid "Project {{name}} saved" msgstr "Projet {{name}} sauvegardé" -#: app/scripts/services/tools.js:618 +#: app/scripts/services/tools.js:744 msgid "Python 2.7 is required" msgstr "Python 2.7 est requis" -#: app/views/menu.html:72 +#: app/views/menu.html:85 msgid "Quit" msgstr "Quitter" -#: app/scripts/services/blocks.js:948 app/views/design.html:5 +#: app/scripts/services/blocks.js:950 app/views/design.html:5 msgid "Read only" msgstr "Lecture seule" -#: app/views/menu.html:84 +#: app/views/menu.html:97 msgid "Redo" msgstr "Refaire" -#: app/scripts/services/tools.js:368 +#: app/scripts/services/tools.js:453 msgid "Remote host {{name}} not connected" msgstr "Hôte distant {{name}} non connecté" -#: app/views/menu.html:140 +#: app/views/menu.html:145 msgid "Remote hostname" msgstr "Nom d'hôte distant" -#: app/views/menu.html:232 app/views/menu.html:271 +#: app/views/menu.html:241 app/views/menu.html:280 msgid "Remove" msgstr "Supprimer" -#: app/views/menu.html:283 +#: app/views/menu.html:292 msgid "Remove all" msgstr "Supprimer tout" -#: app/scripts/services/utils.js:557 +#: app/scripts/services/utils.js:555 msgid "Reset SVG" msgstr "Réinitialiser le SVG" -#: app/views/menu.html:237 +#: app/views/menu.html:246 msgid "Reset default" msgstr "Réinitialiser avec les paramètres par défaut" -#: app/views/menu.html:101 -msgid "Reset view" -msgstr "Réinitialiser la vue" - -#: app/views/menu.html:47 +#: app/views/menu.html:50 msgid "Save" msgstr "Sauvegarder" -#: app/scripts/services/utils.js:556 +#: app/scripts/services/utils.js:554 msgid "Save SVG" msgstr "Sauvegarder le SVG" -#: app/views/menu.html:50 +#: app/views/menu.html:53 msgid "Save as" msgstr "Sauvegarder sous" -#: app/views/menu.html:171 +#: app/views/menu.html:180 msgid "Select" msgstr "Sélectionner" -#: app/views/menu.html:97 +#: app/views/menu.html:110 msgid "Select all" msgstr "Sélectionner tout" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:714 msgid "Show clock" msgstr "Montrer l'horloge" -#: app/views/menu.html:305 +#: app/views/menu.html:314 msgid "Source code" msgstr "Code source" @@ -619,23 +634,31 @@ msgstr "Code source" msgid "Spanish" msgstr "Espagnol" -#: app/scripts/services/tools.js:195 +#: app/scripts/controllers/menu.js:530 +msgid "Start build" +msgstr "Début de la construction" + +#: app/scripts/controllers/menu.js:542 +msgid "Start upload" +msgstr "Début du téléchargement" + +#: app/scripts/controllers/menu.js:518 +msgid "Start verification" +msgstr "Début de la vérification" + +#: app/scripts/services/tools.js:264 msgid "Synchronize remote files ..." msgstr "Synchroniser les fichiers distants ..." -#: app/views/menu.html:63 +#: app/views/menu.html:66 msgid "Testbench" msgstr "Testbench" -#: app/scripts/controllers/menu.js:207 -msgid "Testbench exported" -msgstr "Testbench exporté" - -#: app/scripts/services/tools.js:758 +#: app/scripts/services/tools.js:905 msgid "The collection {{name}} already exists." msgstr "La collection {{name}} existe déjà." -#: app/scripts/controllers/menu.js:463 +#: app/scripts/controllers/menu.js:497 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" @@ -643,15 +666,15 @@ msgstr "" "La configuration actuelle des entrées/sorties du FPGA va être perdue. Voulez-" "vous changer pour la carte {{name}}?" -#: app/scripts/services/tools.js:509 +#: app/scripts/services/tools.js:631 msgid "The toolchain will be removed. Do you want to continue?" msgstr "La toolchain va être supprimée. Voulez-vous continuer ?" -#: app/scripts/services/tools.js:497 +#: app/scripts/services/tools.js:619 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "La toolchain par défaut va être restaurée. Voulez vous continuer ?" -#: app/scripts/services/tools.js:489 +#: app/scripts/services/tools.js:611 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" @@ -659,7 +682,7 @@ msgstr "" "La toolchain va être mise à jour. Cette opération a besoin d'une connexion " "Internet.Voulez-vous continuer ?" -#: app/scripts/services/project.js:400 +#: app/scripts/services/project.js:407 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" @@ -667,87 +690,95 @@ msgstr "" "Cette opération d'importation requiert un chemin de projet. Vous devez " "sauvegarder le projet actuel. Voulez vous continuer ?" -#: app/scripts/services/project.js:109 +#: app/scripts/services/project.js:111 msgid "This project is designed for the {{name}} board." msgstr "Ce projet est conçu pour la carte {{name}}" -#: app/views/menu.html:220 +#: app/views/menu.html:229 msgid "Toolchain" msgstr "Toolchain" -#: app/scripts/services/tools.js:692 +#: app/scripts/services/tools.js:818 msgid "Toolchain installed" msgstr "La toolchain est installée" -#: app/scripts/services/tools.js:695 +#: app/scripts/services/drivers.js:203 app/scripts/services/drivers.js:225 +#: app/scripts/services/tools.js:132 app/scripts/services/tools.js:834 msgid "Toolchain not installed" msgstr "La toolchain n'est pas installée" -#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 -#: app/scripts/services/tools.js:94 -msgid "Toolchain not installed. Please, install the toolchain" -msgstr "La toolchain n'est pas installée. Veuillez installer la toolchain" - -#: app/scripts/services/tools.js:514 +#: app/scripts/services/tools.js:636 msgid "Toolchain removed" msgstr "Toolchain supprimée" -#: app/views/menu.html:207 +#: app/scripts/services/tools.js:246 +msgid "Toolchain version does not match" +msgstr "" + +#: app/views/menu.html:216 msgid "Tools" msgstr "Outils" -#: app/views/menu.html:81 +#: app/views/menu.html:94 msgid "Undo" msgstr "Revenir en arrière" -#: app/scripts/services/tools.js:257 +#: app/scripts/services/tools.js:336 msgid "Unknown board" msgstr "Carte inconnue" -#: app/scripts/app.js:44 +#: app/scripts/app.js:48 msgid "Untitled" msgstr "Sans titre" -#: app/views/menu.html:227 +#: app/views/menu.html:236 msgid "Update" msgstr "Mettre à jour" -#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 -#: app/scripts/services/blocks.js:863 +#: app/scripts/services/blocks.js:712 app/scripts/services/blocks.js:792 +#: app/scripts/services/blocks.js:865 msgid "Update the block name" msgstr "Mettre le nom du bloc à jour" -#: app/views/menu.html:216 +#: app/views/menu.html:225 msgid "Upload" msgstr "Télécharger" -#: app/views/menu.html:210 +#: app/scripts/controllers/menu.js:543 +msgid "Upload done" +msgstr "Téléchargement terminé" + +#: app/scripts/controllers/menu.js:519 +msgid "Verification done" +msgstr "Vérification faite" + +#: app/views/menu.html:219 msgid "Verify" msgstr "Vérifier" -#: app/scripts/controllers/menu.js:189 -msgid "Verilog code exported" -msgstr "Code Verilog exporté" - -#: app/scripts/services/utils.js:533 app/views/menu.html:298 +#: app/scripts/services/utils.js:531 app/views/menu.html:307 msgid "Version" msgstr "Version" -#: app/views/menu.html:150 +#: app/views/menu.html:158 msgid "View" msgstr "Vue" -#: app/views/menu.html:295 +#: app/views/menu.html:304 msgid "View license" msgstr "Voir la licence" +#: app/scripts/services/tools.js:421 +msgid "Warnings detected in the design" +msgstr "" + #: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Mauvais format de bloc: {{type}}" #: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 -#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:783 +#: app/scripts/services/blocks.js:857 app/scripts/services/blocks.js:892 msgid "Wrong block name {{name}}" msgstr "Mauvais nom de bloc {{name}}" @@ -759,20 +790,20 @@ msgstr "Mauvais nom de paramètre {{name}}" msgid "Wrong port name {{name}}" msgstr "Mauvais nom de port {{name}}" -#: app/scripts/services/project.js:139 +#: app/scripts/services/project.js:141 msgid "Wrong project format: {{name}}" msgstr "Mauvais format de projet: {{name}}" -#: app/scripts/services/tools.js:365 +#: app/scripts/services/tools.js:450 msgid "Wrong remote hostname {{name}}" msgstr "Mauvais nom d'hôte distant {{name}}" -#: app/scripts/services/project.js:110 +#: app/scripts/services/project.js:112 msgid "You can load it as it is or convert it for the {{name}} board." msgstr "" "Vous pouvez le charger tel quel ou le convertir pour la carte {{name}}." -#: app/scripts/controllers/menu.js:238 +#: app/scripts/controllers/menu.js:251 msgid "Your changes will be lost if you don’t save them" msgstr "Vos modifications seront perdues si vous ne les sauvegardez pas" @@ -780,52 +811,65 @@ msgstr "Vos modifications seront perdues si vous ne les sauvegardez pas" msgid "back" msgstr "retour" -#. Build done -#: app/scripts/services/tools.js:380 -msgid "done_build" -msgstr "Construction terminée" - -#. Upload done -#: app/scripts/services/tools.js:382 -msgid "done_upload" -msgstr "Téléchargement terminé" - -#. Verification done -#: app/scripts/services/tools.js:378 -msgid "done_verify" -msgstr "Vérification faite" - -#. Start building ... -#: app/scripts/services/tools.js:61 -msgid "start_build" -msgstr "Début de la construction" - -#. Start uploading ... -#: app/scripts/services/tools.js:63 -msgid "start_upload" -msgstr "Début du téléchargement" - -#. Start verification ... -#: app/scripts/services/tools.js:59 -msgid "start_verify" -msgstr "Début de la vérification" - -#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:859 +#: app/scripts/services/drivers.js:109 app/scripts/services/utils.js:862 msgid "{{app}} is required." msgstr "{{app}} est requis." -#: app/scripts/controllers/menu.js:396 +#: app/scripts/controllers/menu.js:430 msgid "{{board}} datasheet not defined" msgstr "Documentation {{board}} non définie" -#: app/scripts/controllers/menu.js:386 +#: app/scripts/controllers/menu.js:420 msgid "{{board}} pinout not defined" msgstr "Pinout {{board}} non défini" -#: app/scripts/controllers/menu.js:415 +#: app/scripts/controllers/menu.js:449 msgid "{{board}} rules not defined" msgstr "Règles {{board}} non définies" +#: app/scripts/controllers/menu.js:201 app/scripts/controllers/menu.js:224 +msgid "{{name}} exported" +msgstr "" + +#~ msgid "Errors detected in the code" +#~ msgstr "Erreurs détectées dans le code" + +#~ msgid "GTKWave exported" +#~ msgstr "GTKWave exporté" + +#~ msgid "PCF file exported" +#~ msgstr "Fichier PCF exporté" + +#~ msgid "Reset view" +#~ msgstr "Réinitialiser la vue" + +#~ msgid "Testbench exported" +#~ msgstr "Testbench exporté" + +#~ msgid "Toolchain not installed. Please, install the toolchain" +#~ msgstr "La toolchain n'est pas installée. Veuillez installer la toolchain" + +#~ msgid "Verilog code exported" +#~ msgstr "Code Verilog exporté" + +#~ msgid "done_build" +#~ msgstr "Construction terminée" + +#~ msgid "done_upload" +#~ msgstr "Téléchargement terminé" + +#~ msgid "done_verify" +#~ msgstr "Vérification faite" + +#~ msgid "start_build" +#~ msgstr "Début de la construction" + +#~ msgid "start_upload" +#~ msgstr "Début du téléchargement" + +#~ msgid "start_verify" +#~ msgstr "Début de la vérification" + #~ msgid "Do you want to convert it?" #~ msgstr "Voulez-vous le convertir ?" diff --git a/app/resources/locale/gl_ES/gl_ES.po b/app/resources/locale/gl_ES/gl_ES.po index cf4620aae..baae30386 100644 --- a/app/resources/locale/gl_ES/gl_ES.po +++ b/app/resources/locale/gl_ES/gl_ES.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"Project-Id-Version: icestudio 0.3.0-beta3\n" +"Project-Id-Version: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: Xoan Sampaiño \n" @@ -12,11 +12,11 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: app/scripts/services/drivers.js:200 app/scripts/services/drivers.js:81 +#: app/scripts/services/drivers.js:211 app/scripts/services/drivers.js:87 msgid "Unplug and reconnect the board" msgstr "Desconecta e conecta de novo a placa" -#: app/scripts/services/drivers.js:189 +#: app/scripts/services/drivers.js:195 msgid "" "

    FTDI driver installation instructions

    1. Connect the FPGA " "board
    2. Replace the (Interface 0) driver of the board by " @@ -26,7 +26,7 @@ msgstr "" "a placa FPGA
    3. Troca o controlador (Interface 0) da placa por " "libusbK
    4. Desconecta e conecta de novo a placa
    " -#: app/scripts/services/drivers.js:207 +#: app/scripts/services/drivers.js:218 msgid "" "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB " "Device
    2. Select the board interface and uninstall the driver
    " @@ -35,35 +35,35 @@ msgstr "" "o dispositivo USB da placa FPGA
  • Selecciona a interfaz da placa e " "desinstala o controlador
  • " -#: app/views/menu.html:313 +#: app/views/menu.html:322 msgid "About Icestudio" msgstr "Acerca de Icestudio" -#: app/views/menu.html:267 +#: app/views/menu.html:276 msgid "Add" msgstr "Engadir" -#: app/scripts/controllers/menu.js:511 +#: app/scripts/controllers/menu.js:562 msgid "Add a block to start" msgstr "Engada un bloque para comezar" -#: app/views/menu.html:43 +#: app/views/menu.html:46 msgid "Add as block" msgstr "Engadir como bloque" -#: app/scripts/services/tools.js:889 +#: app/scripts/services/tools.js:1036 msgid "All collections removed" msgstr "Elimináronse todas as coleccións" -#: app/scripts/controllers/menu.js:533 +#: app/scripts/controllers/menu.js:586 msgid "All stored collections will be lost. Do you want to continue?" msgstr "Perderanse todas as coleccións gardadas. Desexa continuar?" -#: app/scripts/services/utils.js:535 +#: app/scripts/services/utils.js:533 msgid "Author" msgstr "Autor" -#: app/views/menu.html:324 +#: app/views/menu.html:333 msgid "Basic" msgstr "Básico" @@ -71,50 +71,54 @@ msgstr "Básico" msgid "Basque" msgstr "Euskera" -#: app/scripts/services/blocks.js:755 app/scripts/services/blocks.js:776 -#: app/scripts/services/blocks.js:831 app/scripts/services/blocks.js:850 -#: app/scripts/services/blocks.js:885 app/scripts/services/blocks.js:928 -#: app/scripts/services/blocks.js:962 +#: app/scripts/services/blocks.js:757 app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:833 app/scripts/services/blocks.js:852 +#: app/scripts/services/blocks.js:887 app/scripts/services/blocks.js:930 +#: app/scripts/services/blocks.js:965 msgid "Block updated" msgstr "Bloque actualizado" -#: app/scripts/services/project.js:426 +#: app/scripts/services/project.js:433 msgid "Block {{name}} imported" msgstr "Importouse o bloque {{name}}" -#: app/views/menu.html:35 +#: app/views/menu.html:38 msgid "Blocks" msgstr "Bloques" -#: app/views/menu.html:174 +#: app/views/menu.html:183 msgid "Board" msgstr "Placa" -#: app/views/menu.html:115 app/views/menu.html:162 +#: app/views/menu.html:127 app/views/menu.html:170 msgid "Board rules" msgstr "Regras da placa" -#: app/scripts/controllers/menu.js:337 +#: app/scripts/controllers/menu.js:371 msgid "Board rules disabled" msgstr "Deshabilitáronse as regras da placa" -#: app/scripts/controllers/menu.js:332 +#: app/scripts/controllers/menu.js:366 msgid "Board rules enabled" msgstr "Habilitáronse as regras da placa" -#: app/scripts/services/tools.js:254 +#: app/scripts/services/tools.js:333 msgid "Board {{name}} not detected" msgstr "Non se detectou a placa {{name}}" -#: app/scripts/controllers/menu.js:476 +#: app/scripts/controllers/menu.js:510 msgid "Board {{name}} selected" msgstr "Seleccionouse a placa {{name}}" -#: app/views/menu.html:213 +#: app/views/menu.html:222 msgid "Build" msgstr "Sintetizar" -#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:144 +#: app/scripts/controllers/menu.js:531 +msgid "Build done" +msgstr "Sintetizado realizado" + +#: app/scripts/controllers/main.js:16 app/scripts/services/project.js:146 msgid "Cancel" msgstr "Cancelar" @@ -122,87 +126,101 @@ msgstr "Cancelar" msgid "Catalan" msgstr "Catalán" -#: app/scripts/services/tools.js:605 +#: app/scripts/services/tools.js:727 msgid "Check Internet connection..." msgstr "Comprobando a conexión a Internet..." -#: app/scripts/services/tools.js:613 +#: app/scripts/services/tools.js:737 msgid "Check Python..." msgstr "Comprobando Python..." -#: app/scripts/services/drivers.js:104 +#: app/scripts/services/tools.js:819 +msgid "Click here to setup the drivers" +msgstr "" + +#: app/scripts/services/drivers.js:110 app/scripts/services/drivers.js:203 +#: app/scripts/services/drivers.js:225 app/scripts/services/tools.js:132 +#: app/scripts/services/tools.js:246 msgid "Click here to install it" msgstr "" -#: app/views/menu.html:338 +#: app/scripts/controllers/menu.js:326 +msgid "Click here to view" +msgstr "" + +#: app/scripts/controllers/menu.js:247 +msgid "Close" +msgstr "" + +#: app/views/menu.html:347 msgid "Code" msgstr "Código" -#: app/views/menu.html:185 +#: app/views/menu.html:194 msgid "Collection" msgstr "Colección" -#: app/views/menu.html:165 +#: app/views/menu.html:174 msgid "Collection info" msgstr "" -#: app/scripts/controllers/menu.js:434 +#: app/scripts/controllers/menu.js:468 msgid "Collection {{collection}} info not defined" msgstr "" -#: app/scripts/services/tools.js:773 +#: app/scripts/services/tools.js:920 msgid "Collection {{name}} added" msgstr "Engadiuse a coleción {{name}}" -#: app/scripts/services/tools.js:767 +#: app/scripts/services/tools.js:914 msgid "Collection {{name}} not replaced" msgstr "Non se trocou a colección {{name}}" -#: app/scripts/services/tools.js:883 +#: app/scripts/services/tools.js:1030 msgid "Collection {{name}} removed" msgstr "Eliminouse a colección {{name}}" -#: app/scripts/services/tools.js:763 +#: app/scripts/services/tools.js:910 msgid "Collection {{name}} replaced" msgstr "Trocouse a colección {{name}}" -#: app/scripts/controllers/menu.js:442 +#: app/scripts/controllers/menu.js:476 msgid "Collection {{name}} selected" msgstr "Seleccionouse a colección {{name}}" -#: app/views/menu.html:263 +#: app/views/menu.html:272 msgid "Collections" msgstr "Coleccións" -#: app/views/menu.html:309 +#: app/views/menu.html:318 msgid "Community forum" msgstr "Foro da comunidade" -#: app/views/menu.html:335 +#: app/views/menu.html:344 msgid "Constant" msgstr "Constante" -#: app/scripts/services/project.js:106 +#: app/scripts/services/project.js:108 msgid "Convert" msgstr "" -#: app/views/menu.html:91 +#: app/views/menu.html:104 msgid "Copy" msgstr "Copiar" -#: app/views/menu.html:88 +#: app/views/menu.html:101 msgid "Cut" msgstr "Cortar" -#: app/views/menu.html:159 +#: app/views/menu.html:167 msgid "Datasheet" msgstr "Folla de datos" -#: app/views/menu.html:190 +#: app/views/menu.html:199 msgid "Default" msgstr "Predeterminado" -#: app/scripts/services/tools.js:481 +#: app/scripts/services/tools.js:603 msgid "" "Default toolchain not found. Toolchain will be downloaded. This operation " "requires Internet connection. Do you want to continue?" @@ -210,43 +228,43 @@ msgstr "" "Non se atopou a cadea de ferramentas predeterminada, e procederase á sua " "descarga. Esta operación require dunha conexión a Internet. Desexa continuar?" -#: app/scripts/services/utils.js:534 +#: app/scripts/services/utils.js:532 msgid "Description" msgstr "Descripción" -#: app/views/menu.html:126 app/views/menu.html:256 +#: app/views/menu.html:138 app/views/menu.html:265 msgid "Disable" msgstr "Deshabilitar" -#: app/scripts/controllers/menu.js:237 +#: app/scripts/controllers/menu.js:250 msgid "Do you want to close the application?" msgstr "Desexa pechar a aplicación?" -#: app/scripts/controllers/menu.js:523 +#: app/scripts/controllers/menu.js:576 msgid "Do you want to remove the {{name}} collection?" msgstr "Desexa eliminar a colección {{name}}?" -#: app/scripts/services/tools.js:759 +#: app/scripts/services/tools.js:906 msgid "Do you want to replace it?" msgstr "Desexa trocalo?" -#: app/views/menu.html:302 +#: app/views/menu.html:311 msgid "Documentation" msgstr "Documentación" -#: app/views/menu.html:247 +#: app/views/menu.html:256 msgid "Drivers" msgstr "Controladores" -#: app/scripts/services/drivers.js:128 app/scripts/services/drivers.js:78 +#: app/scripts/services/drivers.js:134 app/scripts/services/drivers.js:72 msgid "Drivers disabled" msgstr "Deshabilitáronse os controladores" -#: app/scripts/services/drivers.js:120 app/scripts/services/drivers.js:75 +#: app/scripts/services/drivers.js:126 app/scripts/services/drivers.js:63 msgid "Drivers enabled" msgstr "Habilitáronse os controladores" -#: app/scripts/services/tools.js:265 +#: app/scripts/services/tools.js:344 msgid "Duplicated FPGA I/O ports" msgstr "Os portos E/S da FPGA están duplicados" @@ -254,15 +272,15 @@ msgstr "Os portos E/S da FPGA están duplicados" msgid "Duplicated block attributes" msgstr "Os atributos do bloque están duplicados" -#: app/views/menu.html:78 +#: app/views/menu.html:91 msgid "Edit" msgstr "Editar" -#: app/scripts/services/tools.js:748 +#: app/scripts/services/tools.js:895 msgid "Edit the collection name" msgstr "" -#: app/views/menu.html:121 app/views/menu.html:251 +#: app/views/menu.html:133 app/views/menu.html:260 msgid "Enable" msgstr "Habilitar" @@ -294,73 +312,73 @@ msgstr "Introduza os portos de saída" msgid "Enter the parameters" msgstr "Introduza os parámetros" -#: app/scripts/controllers/menu.js:324 +#: app/scripts/controllers/menu.js:358 msgid "Enter the remote hostname user@host (experimental)" msgstr "Introduza o nome do equipo remoto: usuario@equipo (experimental)" -#: app/scripts/services/tools.js:504 +#: app/scripts/services/tools.js:626 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "Erro: non se atopou a cadea de ferramentas predeterminada en '{{dir}}'" -#: app/scripts/services/utils.js:675 +#: app/scripts/services/utils.js:678 msgid "Error: {{error}}" msgstr "Erro: {{error}}" -#: app/scripts/services/tools.js:336 -msgid "Errors detected in the code" +#: app/scripts/services/tools.js:418 +msgid "Errors detected in the design" msgstr "" -#: app/views/menu.html:39 +#: app/views/menu.html:42 msgid "Examples" msgstr "Exemplos" -#: app/scripts/services/tools.js:206 +#: app/scripts/services/tools.js:275 msgid "Execute remote {{label}} ..." msgstr "Executando {{label}} remoto..." -#: app/views/menu.html:54 +#: app/views/menu.html:57 msgid "Export" msgstr "Exportar" -#: app/scripts/services/tools.js:637 +#: app/scripts/services/tools.js:762 msgid "Extract default apio files..." msgstr "Extraíndo os ficheiros de apio..." -#: app/scripts/services/tools.js:647 +#: app/scripts/services/tools.js:772 msgid "Extract default apio packages..." msgstr "Extraíndo os paquetes de apio..." -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:750 msgid "Extract virtual env files..." msgstr "Extraíndo ficheiros do contorno virtual..." -#: app/scripts/services/tools.js:262 +#: app/scripts/services/tools.js:341 msgid "FPGA I/O ports not defined" msgstr "Portos E/S da FPGA non definidos" #: app/scripts/services/blocks.js:115 app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:711 app/scripts/services/blocks.js:791 +#: app/scripts/services/blocks.js:713 app/scripts/services/blocks.js:793 msgid "FPGA pin" msgstr "Pin da FPGA" -#: app/views/menu.html:26 +#: app/views/menu.html:29 msgid "File" msgstr "Ficheiro" -#: app/scripts/services/project.js:438 +#: app/scripts/services/project.js:448 msgid "" "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "Xa existe o ficheiro {{file}} no cartafol do proxecto. Desexa trocalo?" -#: app/scripts/services/tools.js:182 +#: app/scripts/services/tools.js:214 msgid "File {{file}} does not exist" msgstr "O ficheiro {{file}} non existe" -#: app/scripts/services/project.js:472 +#: app/scripts/services/project.js:482 msgid "File {{file}} imported" msgstr "Importouse o ficheiro {{file}}" -#: app/views/menu.html:104 +#: app/views/menu.html:114 msgid "Fit content" msgstr "Axustar contido" @@ -368,116 +386,116 @@ msgstr "Axustar contido" msgid "French" msgstr "Francés" -#: app/scripts/controllers/menu.js:216 -msgid "GTKWave exported" -msgstr "Exportouse o ficheiro para GTKWave" - #: app/views/languages.html:16 msgid "Galician" msgstr "Galego" -#: app/views/menu.html:292 +#: app/views/menu.html:301 msgid "Help" msgstr "Axuda" -#: app/scripts/services/utils.js:548 +#: app/scripts/services/utils.js:546 msgid "Image" msgstr "Imaxe" -#: app/scripts/controllers/menu.js:683 +#: app/scripts/controllers/menu.js:735 msgid "Image {{name}} saved" msgstr "Gardouse a imaxe {{name}}" -#: app/views/menu.html:341 +#: app/views/menu.html:350 msgid "Information" msgstr "Información" -#: app/views/menu.html:329 +#: app/views/menu.html:338 msgid "Input" msgstr "Entrada" -#: app/views/menu.html:224 +#: app/views/menu.html:233 msgid "Install" msgstr "Instalar" -#: app/scripts/services/tools.js:642 +#: app/scripts/services/tools.js:767 msgid "Install default apio..." msgstr "Instalando apio..." -#: app/scripts/services/tools.js:691 +#: app/scripts/services/tools.js:816 msgid "Installation completed" msgstr "Instalación completada" -#: app/scripts/services/tools.js:534 app/scripts/services/tools.js:571 +#: app/scripts/services/tools.js:657 app/scripts/services/tools.js:692 msgid "Installing toolchain" msgstr "Instalando a cadea de ferramentas..." -#: app/scripts/services/drivers.js:112 app/scripts/services/tools.js:607 +#: app/scripts/services/drivers.js:118 app/scripts/services/tools.js:731 msgid "Internet connection required" msgstr "Requírese dunha conexión a Internet" -#: app/scripts/services/graph.js:179 +#: app/scripts/services/graph.js:178 msgid "Invalid Pull up connection:
    block already connected" msgstr "" "A conexión pull-up non é válida:
    o bloque xa se atopa conectado" -#: app/scripts/services/graph.js:193 +#: app/scripts/services/graph.js:192 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" "A conexión pull-up non é válida:
    tan só permítense os bloques " "Entrada" -#: app/scripts/services/graph.js:185 +#: app/scripts/services/graph.js:184 msgid "Invalid block connection:
    Pull up already connected" msgstr "" "A conexión do bloque non é válida:
    xa existe unha conexión pull-up" -#: app/scripts/services/tools.js:779 +#: app/scripts/services/tools.js:926 msgid "Invalid collection {{name}}" msgstr "A colección {{name}} non é válida" -#: app/scripts/services/graph.js:143 app/scripts/services/graph.js:150 -#: app/scripts/services/graph.js:157 +#: app/scripts/services/graph.js:142 app/scripts/services/graph.js:149 +#: app/scripts/services/graph.js:156 msgid "Invalid connection" msgstr "Conexión non válida" -#: app/scripts/services/graph.js:212 +#: app/scripts/services/graph.js:211 msgid "Invalid connection: {{a}} → {{b}}" msgstr "Conexión non válida: {{a}} → {{b}}" -#: app/scripts/services/graph.js:173 +#: app/scripts/services/graph.js:172 msgid "Invalid multiple input connections" msgstr "Conexións de entrada múltiple non válida" -#: app/scripts/services/drivers.js:190 +#: app/scripts/services/utils.js:259 +msgid "Invalid project format" +msgstr "" + +#: app/scripts/services/drivers.js:196 msgid "It is recommended to use USB 2.0 ports" msgstr "" -#: app/views/menu.html:134 +#: app/views/menu.html:121 msgid "Language" msgstr "Idioma" -#: app/scripts/services/project.js:105 +#: app/scripts/services/project.js:107 msgid "Load" msgstr "" -#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:864 +#: app/scripts/services/blocks.js:186 app/scripts/services/blocks.js:866 msgid "Local parameter" msgstr "Parámetro local" -#: app/scripts/services/tools.js:630 +#: app/scripts/services/tools.js:755 msgid "Make virtual env..." msgstr "Creando o contorno virtual..." -#: app/scripts/services/utils.js:755 +#: app/scripts/services/utils.js:758 msgid "Maximum bus size: 96 bits" msgstr "" -#: app/scripts/services/utils.js:532 +#: app/scripts/services/utils.js:530 msgid "Name" msgstr "Nome" -#: app/views/menu.html:29 +#: app/views/menu.html:32 msgid "New" msgstr "Novo" @@ -485,131 +503,128 @@ msgstr "Novo" msgid "New project {{name}} created" msgstr "Novo proxecto {{name}} creado" -#: app/scripts/controllers/menu.js:541 +#: app/scripts/controllers/menu.js:594 msgid "No collections stored" msgstr "Non hay coleccións gardadas" -#: app/scripts/controllers/main.js:15 app/scripts/services/project.js:143 +#: app/scripts/controllers/main.js:15 app/scripts/controllers/menu.js:260 +#: app/scripts/services/project.js:145 msgid "OK" msgstr "Aceptar" -#: app/scripts/services/project.js:377 app/scripts/services/project.js:99 +#: app/scripts/services/project.js:101 app/scripts/services/project.js:384 msgid "Old project format {{version}}" msgstr "O formato {{version}} do proxecto é antigo" -#: app/views/menu.html:32 +#: app/views/menu.html:35 msgid "Open" msgstr "Abrir" -#: app/scripts/services/utils.js:555 +#: app/scripts/services/utils.js:553 msgid "Open SVG" msgstr "Abrir SVG" -#: app/scripts/services/project.js:475 +#: app/scripts/services/project.js:485 msgid "Original file {{file}} does not exist" msgstr "Non existe o ficheiro {{name}} orixinal" -#: app/views/menu.html:332 +#: app/views/menu.html:341 msgid "Output" msgstr "Saída" -#: app/scripts/controllers/menu.js:198 -msgid "PCF file exported" -msgstr "Ficheiro PCF exportado" - -#: app/views/menu.html:94 +#: app/views/menu.html:107 msgid "Paste" msgstr "Pegar" -#: app/scripts/services/utils.js:884 +#: app/scripts/services/utils.js:887 msgid "Please run: {{cmd}}" msgstr "" -#: app/views/menu.html:108 +#: app/views/menu.html:118 msgid "Preferences" msgstr "Preferencias" -#: app/views/menu.html:111 +#: app/views/menu.html:152 msgid "Project information" msgstr "Información do proxecto" -#: app/scripts/services/project.js:131 +#: app/scripts/controllers/menu.js:326 app/scripts/controllers/menu.js:340 +msgid "Project information updated" +msgstr "" + +#: app/scripts/services/project.js:133 msgid "Project {{name}} loaded" msgstr "Proxecto {{name}} cargado" -#: app/scripts/services/project.js:346 +#: app/scripts/services/project.js:349 msgid "Project {{name}} saved" msgstr "Proxecto {{name}} gardado" -#: app/scripts/services/tools.js:618 +#: app/scripts/services/tools.js:744 msgid "Python 2.7 is required" msgstr "Requírese Python 2.7" -#: app/views/menu.html:72 +#: app/views/menu.html:85 msgid "Quit" msgstr "Saír" -#: app/scripts/services/blocks.js:948 app/views/design.html:5 +#: app/scripts/services/blocks.js:950 app/views/design.html:5 msgid "Read only" msgstr "Só lectura" -#: app/views/menu.html:84 +#: app/views/menu.html:97 msgid "Redo" msgstr "Refacer" -#: app/scripts/services/tools.js:368 +#: app/scripts/services/tools.js:453 msgid "Remote host {{name}} not connected" msgstr "Non se puido conectar ó equipo remoto {{name}}" -#: app/views/menu.html:140 +#: app/views/menu.html:145 msgid "Remote hostname" msgstr "Nome do equipo remoto" -#: app/views/menu.html:232 app/views/menu.html:271 +#: app/views/menu.html:241 app/views/menu.html:280 msgid "Remove" msgstr "Eliminar" -#: app/views/menu.html:283 +#: app/views/menu.html:292 msgid "Remove all" msgstr "Eliminar todo" -#: app/scripts/services/utils.js:557 +#: app/scripts/services/utils.js:555 msgid "Reset SVG" msgstr "Restablecer SVG" -#: app/views/menu.html:237 +#: app/views/menu.html:246 msgid "Reset default" msgstr "Restablecer predeterminado" -#: app/views/menu.html:101 -msgid "Reset view" -msgstr "Restablecer vista" - -#: app/views/menu.html:47 +#: app/views/menu.html:50 msgid "Save" msgstr "Gardar" -#: app/scripts/services/utils.js:556 +#: app/scripts/services/utils.js:554 msgid "Save SVG" msgstr "Gardar SVG" -#: app/views/menu.html:50 +#: app/views/menu.html:53 msgid "Save as" msgstr "Gardar como" -#: app/views/menu.html:171 +#: app/views/menu.html:180 msgid "Select" msgstr "Seleccionar" -#: app/views/menu.html:97 +#: app/views/menu.html:110 msgid "Select all" msgstr "Seleccionar todo" -#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:712 +#: app/scripts/services/blocks.js:54 app/scripts/services/blocks.js:714 msgid "Show clock" msgstr "Mostrar reloxo" -#: app/views/menu.html:305 +#: app/views/menu.html:314 msgid "Source code" msgstr "Código fonte" @@ -617,23 +632,31 @@ msgstr "Código fonte" msgid "Spanish" msgstr "Castelán" -#: app/scripts/services/tools.js:195 +#: app/scripts/controllers/menu.js:530 +msgid "Start build" +msgstr "Iniciando o sintetizado" + +#: app/scripts/controllers/menu.js:542 +msgid "Start upload" +msgstr "Iniciando a carga" + +#: app/scripts/controllers/menu.js:518 +msgid "Start verification" +msgstr "Iniciando a verificación" + +#: app/scripts/services/tools.js:264 msgid "Synchronize remote files ..." msgstr "Sincronizando ficheiros remotos..." -#: app/views/menu.html:63 +#: app/views/menu.html:66 msgid "Testbench" msgstr "Testbench" -#: app/scripts/controllers/menu.js:207 -msgid "Testbench exported" -msgstr "Testbench exportado" - -#: app/scripts/services/tools.js:758 +#: app/scripts/services/tools.js:905 msgid "The collection {{name}} already exists." msgstr "A colección {{name}} xa existe." -#: app/scripts/controllers/menu.js:463 +#: app/scripts/controllers/menu.js:497 msgid "" "The current FPGA I/O configuration will be lost. Do you want to change to " "{{name}} board?" @@ -641,17 +664,17 @@ msgstr "" "Perderase a configuración actual de E/S da FPGA. Desexa cambiar á placa " "{{name}}?" -#: app/scripts/services/tools.js:509 +#: app/scripts/services/tools.js:631 msgid "The toolchain will be removed. Do you want to continue?" msgstr "Vaise eliminar a cadea de ferramentas. Desexa continuar?" -#: app/scripts/services/tools.js:497 +#: app/scripts/services/tools.js:619 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "" "Vaise restaurar a cadea de ferramentas coa configuración predeterminada. " "Desexa continuar?" -#: app/scripts/services/tools.js:489 +#: app/scripts/services/tools.js:611 msgid "" "The toolchain will be updated. This operation requires Internet connection. " "Do you want to continue?" @@ -659,7 +682,7 @@ msgstr "" "Vaise actualizar a cadea de ferramentas. Esta operación require dunha " "conexión a Internet. Desexa continuar?" -#: app/scripts/services/project.js:400 +#: app/scripts/services/project.js:407 msgid "" "This import operation requires a project path. You need to save the current " "project. Do you want to continue?" @@ -667,87 +690,95 @@ msgstr "" "É necesario gardar o proxecto actual xa que a operación de importación " "require dun cartafol do proxecto. Desexa continuar?" -#: app/scripts/services/project.js:109 +#: app/scripts/services/project.js:111 msgid "This project is designed for the {{name}} board." msgstr "Este proxecto está deseñado para a placa {{name}}" -#: app/views/menu.html:220 +#: app/views/menu.html:229 msgid "Toolchain" msgstr "Cadea de ferramentas" -#: app/scripts/services/tools.js:692 +#: app/scripts/services/tools.js:818 msgid "Toolchain installed" msgstr "Instalouse a cadea de ferramentas" -#: app/scripts/services/tools.js:695 +#: app/scripts/services/drivers.js:203 app/scripts/services/drivers.js:225 +#: app/scripts/services/tools.js:132 app/scripts/services/tools.js:834 msgid "Toolchain not installed" msgstr "Non se instalou a cadea de ferramentas" -#: app/scripts/services/drivers.js:197 app/scripts/services/drivers.js:213 -#: app/scripts/services/tools.js:94 -msgid "Toolchain not installed. Please, install the toolchain" -msgstr "A cadea de ferramentas non está instalada. Por favor, instálea." - -#: app/scripts/services/tools.js:514 +#: app/scripts/services/tools.js:636 msgid "Toolchain removed" msgstr "Eliminouse a cadea de ferramentas" -#: app/views/menu.html:207 +#: app/scripts/services/tools.js:246 +msgid "Toolchain version does not match" +msgstr "" + +#: app/views/menu.html:216 msgid "Tools" msgstr "Ferramentas" -#: app/views/menu.html:81 +#: app/views/menu.html:94 msgid "Undo" msgstr "Desfacer" -#: app/scripts/services/tools.js:257 +#: app/scripts/services/tools.js:336 msgid "Unknown board" msgstr "Placa desconocida" -#: app/scripts/app.js:44 +#: app/scripts/app.js:48 msgid "Untitled" msgstr "Sen título" -#: app/views/menu.html:227 +#: app/views/menu.html:236 msgid "Update" msgstr "Actualizar" -#: app/scripts/services/blocks.js:710 app/scripts/services/blocks.js:790 -#: app/scripts/services/blocks.js:863 +#: app/scripts/services/blocks.js:712 app/scripts/services/blocks.js:792 +#: app/scripts/services/blocks.js:865 msgid "Update the block name" msgstr "Actualizar o nome do bloque" -#: app/views/menu.html:216 +#: app/views/menu.html:225 msgid "Upload" msgstr "Cargar" -#: app/views/menu.html:210 +#: app/scripts/controllers/menu.js:543 +msgid "Upload done" +msgstr "Carga realizada" + +#: app/scripts/controllers/menu.js:519 +msgid "Verification done" +msgstr "Verificación realizada" + +#: app/views/menu.html:219 msgid "Verify" msgstr "Verificar" -#: app/scripts/controllers/menu.js:189 -msgid "Verilog code exported" -msgstr "Código Verilog exportado" - -#: app/scripts/services/utils.js:533 app/views/menu.html:298 +#: app/scripts/services/utils.js:531 app/views/menu.html:307 msgid "Version" msgstr "Versión" -#: app/views/menu.html:150 +#: app/views/menu.html:158 msgid "View" msgstr "Ver" -#: app/views/menu.html:295 +#: app/views/menu.html:304 msgid "View license" msgstr "Ver licenza" +#: app/scripts/services/tools.js:421 +msgid "Warnings detected in the design" +msgstr "" + #: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "Formato de bloque incorrecto: {{type}}" #: app/scripts/services/blocks.js:134 app/scripts/services/blocks.js:205 -#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:781 -#: app/scripts/services/blocks.js:855 app/scripts/services/blocks.js:890 +#: app/scripts/services/blocks.js:75 app/scripts/services/blocks.js:783 +#: app/scripts/services/blocks.js:857 app/scripts/services/blocks.js:892 msgid "Wrong block name {{name}}" msgstr "O nome do bloque {{name}} non é correcto" @@ -759,19 +790,19 @@ msgstr "O nome do parámetro {{name}} non é correcto" msgid "Wrong port name {{name}}" msgstr "O nome do porto {{name}} non é correcto" -#: app/scripts/services/project.js:139 +#: app/scripts/services/project.js:141 msgid "Wrong project format: {{name}}" msgstr "O formato do proxecto {{name}} non é correcto" -#: app/scripts/services/tools.js:365 +#: app/scripts/services/tools.js:450 msgid "Wrong remote hostname {{name}}" msgstr "O nome do equipo remoto {{name}} non é correcto" -#: app/scripts/services/project.js:110 +#: app/scripts/services/project.js:112 msgid "You can load it as it is or convert it for the {{name}} board." msgstr "" -#: app/scripts/controllers/menu.js:238 +#: app/scripts/controllers/menu.js:251 msgid "Your changes will be lost if you don’t save them" msgstr "Os cambios realizados perderanse se non se gardan" @@ -779,52 +810,62 @@ msgstr "Os cambios realizados perderanse se non se gardan" msgid "back" msgstr "Atrás" -#. Build done -#: app/scripts/services/tools.js:380 -msgid "done_build" -msgstr "Sintetizado realizado" - -#. Upload done -#: app/scripts/services/tools.js:382 -msgid "done_upload" -msgstr "Carga realizada" - -#. Verification done -#: app/scripts/services/tools.js:378 -msgid "done_verify" -msgstr "Verificación realizada" - -#. Start building ... -#: app/scripts/services/tools.js:61 -msgid "start_build" -msgstr "Iniciando o sintetizado..." - -#. Start uploading ... -#: app/scripts/services/tools.js:63 -msgid "start_upload" -msgstr "Iniciando a carga..." - -#. Start verification ... -#: app/scripts/services/tools.js:59 -msgid "start_verify" -msgstr "Iniciando a verificación..." - -#: app/scripts/services/drivers.js:103 app/scripts/services/utils.js:859 +#: app/scripts/services/drivers.js:109 app/scripts/services/utils.js:862 msgid "{{app}} is required." msgstr "" -#: app/scripts/controllers/menu.js:396 +#: app/scripts/controllers/menu.js:430 msgid "{{board}} datasheet not defined" msgstr "Non se definiu a folla de datos para a placa {{board}}" -#: app/scripts/controllers/menu.js:386 +#: app/scripts/controllers/menu.js:420 msgid "{{board}} pinout not defined" msgstr "Non se definiu o pinout para a placa {{board}}" -#: app/scripts/controllers/menu.js:415 +#: app/scripts/controllers/menu.js:449 msgid "{{board}} rules not defined" msgstr "Non se definiron as regras para a placa {{board}}" +#: app/scripts/controllers/menu.js:201 app/scripts/controllers/menu.js:224 +msgid "{{name}} exported" +msgstr "" + +#~ msgid "GTKWave exported" +#~ msgstr "Exportouse o ficheiro para GTKWave" + +#~ msgid "PCF file exported" +#~ msgstr "Ficheiro PCF exportado" + +#~ msgid "Reset view" +#~ msgstr "Restablecer vista" + +#~ msgid "Testbench exported" +#~ msgstr "Testbench exportado" + +#~ msgid "Toolchain not installed. Please, install the toolchain" +#~ msgstr "A cadea de ferramentas non está instalada. Por favor, instálea." + +#~ msgid "Verilog code exported" +#~ msgstr "Código Verilog exportado" + +#~ msgid "done_build" +#~ msgstr "Sintetizado realizado" + +#~ msgid "done_upload" +#~ msgstr "Carga realizada" + +#~ msgid "done_verify" +#~ msgstr "Verificación realizada" + +#~ msgid "start_build" +#~ msgstr "Iniciando o sintetizado..." + +#~ msgid "start_upload" +#~ msgstr "Iniciando a carga..." + +#~ msgid "start_verify" +#~ msgstr "Iniciando a verificación..." + #~ msgid "Do you want to convert it?" #~ msgstr "Desexa convertelo?" diff --git a/app/resources/locale/template.pot b/app/resources/locale/template.pot index d5e7c24fd..ea1f22885 100644 --- a/app/resources/locale/template.pot +++ b/app/resources/locale/template.pot @@ -4,48 +4,48 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: \n" -#: app/scripts/services/drivers.js:200 -#: app/scripts/services/drivers.js:81 +#: app/scripts/services/drivers.js:211 +#: app/scripts/services/drivers.js:87 msgid "Unplug and reconnect the board" msgstr "" -#: app/scripts/services/drivers.js:189 +#: app/scripts/services/drivers.js:195 msgid "

    FTDI driver installation instructions

    1. Connect the FPGA board
    2. Replace the (Interface 0) driver of the board by libusbK
    3. Unplug and reconnect the board
    " msgstr "" -#: app/scripts/services/drivers.js:207 +#: app/scripts/services/drivers.js:218 msgid "

    FTDI driver uninstallation instructions

    1. Find the FPGA USB Device
    2. Select the board interface and uninstall the driver
    " msgstr "" -#: app/views/menu.html:313 +#: app/views/menu.html:322 msgid "About Icestudio" msgstr "" -#: app/views/menu.html:267 +#: app/views/menu.html:276 msgid "Add" msgstr "" -#: app/scripts/controllers/menu.js:511 +#: app/scripts/controllers/menu.js:562 msgid "Add a block to start" msgstr "" -#: app/views/menu.html:43 +#: app/views/menu.html:46 msgid "Add as block" msgstr "" -#: app/scripts/services/tools.js:889 +#: app/scripts/services/tools.js:1036 msgid "All collections removed" msgstr "" -#: app/scripts/controllers/menu.js:533 +#: app/scripts/controllers/menu.js:586 msgid "All stored collections will be lost. Do you want to continue?" msgstr "" -#: app/scripts/services/utils.js:535 +#: app/scripts/services/utils.js:533 msgid "Author" msgstr "" -#: app/views/menu.html:324 +#: app/views/menu.html:333 msgid "Basic" msgstr "" @@ -53,55 +53,59 @@ msgstr "" msgid "Basque" msgstr "" -#: app/scripts/services/blocks.js:755 -#: app/scripts/services/blocks.js:776 -#: app/scripts/services/blocks.js:831 -#: app/scripts/services/blocks.js:850 -#: app/scripts/services/blocks.js:885 -#: app/scripts/services/blocks.js:928 -#: app/scripts/services/blocks.js:962 +#: app/scripts/services/blocks.js:757 +#: app/scripts/services/blocks.js:778 +#: app/scripts/services/blocks.js:833 +#: app/scripts/services/blocks.js:852 +#: app/scripts/services/blocks.js:887 +#: app/scripts/services/blocks.js:930 +#: app/scripts/services/blocks.js:965 msgid "Block updated" msgstr "" -#: app/scripts/services/project.js:426 +#: app/scripts/services/project.js:433 msgid "Block {{name}} imported" msgstr "" -#: app/views/menu.html:35 +#: app/views/menu.html:38 msgid "Blocks" msgstr "" -#: app/views/menu.html:174 +#: app/views/menu.html:183 msgid "Board" msgstr "" -#: app/views/menu.html:115 -#: app/views/menu.html:162 +#: app/views/menu.html:127 +#: app/views/menu.html:170 msgid "Board rules" msgstr "" -#: app/scripts/controllers/menu.js:337 +#: app/scripts/controllers/menu.js:371 msgid "Board rules disabled" msgstr "" -#: app/scripts/controllers/menu.js:332 +#: app/scripts/controllers/menu.js:366 msgid "Board rules enabled" msgstr "" -#: app/scripts/services/tools.js:254 +#: app/scripts/services/tools.js:333 msgid "Board {{name}} not detected" msgstr "" -#: app/scripts/controllers/menu.js:476 +#: app/scripts/controllers/menu.js:510 msgid "Board {{name}} selected" msgstr "" -#: app/views/menu.html:213 +#: app/views/menu.html:222 msgid "Build" msgstr "" +#: app/scripts/controllers/menu.js:531 +msgid "Build done" +msgstr "" + #: app/scripts/controllers/main.js:16 -#: app/scripts/services/project.js:144 +#: app/scripts/services/project.js:146 msgid "Cancel" msgstr "" @@ -109,130 +113,146 @@ msgstr "" msgid "Catalan" msgstr "" -#: app/scripts/services/tools.js:605 +#: app/scripts/services/tools.js:727 msgid "Check Internet connection..." msgstr "" -#: app/scripts/services/tools.js:613 +#: app/scripts/services/tools.js:737 msgid "Check Python..." msgstr "" -#: app/scripts/services/drivers.js:104 +#: app/scripts/services/tools.js:819 +msgid "Click here to setup the drivers" +msgstr "" + +#: app/scripts/services/drivers.js:110 +#: app/scripts/services/drivers.js:203 +#: app/scripts/services/drivers.js:225 +#: app/scripts/services/tools.js:132 +#: app/scripts/services/tools.js:246 msgid "Click here to install it" msgstr "" -#: app/views/menu.html:338 +#: app/scripts/controllers/menu.js:326 +msgid "Click here to view" +msgstr "" + +#: app/scripts/controllers/menu.js:247 +msgid "Close" +msgstr "" + +#: app/views/menu.html:347 msgid "Code" msgstr "" -#: app/views/menu.html:185 +#: app/views/menu.html:194 msgid "Collection" msgstr "" -#: app/views/menu.html:165 +#: app/views/menu.html:174 msgid "Collection info" msgstr "" -#: app/scripts/controllers/menu.js:434 +#: app/scripts/controllers/menu.js:468 msgid "Collection {{collection}} info not defined" msgstr "" -#: app/scripts/services/tools.js:773 +#: app/scripts/services/tools.js:920 msgid "Collection {{name}} added" msgstr "" -#: app/scripts/services/tools.js:767 +#: app/scripts/services/tools.js:914 msgid "Collection {{name}} not replaced" msgstr "" -#: app/scripts/services/tools.js:883 +#: app/scripts/services/tools.js:1030 msgid "Collection {{name}} removed" msgstr "" -#: app/scripts/services/tools.js:763 +#: app/scripts/services/tools.js:910 msgid "Collection {{name}} replaced" msgstr "" -#: app/scripts/controllers/menu.js:442 +#: app/scripts/controllers/menu.js:476 msgid "Collection {{name}} selected" msgstr "" -#: app/views/menu.html:263 +#: app/views/menu.html:272 msgid "Collections" msgstr "" -#: app/views/menu.html:309 +#: app/views/menu.html:318 msgid "Community forum" msgstr "" -#: app/views/menu.html:335 +#: app/views/menu.html:344 msgid "Constant" msgstr "" -#: app/scripts/services/project.js:106 +#: app/scripts/services/project.js:108 msgid "Convert" msgstr "" -#: app/views/menu.html:91 +#: app/views/menu.html:104 msgid "Copy" msgstr "" -#: app/views/menu.html:88 +#: app/views/menu.html:101 msgid "Cut" msgstr "" -#: app/views/menu.html:159 +#: app/views/menu.html:167 msgid "Datasheet" msgstr "" -#: app/views/menu.html:190 +#: app/views/menu.html:199 msgid "Default" msgstr "" -#: app/scripts/services/tools.js:481 +#: app/scripts/services/tools.js:603 msgid "Default toolchain not found. Toolchain will be downloaded. This operation requires Internet connection. Do you want to continue?" msgstr "" -#: app/scripts/services/utils.js:534 +#: app/scripts/services/utils.js:532 msgid "Description" msgstr "" -#: app/views/menu.html:126 -#: app/views/menu.html:256 +#: app/views/menu.html:138 +#: app/views/menu.html:265 msgid "Disable" msgstr "" -#: app/scripts/controllers/menu.js:237 +#: app/scripts/controllers/menu.js:250 msgid "Do you want to close the application?" msgstr "" -#: app/scripts/controllers/menu.js:523 +#: app/scripts/controllers/menu.js:576 msgid "Do you want to remove the {{name}} collection?" msgstr "" -#: app/scripts/services/tools.js:759 +#: app/scripts/services/tools.js:906 msgid "Do you want to replace it?" msgstr "" -#: app/views/menu.html:302 +#: app/views/menu.html:311 msgid "Documentation" msgstr "" -#: app/views/menu.html:247 +#: app/views/menu.html:256 msgid "Drivers" msgstr "" -#: app/scripts/services/drivers.js:128 -#: app/scripts/services/drivers.js:78 +#: app/scripts/services/drivers.js:134 +#: app/scripts/services/drivers.js:72 msgid "Drivers disabled" msgstr "" -#: app/scripts/services/drivers.js:120 -#: app/scripts/services/drivers.js:75 +#: app/scripts/services/drivers.js:126 +#: app/scripts/services/drivers.js:63 msgid "Drivers enabled" msgstr "" -#: app/scripts/services/tools.js:265 +#: app/scripts/services/tools.js:344 msgid "Duplicated FPGA I/O ports" msgstr "" @@ -240,16 +260,16 @@ msgstr "" msgid "Duplicated block attributes" msgstr "" -#: app/views/menu.html:78 +#: app/views/menu.html:91 msgid "Edit" msgstr "" -#: app/scripts/services/tools.js:748 +#: app/scripts/services/tools.js:895 msgid "Edit the collection name" msgstr "" -#: app/views/menu.html:121 -#: app/views/menu.html:251 +#: app/views/menu.html:133 +#: app/views/menu.html:260 msgid "Enable" msgstr "" @@ -281,74 +301,74 @@ msgstr "" msgid "Enter the parameters" msgstr "" -#: app/scripts/controllers/menu.js:324 +#: app/scripts/controllers/menu.js:358 msgid "Enter the remote hostname user@host (experimental)" msgstr "" -#: app/scripts/services/tools.js:504 +#: app/scripts/services/tools.js:626 msgid "Error: default toolchain not found in '{{dir}}'" msgstr "" -#: app/scripts/services/utils.js:675 +#: app/scripts/services/utils.js:678 msgid "Error: {{error}}" msgstr "" -#: app/scripts/services/tools.js:336 -msgid "Errors detected in the code" +#: app/scripts/services/tools.js:418 +msgid "Errors detected in the design" msgstr "" -#: app/views/menu.html:39 +#: app/views/menu.html:42 msgid "Examples" msgstr "" -#: app/scripts/services/tools.js:206 +#: app/scripts/services/tools.js:275 msgid "Execute remote {{label}} ..." msgstr "" -#: app/views/menu.html:54 +#: app/views/menu.html:57 msgid "Export" msgstr "" -#: app/scripts/services/tools.js:637 +#: app/scripts/services/tools.js:762 msgid "Extract default apio files..." msgstr "" -#: app/scripts/services/tools.js:647 +#: app/scripts/services/tools.js:772 msgid "Extract default apio packages..." msgstr "" -#: app/scripts/services/tools.js:625 +#: app/scripts/services/tools.js:750 msgid "Extract virtual env files..." msgstr "" -#: app/scripts/services/tools.js:262 +#: app/scripts/services/tools.js:341 msgid "FPGA I/O ports not defined" msgstr "" #: app/scripts/services/blocks.js:115 #: app/scripts/services/blocks.js:53 -#: app/scripts/services/blocks.js:711 -#: app/scripts/services/blocks.js:791 +#: app/scripts/services/blocks.js:713 +#: app/scripts/services/blocks.js:793 msgid "FPGA pin" msgstr "" -#: app/views/menu.html:26 +#: app/views/menu.html:29 msgid "File" msgstr "" -#: app/scripts/services/project.js:438 +#: app/scripts/services/project.js:448 msgid "File {{file}} already exists in the project path. Do you want to replace it?" msgstr "" -#: app/scripts/services/tools.js:182 +#: app/scripts/services/tools.js:214 msgid "File {{file}} does not exist" msgstr "" -#: app/scripts/services/project.js:472 +#: app/scripts/services/project.js:482 msgid "File {{file}} imported" msgstr "" -#: app/views/menu.html:104 +#: app/views/menu.html:114 msgid "Fit content" msgstr "" @@ -356,116 +376,116 @@ msgstr "" msgid "French" msgstr "" -#: app/scripts/controllers/menu.js:216 -msgid "GTKWave exported" -msgstr "" - #: app/views/languages.html:16 msgid "Galician" msgstr "" -#: app/views/menu.html:292 +#: app/views/menu.html:301 msgid "Help" msgstr "" -#: app/scripts/services/utils.js:548 +#: app/scripts/services/utils.js:546 msgid "Image" msgstr "" -#: app/scripts/controllers/menu.js:683 +#: app/scripts/controllers/menu.js:735 msgid "Image {{name}} saved" msgstr "" -#: app/views/menu.html:341 +#: app/views/menu.html:350 msgid "Information" msgstr "" -#: app/views/menu.html:329 +#: app/views/menu.html:338 msgid "Input" msgstr "" -#: app/views/menu.html:224 +#: app/views/menu.html:233 msgid "Install" msgstr "" -#: app/scripts/services/tools.js:642 +#: app/scripts/services/tools.js:767 msgid "Install default apio..." msgstr "" -#: app/scripts/services/tools.js:691 +#: app/scripts/services/tools.js:816 msgid "Installation completed" msgstr "" -#: app/scripts/services/tools.js:534 -#: app/scripts/services/tools.js:571 +#: app/scripts/services/tools.js:657 +#: app/scripts/services/tools.js:692 msgid "Installing toolchain" msgstr "" -#: app/scripts/services/drivers.js:112 -#: app/scripts/services/tools.js:607 +#: app/scripts/services/drivers.js:118 +#: app/scripts/services/tools.js:731 msgid "Internet connection required" msgstr "" -#: app/scripts/services/graph.js:179 +#: app/scripts/services/graph.js:178 msgid "Invalid Pull up connection:
    block already connected" msgstr "" -#: app/scripts/services/graph.js:193 +#: app/scripts/services/graph.js:192 msgid "Invalid Pull up connection:
    only Input blocks allowed" msgstr "" -#: app/scripts/services/graph.js:185 +#: app/scripts/services/graph.js:184 msgid "Invalid block connection:
    Pull up already connected" msgstr "" -#: app/scripts/services/tools.js:779 +#: app/scripts/services/tools.js:926 msgid "Invalid collection {{name}}" msgstr "" -#: app/scripts/services/graph.js:143 -#: app/scripts/services/graph.js:150 -#: app/scripts/services/graph.js:157 +#: app/scripts/services/graph.js:142 +#: app/scripts/services/graph.js:149 +#: app/scripts/services/graph.js:156 msgid "Invalid connection" msgstr "" -#: app/scripts/services/graph.js:212 +#: app/scripts/services/graph.js:211 msgid "Invalid connection: {{a}} → {{b}}" msgstr "" -#: app/scripts/services/graph.js:173 +#: app/scripts/services/graph.js:172 msgid "Invalid multiple input connections" msgstr "" -#: app/scripts/services/drivers.js:190 +#: app/scripts/services/utils.js:259 +msgid "Invalid project format" +msgstr "" + +#: app/scripts/services/drivers.js:196 msgid "It is recommended to use USB 2.0 ports" msgstr "" -#: app/views/menu.html:134 +#: app/views/menu.html:121 msgid "Language" msgstr "" -#: app/scripts/services/project.js:105 +#: app/scripts/services/project.js:107 msgid "Load" msgstr "" #: app/scripts/services/blocks.js:186 -#: app/scripts/services/blocks.js:864 +#: app/scripts/services/blocks.js:866 msgid "Local parameter" msgstr "" -#: app/scripts/services/tools.js:630 +#: app/scripts/services/tools.js:755 msgid "Make virtual env..." msgstr "" -#: app/scripts/services/utils.js:755 +#: app/scripts/services/utils.js:758 msgid "Maximum bus size: 96 bits" msgstr "" -#: app/scripts/services/utils.js:532 +#: app/scripts/services/utils.js:530 msgid "Name" msgstr "" -#: app/views/menu.html:29 +#: app/views/menu.html:32 msgid "New" msgstr "" @@ -473,136 +493,134 @@ msgstr "" msgid "New project {{name}} created" msgstr "" -#: app/scripts/controllers/menu.js:541 +#: app/scripts/controllers/menu.js:594 msgid "No collections stored" msgstr "" #: app/scripts/controllers/main.js:15 -#: app/scripts/services/project.js:143 +#: app/scripts/controllers/menu.js:260 +#: app/scripts/services/project.js:145 msgid "OK" msgstr "" -#: app/scripts/services/project.js:377 -#: app/scripts/services/project.js:99 +#: app/scripts/services/project.js:101 +#: app/scripts/services/project.js:384 msgid "Old project format {{version}}" msgstr "" -#: app/views/menu.html:32 +#: app/views/menu.html:35 msgid "Open" msgstr "" -#: app/scripts/services/utils.js:555 +#: app/scripts/services/utils.js:553 msgid "Open SVG" msgstr "" -#: app/scripts/services/project.js:475 +#: app/scripts/services/project.js:485 msgid "Original file {{file}} does not exist" msgstr "" -#: app/views/menu.html:332 +#: app/views/menu.html:341 msgid "Output" msgstr "" -#: app/scripts/controllers/menu.js:198 -msgid "PCF file exported" -msgstr "" - -#: app/views/menu.html:94 +#: app/views/menu.html:107 msgid "Paste" msgstr "" -#: app/scripts/services/utils.js:884 +#: app/scripts/services/utils.js:887 msgid "Please run: {{cmd}}" msgstr "" -#: app/views/menu.html:108 +#: app/views/menu.html:118 msgid "Preferences" msgstr "" -#: app/views/menu.html:111 +#: app/views/menu.html:152 msgid "Project information" msgstr "" -#: app/scripts/services/project.js:131 +#: app/scripts/controllers/menu.js:326 +#: app/scripts/controllers/menu.js:340 +msgid "Project information updated" +msgstr "" + +#: app/scripts/services/project.js:133 msgid "Project {{name}} loaded" msgstr "" -#: app/scripts/services/project.js:346 +#: app/scripts/services/project.js:349 msgid "Project {{name}} saved" msgstr "" -#: app/scripts/services/tools.js:618 +#: app/scripts/services/tools.js:744 msgid "Python 2.7 is required" msgstr "" -#: app/views/menu.html:72 +#: app/views/menu.html:85 msgid "Quit" msgstr "" -#: app/scripts/services/blocks.js:948 +#: app/scripts/services/blocks.js:950 #: app/views/design.html:5 msgid "Read only" msgstr "" -#: app/views/menu.html:84 +#: app/views/menu.html:97 msgid "Redo" msgstr "" -#: app/scripts/services/tools.js:368 +#: app/scripts/services/tools.js:453 msgid "Remote host {{name}} not connected" msgstr "" -#: app/views/menu.html:140 +#: app/views/menu.html:145 msgid "Remote hostname" msgstr "" -#: app/views/menu.html:232 -#: app/views/menu.html:271 +#: app/views/menu.html:241 +#: app/views/menu.html:280 msgid "Remove" msgstr "" -#: app/views/menu.html:283 +#: app/views/menu.html:292 msgid "Remove all" msgstr "" -#: app/scripts/services/utils.js:557 +#: app/scripts/services/utils.js:555 msgid "Reset SVG" msgstr "" -#: app/views/menu.html:237 +#: app/views/menu.html:246 msgid "Reset default" msgstr "" -#: app/views/menu.html:101 -msgid "Reset view" -msgstr "" - -#: app/views/menu.html:47 +#: app/views/menu.html:50 msgid "Save" msgstr "" -#: app/scripts/services/utils.js:556 +#: app/scripts/services/utils.js:554 msgid "Save SVG" msgstr "" -#: app/views/menu.html:50 +#: app/views/menu.html:53 msgid "Save as" msgstr "" -#: app/views/menu.html:171 +#: app/views/menu.html:180 msgid "Select" msgstr "" -#: app/views/menu.html:97 +#: app/views/menu.html:110 msgid "Select all" msgstr "" #: app/scripts/services/blocks.js:54 -#: app/scripts/services/blocks.js:712 +#: app/scripts/services/blocks.js:714 msgid "Show clock" msgstr "" -#: app/views/menu.html:305 +#: app/views/menu.html:314 msgid "Source code" msgstr "" @@ -610,119 +628,136 @@ msgstr "" msgid "Spanish" msgstr "" -#: app/scripts/services/tools.js:195 -msgid "Synchronize remote files ..." +#: app/scripts/controllers/menu.js:530 +msgid "Start build" msgstr "" -#: app/views/menu.html:63 -msgid "Testbench" +#: app/scripts/controllers/menu.js:542 +msgid "Start upload" +msgstr "" + +#: app/scripts/controllers/menu.js:518 +msgid "Start verification" +msgstr "" + +#: app/scripts/services/tools.js:264 +msgid "Synchronize remote files ..." msgstr "" -#: app/scripts/controllers/menu.js:207 -msgid "Testbench exported" +#: app/views/menu.html:66 +msgid "Testbench" msgstr "" -#: app/scripts/services/tools.js:758 +#: app/scripts/services/tools.js:905 msgid "The collection {{name}} already exists." msgstr "" -#: app/scripts/controllers/menu.js:463 +#: app/scripts/controllers/menu.js:497 msgid "The current FPGA I/O configuration will be lost. Do you want to change to {{name}} board?" msgstr "" -#: app/scripts/services/tools.js:509 +#: app/scripts/services/tools.js:631 msgid "The toolchain will be removed. Do you want to continue?" msgstr "" -#: app/scripts/services/tools.js:497 +#: app/scripts/services/tools.js:619 msgid "The toolchain will be restored to default. Do you want to continue?" msgstr "" -#: app/scripts/services/tools.js:489 +#: app/scripts/services/tools.js:611 msgid "The toolchain will be updated. This operation requires Internet connection. Do you want to continue?" msgstr "" -#: app/scripts/services/project.js:400 +#: app/scripts/services/project.js:407 msgid "This import operation requires a project path. You need to save the current project. Do you want to continue?" msgstr "" -#: app/scripts/services/project.js:109 +#: app/scripts/services/project.js:111 msgid "This project is designed for the {{name}} board." msgstr "" -#: app/views/menu.html:220 +#: app/views/menu.html:229 msgid "Toolchain" msgstr "" -#: app/scripts/services/tools.js:692 +#: app/scripts/services/tools.js:818 msgid "Toolchain installed" msgstr "" -#: app/scripts/services/tools.js:695 +#: app/scripts/services/drivers.js:203 +#: app/scripts/services/drivers.js:225 +#: app/scripts/services/tools.js:132 +#: app/scripts/services/tools.js:834 msgid "Toolchain not installed" msgstr "" -#: app/scripts/services/drivers.js:197 -#: app/scripts/services/drivers.js:213 -#: app/scripts/services/tools.js:94 -msgid "Toolchain not installed. Please, install the toolchain" +#: app/scripts/services/tools.js:636 +msgid "Toolchain removed" msgstr "" -#: app/scripts/services/tools.js:514 -msgid "Toolchain removed" +#: app/scripts/services/tools.js:246 +msgid "Toolchain version does not match" msgstr "" -#: app/views/menu.html:207 +#: app/views/menu.html:216 msgid "Tools" msgstr "" -#: app/views/menu.html:81 +#: app/views/menu.html:94 msgid "Undo" msgstr "" -#: app/scripts/services/tools.js:257 +#: app/scripts/services/tools.js:336 msgid "Unknown board" msgstr "" -#: app/scripts/app.js:44 +#: app/scripts/app.js:48 msgid "Untitled" msgstr "" -#: app/views/menu.html:227 +#: app/views/menu.html:236 msgid "Update" msgstr "" -#: app/scripts/services/blocks.js:710 -#: app/scripts/services/blocks.js:790 -#: app/scripts/services/blocks.js:863 +#: app/scripts/services/blocks.js:712 +#: app/scripts/services/blocks.js:792 +#: app/scripts/services/blocks.js:865 msgid "Update the block name" msgstr "" -#: app/views/menu.html:216 +#: app/views/menu.html:225 msgid "Upload" msgstr "" -#: app/views/menu.html:210 -msgid "Verify" +#: app/scripts/controllers/menu.js:543 +msgid "Upload done" msgstr "" -#: app/scripts/controllers/menu.js:189 -msgid "Verilog code exported" +#: app/scripts/controllers/menu.js:519 +msgid "Verification done" msgstr "" -#: app/scripts/services/utils.js:533 -#: app/views/menu.html:298 +#: app/views/menu.html:219 +msgid "Verify" +msgstr "" + +#: app/scripts/services/utils.js:531 +#: app/views/menu.html:307 msgid "Version" msgstr "" -#: app/views/menu.html:150 +#: app/views/menu.html:158 msgid "View" msgstr "" -#: app/views/menu.html:295 +#: app/views/menu.html:304 msgid "View license" msgstr "" +#: app/scripts/services/tools.js:421 +msgid "Warnings detected in the design" +msgstr "" + #: app/scripts/services/blocks.js:410 msgid "Wrong block format: {{type}}" msgstr "" @@ -730,9 +765,9 @@ msgstr "" #: app/scripts/services/blocks.js:134 #: app/scripts/services/blocks.js:205 #: app/scripts/services/blocks.js:75 -#: app/scripts/services/blocks.js:781 -#: app/scripts/services/blocks.js:855 -#: app/scripts/services/blocks.js:890 +#: app/scripts/services/blocks.js:783 +#: app/scripts/services/blocks.js:857 +#: app/scripts/services/blocks.js:892 msgid "Wrong block name {{name}}" msgstr "" @@ -745,19 +780,19 @@ msgstr "" msgid "Wrong port name {{name}}" msgstr "" -#: app/scripts/services/project.js:139 +#: app/scripts/services/project.js:141 msgid "Wrong project format: {{name}}" msgstr "" -#: app/scripts/services/tools.js:365 +#: app/scripts/services/tools.js:450 msgid "Wrong remote hostname {{name}}" msgstr "" -#: app/scripts/services/project.js:110 +#: app/scripts/services/project.js:112 msgid "You can load it as it is or convert it for the {{name}} board." msgstr "" -#: app/scripts/controllers/menu.js:238 +#: app/scripts/controllers/menu.js:251 msgid "Your changes will be lost if you don’t save them" msgstr "" @@ -765,49 +800,24 @@ msgstr "" msgid "back" msgstr "" -#. Build done -#: app/scripts/services/tools.js:380 -msgid "done_build" -msgstr "" - -#. Upload done -#: app/scripts/services/tools.js:382 -msgid "done_upload" -msgstr "" - -#. Verification done -#: app/scripts/services/tools.js:378 -msgid "done_verify" -msgstr "" - -#. Start building ... -#: app/scripts/services/tools.js:61 -msgid "start_build" -msgstr "" - -#. Start uploading ... -#: app/scripts/services/tools.js:63 -msgid "start_upload" -msgstr "" - -#. Start verification ... -#: app/scripts/services/tools.js:59 -msgid "start_verify" -msgstr "" - -#: app/scripts/services/drivers.js:103 -#: app/scripts/services/utils.js:859 +#: app/scripts/services/drivers.js:109 +#: app/scripts/services/utils.js:862 msgid "{{app}} is required." msgstr "" -#: app/scripts/controllers/menu.js:396 +#: app/scripts/controllers/menu.js:430 msgid "{{board}} datasheet not defined" msgstr "" -#: app/scripts/controllers/menu.js:386 +#: app/scripts/controllers/menu.js:420 msgid "{{board}} pinout not defined" msgstr "" -#: app/scripts/controllers/menu.js:415 +#: app/scripts/controllers/menu.js:449 msgid "{{board}} rules not defined" msgstr "" + +#: app/scripts/controllers/menu.js:201 +#: app/scripts/controllers/menu.js:224 +msgid "{{name}} exported" +msgstr "" diff --git a/app/resources/virtualenv/virtualenv-15.0.1.tar.gz b/app/resources/virtualenv/virtualenv-15.0.1.tar.gz deleted file mode 100644 index d8a19866a..000000000 Binary files a/app/resources/virtualenv/virtualenv-15.0.1.tar.gz and /dev/null differ diff --git a/app/resources/virtualenv/virtualenv-15.0.1.zip b/app/resources/virtualenv/virtualenv-15.0.1.zip new file mode 100644 index 000000000..a2e26a8de Binary files /dev/null and b/app/resources/virtualenv/virtualenv-15.0.1.zip differ diff --git a/app/scripts/app.js b/app/scripts/app.js index 3235dba77..3b6e39375 100644 --- a/app/scripts/app.js +++ b/app/scripts/app.js @@ -24,8 +24,12 @@ angular utils, boards, collections, - gettextCatalog) + gettextCatalog, + $timeout) { + $timeout(function(){ + $('body').addClass('waiting'); + }, 0); // Load boards boards.loadBoards(); // Load collections @@ -42,5 +46,6 @@ angular profile.set('collection', selectedCollection); // Initialize title project.updateTitle(gettextCatalog.getString('Untitled')); + $('body').removeClass('waiting'); }); }); diff --git a/app/scripts/controllers/menu.js b/app/scripts/controllers/menu.js index 1fe8bdf2b..d2ec13bb0 100644 --- a/app/scripts/controllers/menu.js +++ b/app/scripts/controllers/menu.js @@ -34,6 +34,8 @@ angular.module('icestudio') var zeroProject = true; // New project without changes + var resultAlert = null; + // Window events var win = gui.Window.get(); win.on('close', function() { @@ -50,29 +52,6 @@ angular.module('icestudio') win.menu = mb; } - // Menu timer - var timer; - - // mousedown event - var mousedown = false; - $(document).on('mouseup', function() { mousedown = false; }); - $(document).on('mousedown', function() { mousedown = true; }); - - // mouseover event - $scope.showMenu = function(menu) { - $timeout.cancel(timer); - if (!mousedown && !graph.addingDraggableBlock) { - $scope.status[menu] = true; - } - }; - - // mouseleave event - $scope.hideMenu = function(menu) { - timer = $timeout(function() { - $scope.status[menu] = false; - }, 700); - }; - // Load app arguments setTimeout(function() { var local = false; @@ -184,40 +163,71 @@ angular.module('icestudio') }; $scope.exportVerilog = function() { - checkGraph(function() { - utils.saveDialog('#input-export-verilog', '.v', function(filepath) { - project.export('verilog', filepath, gettextCatalog.getString('Verilog code exported')); - updateWorkingdir(filepath); - }); - }); + exportFromCompiler('verilog', 'Verilog', '.v'); }; $scope.exportPCF = function() { - checkGraph(function() { - utils.saveDialog('#input-export-pcf', '.pcf', function(filepath) { - project.export('pcf', filepath, gettextCatalog.getString('PCF file exported')); - updateWorkingdir(filepath); - }); - }); + exportFromCompiler('pcf', 'PCF' ,'.pcf'); }; $scope.exportTestbench = function() { - checkGraph(function() { - utils.saveDialog('#input-export-testbench', '.v', function(filepath) { - project.export('testbench', filepath, gettextCatalog.getString('Testbench exported')); + exportFromCompiler('testbench', 'Testbench', '.v'); + }; + + $scope.exportGTKwave = function() { + exportFromCompiler('gtkwave', 'GTKWave' ,'.gtkw'); + }; + + $scope.exportBLIF = function() { + exportFromBuilder('blif', 'BLIF', '.blif'); + }; + + $scope.exportASC = function() { + exportFromBuilder('asc', 'ASC', '.asc'); + + }; + $scope.exportBitstream = function() { + exportFromBuilder('bin', 'Bitstream', '.bin'); + }; + + function exportFromCompiler(id, name, ext) { + checkGraph() + .then(function() { + utils.saveDialog('#input-export-' + id, ext, function(filepath) { + // Save the compiler result + var data = project.compile(id); + utils.saveFile(filepath, data) + .then(function() { + alertify.success(gettextCatalog.getString('{{name}} exported', { name: name })); + }) + .catch(function(error) { + alertify.error(error, 30); + }); + // Update the working directory updateWorkingdir(filepath); }); }); - }; + } - $scope.exportGTKwave = function() { - checkGraph(function() { - utils.saveDialog('#input-export-gtkwave', '.gtkw', function(filepath) { - project.export('gtkwave', filepath, gettextCatalog.getString('GTKWave exported')); + function exportFromBuilder(id, name, ext) { + checkGraph() + .then(function() { + return graph.resetCodeErrors(); + }) + .then(function() { + return tools.buildCode(); + }) + .then(function() { + utils.saveDialog('#input-export-' + id, ext, function(filepath) { + // Copy the built file + if (utils.copySync(nodePath.join(common.BUILD_DIR, 'hardware' + ext), filepath)) { + alertify.success(gettextCatalog.getString('{{name}} exported', { name: name })); + } + // Update the working directory updateWorkingdir(filepath); }); }); - }; + } function updateWorkingdir(filepath) { $scope.workingdir = utils.dirname(filepath) + utils.sep; @@ -233,19 +243,32 @@ angular.module('icestudio') function exit() { if (project.changed) { + alertify.set('confirm', 'labels', { + 'ok': gettextCatalog.getString('Close') + }); alertify.confirm( utils.bold(gettextCatalog.getString('Do you want to close the application?')) + '
    ' + gettextCatalog.getString('Your changes will be lost if you don’t save them'), function() { + // Close _exit(); - }); + }, + function() { + // Cancel + setTimeout(function() { + alertify.set('confirm', 'labels', { + 'ok': gettextCatalog.getString('OK') + }); + }, 200); + } + ); } else { _exit(); } function _exit() { //win.hide(); - //profile.save(); + utils.removeTempBuildDir(); win.close(true); } } @@ -282,7 +305,8 @@ angular.module('icestudio') }; $scope.selectAll = function() { - checkGraph(function() { + checkGraph() + .then(function() { graph.selectAll(); }); }; @@ -291,33 +315,43 @@ angular.module('icestudio') project.removeSelected(); } - $scope.resetView = function() { - graph.resetView(); - }; - $scope.fitContent = function() { graph.fitContent(); }; + $(document).on('infoChanged', function(evt, newValues) { + var values = getProjectInformation(); + if (!_.isEqual(values, newValues)) { + graph.setInfo(values, newValues, project); + alertify.message(gettextCatalog.getString('Project information updated') + '.
    ' + gettextCatalog.getString('Click here to view'), 5) + .callback = function(isClicked) { + if (isClicked) { + $scope.setProjectInformation(); + } + }; + } + }); + $scope.setProjectInformation = function() { + var values = getProjectInformation(); + utils.projectinfoprompt(values, function(evt, newValues) { + if (!_.isEqual(values, newValues)) { + graph.setInfo(values, newValues, project); + alertify.success(gettextCatalog.getString('Project information updated')); + } + }); + }; + + function getProjectInformation() { var p = project.get('package'); - var values = [ + return [ p.name, p.version, p.description, p.author, p.image ]; - utils.projectinfoprompt(values, function(evt, values) { - project.set('package', { - name: values[0], - version: values[1], - description: values[2], - author: values[3], - image: values[4] - }); - }); - }; + } $scope.setRemoteHostname = function() { var current = profile.get('remoteHostname'); @@ -439,7 +473,7 @@ angular.module('icestudio') if (common.selectedCollection.name !== collection.name) { var name = collections.selectCollection(collection.name); profile.set('collection', name); - alertify.success(gettextCatalog.getString('Collection {{name}} selected', { name: utils.bold(name) })); + alertify.success(gettextCatalog.getString('Collection {{name}} selected', { name: utils.bold(name ? name : 'Default') })); } }; @@ -481,35 +515,54 @@ angular.module('icestudio') //-- Tools $scope.verifyCode = function() { - checkGraph(function() { - graph.resetCodeErrors(); - tools.verifyCode(); + var startMessage = gettextCatalog.getString('Start verification'); + var endMessage = gettextCatalog.getString('Verification done'); + checkGraph() + .then(function() { + return graph.resetCodeErrors(); + }) + .then(function() { + return tools.verifyCode(startMessage, endMessage); }); }; $scope.buildCode = function() { - checkGraph(function() { - graph.resetCodeErrors(); - tools.buildCode(); + var startMessage = gettextCatalog.getString('Start build'); + var endMessage = gettextCatalog.getString('Build done'); + checkGraph() + .then(function() { + return graph.resetCodeErrors(); + }) + .then(function() { + return tools.buildCode(startMessage, endMessage); }); }; $scope.uploadCode = function() { - checkGraph(function() { - graph.resetCodeErrors(); - tools.uploadCode(); + var startMessage = gettextCatalog.getString('Start upload'); + var endMessage = gettextCatalog.getString('Upload done'); + checkGraph() + .then(function() { + return graph.resetCodeErrors(); + }) + .then(function() { + return tools.uploadCode(startMessage, endMessage); }); }; - function checkGraph(callback) { - if (!graph.isEmpty()) { - if (callback) { - callback(); + function checkGraph() { + return new Promise(function(resolve, reject) { + if (!graph.isEmpty()) { + resolve(); } - } - else { - alertify.warning(gettextCatalog.getString('Add a block to start'), 5); - } + else { + if (resultAlert) { + resultAlert.dismiss(true); + } + resultAlert = alertify.warning(gettextCatalog.getString('Add a block to start'), 5); + reject(); + } + }); } $scope.addCollections = function() { @@ -627,7 +680,6 @@ angular.module('icestudio') shortcuts.method('copySelected', $scope.copySelected); shortcuts.method('pasteSelected', $scope.pasteSelected); shortcuts.method('selectAll', $scope.selectAll); - shortcuts.method('resetView', $scope.resetView); shortcuts.method('fitContent', $scope.fitContent); // -- Tools @@ -689,4 +741,53 @@ angular.module('icestudio') }); } + // Show/Hide menu management + var menu; + var timerOpen; + var timerClose; + + // mousedown event + var mousedown = false; + $(document).on('mouseup', function() { + mousedown = false; + }); + $(document).on('mousedown', '#paper', function() { + mousedown = true; + // Close current menu + $scope.status[menu] = false; + utils.rootScopeSafeApply(); + }); + + // Show menu with delay + $scope.showMenu = function(newMenu) { + menu = newMenu; + $timeout.cancel(timerClose); + if (!mousedown && !graph.addingDraggableBlock && !$scope.status[menu]) { + timerOpen = $timeout(function() { + $scope.status[menu] = true; + }, 300); + } + }; + + // Hide menu with delay + $scope.hideMenu = function(menu) { + $timeout.cancel(timerOpen); + timerClose = $timeout(function() { + $scope.status[menu] = false; + }, 900); + }; + + // Fix menu + $scope.fixMenu = function(menu) { + $scope.status[menu] = true; + }; + + // Disable click in submenus + $(document).click('.dropdown-submenu', function(event) { + if ($(event.target).hasClass('dropdown-toggle')) { + event.stopImmediatePropagation(); + event.preventDefault(); + } + }); + }); diff --git a/app/scripts/factories/node.js b/app/scripts/factories/node.js index d77e948f9..f8aa6e1b7 100644 --- a/app/scripts/factories/node.js +++ b/app/scripts/factories/node.js @@ -19,9 +19,6 @@ angular.module('icestudio') .factory('nodeChildProcess', function() { return require('child_process'); }) - .factory('nodeTarball', function() { - return require('tarball-extract'); - }) .factory('nodeZlib', function() { return require('zlib'); }) @@ -46,6 +43,9 @@ angular.module('icestudio') .factory('nodeAdmZip', function() { return require('adm-zip'); }) + .factory('nodeExtract', function() { + return require('extract-zip'); + }) .factory('nodeGettext', function() { return require('angular-gettext-tools'); }) @@ -55,6 +55,9 @@ angular.module('icestudio') .factory('nodeGetOS', function() { return require('getos'); }) + .factory('nodeTemp', function() { + return require('temporary'); + }) .factory('SVGO', function() { var config = { full: true, diff --git a/app/scripts/graphics/joint.command.js b/app/scripts/graphics/joint.command.js index 3726f01b1..55da16a69 100755 --- a/app/scripts/graphics/joint.command.js +++ b/app/scripts/graphics/joint.command.js @@ -9,7 +9,7 @@ joint.dia.CommandManager = Backbone.Model.extend({ defaults: { cmdBeforeAdd: null, - cmdNameRegex: /^(?:add|remove|board|lang|change:\w+)$/ + cmdNameRegex: /^(?:add|remove|board|info|lang|change:\w+)$/ }, // length of prefix 'change:' in the event name @@ -141,7 +141,7 @@ joint.dia.CommandManager = Backbone.Model.extend({ return push(command); } - if (cmdName === 'board' || cmdName === 'lang') { + if (cmdName === 'board' || cmdName === 'info' || cmdName === 'lang') { command.action = cmdName; command.data = cell.data; @@ -261,6 +261,10 @@ joint.dia.CommandManager = Backbone.Model.extend({ this.triggerBoard(cmd.data.previous); break; + case 'info': + this.triggerInfo(cmd.data.previous); + break; + case 'lang': this.triggerLanguage(cmd.data.previous); break; @@ -327,6 +331,10 @@ joint.dia.CommandManager = Backbone.Model.extend({ this.triggerBoard(cmd.data.next); break; + case 'info': + this.triggerInfo(cmd.data.next); + break; + case 'lang': this.triggerLanguage(cmd.data.next); break; @@ -420,6 +428,10 @@ joint.dia.CommandManager = Backbone.Model.extend({ $(document).trigger('boardChanged', [board]); }, + triggerInfo: function(info) { + $(document).trigger('infoChanged', [info]); + }, + triggerLanguage: function(lang) { $(document).trigger('langChanged', [lang]); } diff --git a/app/scripts/graphics/joint.selection.js b/app/scripts/graphics/joint.selection.js index 059a43bc1..a33cb2c49 100644 --- a/app/scripts/graphics/joint.selection.js +++ b/app/scripts/graphics/joint.selection.js @@ -13,23 +13,27 @@ joint.ui.SelectionView = Backbone.View.extend({ events: { 'click .selection-box': 'click', - 'mousedown .selection-box': 'startTranslatingSelection' + 'dblclick': 'dblclick', + 'mousedown .selection-box': 'startTranslatingSelection', + 'mouseover': 'mouseover', + 'mouseout': 'mouseout', + 'mouseup': 'mouseup', + 'mousedown': 'mousedown' }, + showtooltip: true, $selectionArea: null, initialize: function(options) { _.bindAll(this, 'click', 'startSelecting', 'stopSelecting', 'adjustSelection'); - var self = this; - $(document.body).on('mouseup touchend', function(evt) { if (evt.which === 1) { // Mouse left button - self.stopSelecting(evt); + this.stopSelecting(evt); } - }); + }.bind(this)); $(document.body).on('mousemove touchmove', this.adjustSelection); this.options = options; @@ -47,6 +51,58 @@ joint.ui.SelectionView = Backbone.View.extend({ } }, + dblclick: function(evt) { + + var id = evt.target.getAttribute('data-model'); + if (id) { + var view = this.options.paper.findViewByModel(id); + if (view) { + // Trigger dblclick in selection to the Cell View + view.notify('cell:pointerdblclick', evt); + } + } + }, + + mouseover: function(evt) { + + this.mouseManager(evt, 'mouseovercard'); + }, + + mouseout: function(evt) { + + this.mouseManager(evt, 'mouseoutcard'); + }, + + mouseup: function(evt) { + + this.mouseManager(evt, 'mouseupcard'); + }, + + mousedown: function(evt) { + + if (!this.showtooltip && evt.which === 1) { + // Mouse left button: block fixed + this.showtooltip = true; + } + + this.mouseManager(evt, 'mousedowncard'); + }, + + mouseManager: function (evt, fnc) { + + evt.preventDefault(); + + if (this.showtooltip) { + var id = evt.target.getAttribute('data-model'); + if (id) { + var view = this.options.paper.findViewByModel(id); + if (view && view[fnc]) { + view[fnc].apply(view, [evt]); + } + } + } + }, + startTranslatingSelection: function(evt, noBatch) { if (evt.which === 1 || noBatch) { @@ -279,6 +335,7 @@ joint.ui.SelectionView = Backbone.View.extend({ if (this.$('[data-model="' + element.get('id') + '"]').length === 0) { this.$el.append($selectionBox); } + this.showtooltip = (opt.initooltip !== undefined) ? opt.initooltip : true; $selectionBox.css({ opacity: (opt.transparent ? 0 : 1) }); this.updateBox(element); @@ -289,7 +346,7 @@ joint.ui.SelectionView = Backbone.View.extend({ updateBox: function(element) { - var margin = 4; + var margin = 8; var bbox = element.getBBox(); var state = this.options.state; diff --git a/app/scripts/graphics/joint.shapes.js b/app/scripts/graphics/joint.shapes.js index 6ec9f9bdb..ed5dd1482 100644 --- a/app/scripts/graphics/joint.shapes.js +++ b/app/scripts/graphics/joint.shapes.js @@ -459,53 +459,46 @@ joint.shapes.ice.GenericView = joint.shapes.ice.ModelView.extend({ }, enter: false, - down: false, - timer: null, - mouseovercard: function(/*event, x, y*/) { - if (this.tooltip) { - this.enter = true; - var self = this; - this.timer = setTimeout(function() { - if (self.enter && !self.down) { - self.tooltiptext.text(self.tooltip); - self.tooltiptext.css('visibility', 'visible'); - if (self.tooltip.length > 13) { - self.tooltiptext.addClass('tooltip-medium'); - self.tooltiptext.removeClass('tooltip-large'); - } - else if (self.tooltip.length > 20) { - self.tooltiptext.addClass('tooltip-large'); - self.tooltiptext.removeClass('tooltip-medium'); - } - else { - self.tooltiptext.removeClass('tooltip-medium'); - self.tooltiptext.removeClass('tooltip-large'); - } - } - }, 1000); + mouseovercard: function(event/*, x, y*/) { + if (event && event.which === 0) { + // Mouse button not pressed + this.showTooltip(); } }, mouseoutcard: function(/*event, x, y*/) { - if (this.tooltip) { - this.enter = false; - if (this.timer) { - clearTimeout(this.timer); - this.timer = null; - } - this.tooltiptext.css('visibility', 'hidden'); - } + this.hideTooltip(); }, mouseupcard: function(/*event, x, y*/) { - this.down = false; - this.mouseovercard(); + this.showTooltip(); }, mousedowncard: function(/*event, x, y*/) { - this.down = true; - this.mouseoutcard(); + this.hideTooltip(); + }, + + showTooltip: function() { + if (this.tooltip) { + this.enter = true; + setTimeout(function() { + if (this.enter) { + this.tooltiptext.css('visibility', 'visible'); + } + }.bind(this), 1000); + } + }, + + hideTooltip: function() { + if (this.tooltip) { + this.enter = false; + setTimeout(function() { + if (!this.enter) { + this.tooltiptext.css('visibility', 'hidden'); + } + }.bind(this), 100); + } }, initialize: function() { @@ -514,6 +507,21 @@ joint.shapes.ice.GenericView = joint.shapes.ice.ModelView.extend({ this.tooltip = this.model.get('tooltip'); this.tooltiptext = this.$box.find('.tooltiptext'); + this.tooltiptext.text(this.tooltip); + + if (this.tooltip.length > 13) { + this.tooltiptext.addClass('tooltip-medium'); + this.tooltiptext.removeClass('tooltip-large'); + } + else if (this.tooltip.length > 20) { + this.tooltiptext.addClass('tooltip-large'); + this.tooltiptext.removeClass('tooltip-medium'); + } + else { + this.tooltiptext.removeClass('tooltip-medium'); + this.tooltiptext.removeClass('tooltip-large'); + } + if (this.model.get('config')) { this.$box.addClass('config-block'); } @@ -895,7 +903,7 @@ joint.shapes.ice.CodeView = joint.shapes.ice.ModelView.extend({ this.updateBox(); this.updating = false; - this.prevZoom = 1; + this.prevZoom = 0; this.listenTo(this.model, 'process:ports', this.update); joint.dia.ElementView.prototype.initialize.apply(this, arguments); @@ -1039,7 +1047,7 @@ joint.shapes.ice.CodeView = joint.shapes.ice.ModelView.extend({ self.$box.find('.ace_error').css('background-size', annotationSize + ' ' + annotationSize); self.$box.find('.ace_warning').css('background-size', annotationSize + ' ' + annotationSize); self.$box.find('.ace_info').css('background-size', annotationSize + ' ' + annotationSize); - }, 20); + }, 0); }, clearAnnotations: function() { diff --git a/app/scripts/services/blocks.js b/app/scripts/services/blocks.js index 91f67e116..5829f1673 100644 --- a/app/scripts/services/blocks.js +++ b/app/scripts/services/blocks.js @@ -649,14 +649,16 @@ angular.module('icestudio') // Find selectors var sourceSelector, targetSelector; - for (var _out = 0; _out < source.attributes.rightPorts.length; _out++) { - if (source.attributes.rightPorts[_out] === instance.source.port) { + var leftPorts = target.get('leftPorts'); + var rightPorts = source.get('rightPorts'); + for (var _out = 0; _out < rightPorts.length; _out++) { + if (rightPorts[_out] === instance.source.port) { sourceSelector = _out; break; } } - for (var _in = 0; _in < source.attributes.leftPorts.length; _in++) { - if (target.attributes.leftPorts[_in] === instance.target.port) { + for (var _in = 0; _in < leftPorts.length; _in++) { + if (leftPorts[_in] === instance.target.port) { targetSelector = _in; break; } @@ -951,15 +953,17 @@ angular.module('icestudio') ], function(evt, values) { var readonly = values[0]; - var data = utils.clone(block.data); - data.readonly = readonly; - // Translate info content - if (data.info && data.readonly) { - data.text = gettextCatalog.getString(data.info); + if (block.data.readonly !== readonly) { + var data = utils.clone(block.data); + data.readonly = readonly; + // Translate info content + if (data.info && data.readonly) { + data.text = gettextCatalog.getString(data.info); + } + cellView.model.set('data', data); + cellView.apply(); + alertify.success(gettextCatalog.getString('Block updated')); } - cellView.model.set('data', data); - cellView.apply(); - alertify.success(gettextCatalog.getString('Block updated')); }); } diff --git a/app/scripts/services/common.js b/app/scripts/services/common.js index b7dbfefb8..e6550ccc7 100644 --- a/app/scripts/services/common.js +++ b/app/scripts/services/common.js @@ -1,7 +1,8 @@ 'use strict'; angular.module('icestudio') - .service('common', function(nodePath) { + .service('common', function(nodePath, + nodeTemp) { // Project version this.VERSION = '1.1'; @@ -34,21 +35,21 @@ angular.module('icestudio') this.APIO_HOME_DIR = nodePath.join(this.ICESTUDIO_DIR, 'apio'); this.PROFILE_PATH = nodePath.join(this.ICESTUDIO_DIR, 'profile.json'); this.CACHE_DIR = nodePath.join(this.ICESTUDIO_DIR, '.cache'); - this.BUILD_DIR = nodePath.join(this.ICESTUDIO_DIR, '.build'); + this.OLD_BUILD_DIR = nodePath.join(this.ICESTUDIO_DIR, '.build'); this.VENV = 'virtualenv-15.0.1'; this.VENV_DIR = nodePath.join(this.CACHE_DIR, this.VENV); - this.VENV_TARGZ = nodePath.join('resources', 'virtualenv', this.VENV + '.tar.gz'); + this.VENV_ZIP = nodePath.join('resources', 'virtualenv', this.VENV + '.zip'); this.APP_DIR = nodePath.dirname(process.execPath); this.TOOLCHAIN_DIR = nodePath.join(this.APP_DIR, 'toolchain'); this.DEFAULT_APIO = 'default-apio'; this.DEFAULT_APIO_DIR = nodePath.join(this.CACHE_DIR, this.DEFAULT_APIO); - this.DEFAULT_APIO_TARGZ = nodePath.join(this.TOOLCHAIN_DIR, this.DEFAULT_APIO + '.tar.gz'); + this.DEFAULT_APIO_ZIP = nodePath.join(this.TOOLCHAIN_DIR, this.DEFAULT_APIO + '.zip'); this.DEFAULT_APIO_PACKAGES = 'default-apio-packages'; - this.DEFAULT_APIO_PACKAGES_TARGZ = nodePath.join(this.TOOLCHAIN_DIR, this.DEFAULT_APIO_PACKAGES + '.tar.gz'); + this.DEFAULT_APIO_PACKAGES_ZIP = nodePath.join(this.TOOLCHAIN_DIR, this.DEFAULT_APIO_PACKAGES + '.zip'); this.ENV_DIR = nodePath.join(this.ICESTUDIO_DIR, 'venv'); this.ENV_BIN_DIR = nodePath.join(this.ENV_DIR, this.WIN32 ? 'Scripts' : 'bin'); @@ -56,6 +57,8 @@ angular.module('icestudio') this.ENV_APIO = nodePath.join(this.ENV_BIN_DIR, this.WIN32 ? 'apio.exe' : 'apio'); this.APIO_CMD = (this.WIN32 ? 'set' : 'export') + ' APIO_HOME_DIR=' + this.APIO_HOME_DIR + (this.WIN32 ? '& ' : '; ') + '"' + this.ENV_APIO + '"'; + this.BUILD_DIR = new nodeTemp.Dir().path; + function safeDir(_dir, self) { if (self.WIN32) { // Put the env directory to the root of the current local disk when diff --git a/app/scripts/services/compiler.js b/app/scripts/services/compiler.js index 429c08694..5bc53b5aa 100644 --- a/app/scripts/services/compiler.js +++ b/app/scripts/services/compiler.js @@ -87,6 +87,10 @@ angular.module('icestudio') code += '\n)'; } + if (params.length === 0 && ports.length === 0) { + code += '\n'; + } + code += ';\n'; // Content diff --git a/app/scripts/services/drivers.js b/app/scripts/services/drivers.js index cf1727f85..f9868cfc5 100644 --- a/app/scripts/services/drivers.js +++ b/app/scripts/services/drivers.js @@ -5,9 +5,11 @@ angular.module('icestudio') profile, common, gui, + utils, nodePath, nodeSudo, - nodeChildProcess) { + nodeChildProcess, + $rootScope) { this.enable = function() { if (common.WIN32) { @@ -17,7 +19,7 @@ angular.module('icestudio') enableDarwinDrivers(); } else { - linuxDrivers(true); + enableLinuxDrivers(); } }; @@ -29,7 +31,7 @@ angular.module('icestudio') disableDarwinDrivers(); } else { - linuxDrivers(false); + disableLinuxDrivers(); } }; @@ -50,32 +52,36 @@ angular.module('icestudio') } }; - function linuxDrivers(enable) { - var commands; - if (enable) { - commands = [ - 'cp ' + nodePath.resolve('resources/config/80-icestick.rules') + ' /etc/udev/rules.d/80-icestick.rules', - 'service udev restart' - ]; - } - else { - commands = [ - 'rm /etc/udev/rules.d/80-icestick.rules', - 'service udev restart' - ]; - } + function enableLinuxDrivers() { + var rules = 'ACTION==\\"add\\", SUBSYSTEM==\\"usb\\", ' + + 'ATTRS{idVendor}==\\"0403\\", ATTRS{idProduct}==\\"6010\\", ' + + 'OWNER=\\"user\\", GROUP=\\"dialout\\", MODE=\\"0777\\"'; + linuxDrivers([ + 'echo \'' + rules + '\' > /etc/udev/rules.d/80-icestick.rules', + 'service udev restart' + ], function() { + alertify.success(gettextCatalog.getString('Drivers enabled')); + }); + } + + function disableLinuxDrivers() { + linuxDrivers([ + 'rm /etc/udev/rules.d/80-icestick.rules', + 'service udev restart' + ], function() { + alertify.warning(gettextCatalog.getString('Drivers disabled')); + }); + } + + function linuxDrivers(commands, callback) { var command = 'sh -c "' + commands.join('; ') + '"'; - beginLazyProcess(); nodeSudo.exec(command, {name: 'Icestudio'}, function(error/*, stdout, stderr*/) { // console.log(error, stdout, stderr); endLazyProcess(); if (!error) { - if (enable) { - alertify.success(gettextCatalog.getString('Drivers enabled')); - } - else { - alertify.warning(gettextCatalog.getString('Drivers disabled')); + if (callback) { + callback(); } setTimeout(function() { alertify.message(gettextCatalog.getString('Unplug and reconnect the board'), 5); @@ -194,7 +200,12 @@ angular.module('icestudio') // console.log(error, stdout, stderr); endLazyProcess(); if (stderr) { - alertify.error(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 30); + alertify.error(gettextCatalog.getString('Toolchain not installed') + '.
    ' + gettextCatalog.getString('Click here to install it'), 30) + .callback = function(isClicked) { + if (isClicked) { + $rootScope.$broadcast('installToolchain'); + } + }; } else if (!error) { alertify.message(gettextCatalog.getString('Unplug and reconnect the board'), 5); @@ -204,13 +215,19 @@ angular.module('icestudio') } function disableWindowsDrivers() { - alertify.confirm(gettextCatalog.getString('

    FTDI driver uninstallation instructions

    1. Find the FPGA USB Device
    2. Select the board interface and uninstall the driver
    '), function() { + alertify.confirm(gettextCatalog.getString('

    FTDI driver uninstallation instructions

    1. Find the FPGA USB Device
    2. Select the board interface and uninstall the driver
    '), + function() { beginLazyProcess(); nodeChildProcess.exec([common.APIO_CMD, 'drivers', '--disable'].join(' '), function(error, stdout, stderr) { // console.log(error, stdout, stderr); endLazyProcess(); if (stderr) { - alertify.error(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 30); + alertify.error(gettextCatalog.getString('Toolchain not installed') + '.
    ' + gettextCatalog.getString('Click here to install it'), 30) + .callback = function(isClicked) { + if (isClicked) { + $rootScope.$broadcast('installToolchain'); + } + }; } }); }); diff --git a/app/scripts/services/graph.js b/app/scripts/services/graph.js index 9f99d1ca3..23dbf562e 100644 --- a/app/scripts/services/graph.js +++ b/app/scripts/services/graph.js @@ -19,7 +19,6 @@ angular.module('icestudio') var selectionView = null; var commandManager = null; var mousePosition = { x: 0, y: 0 }; - var menuHeight = 51; var gridsize = 8; var state = { pan: { x: 0, y: 0 }, zoom: 1.0 }; @@ -343,8 +342,8 @@ angular.module('icestudio') processCellClick(cellView, evt); } else { - // If not, wait 150ms to ensure that it's not a dblclick - var ensureTime = 150; + // If not, wait 200ms to ensure that it's not a dblclick + var ensureTime = 200; pointerDown = false; setTimeout(function() { if (!dblClickCell && !pointerDown) { @@ -389,30 +388,35 @@ angular.module('icestudio') if (!utils.hasShift(evt)) { // Allow dblClick if Shift is not pressed dblClickCell = true; - var type = cellView.model.get('blockType'); - if (type.indexOf('basic.') !== -1) { - if (paper.options.enabled) { - blocks.editBasic(type, cellView, function(cell) { - addCell(cell); - }); - } - } - else if (common.allDependencies[type]) { - z.index = 1; - var project = common.allDependencies[type]; - var breadcrumbsLength = self.breadcrumbs.length; - $rootScope.$broadcast('navigateProject', { - update: breadcrumbsLength === 1, - project: project - }); - self.breadcrumbs.push({ name: project.package.name || '#', type: type }); - utils.rootScopeSafeApply(); - } + processDblClick(cellView); // Enable click event setTimeout(function() { dblClickCell = false; }, 200); } }); + function processDblClick(cellView) { + var type = cellView.model.get('blockType'); + if (type.indexOf('basic.') !== -1) { + if (paper.options.enabled) { + blocks.editBasic(type, cellView, function(cell) { + addCell(cell); + selectionView.cancelSelection(); + }); + } + } + else if (common.allDependencies[type]) { + z.index = 1; + var project = common.allDependencies[type]; + var breadcrumbsLength = self.breadcrumbs.length; + $rootScope.$broadcast('navigateProject', { + update: breadcrumbsLength === 1, + project: project + }); + self.breadcrumbs.push({ name: project.package.name || '#', type: type }); + utils.rootScopeSafeApply(); + } + } + paper.on('blank:pointerdown', function(evt, x, y) { // Disable current focus document.activeElement.blur(); @@ -536,13 +540,13 @@ angular.module('icestudio') }); } - this.setBoardRules = function(value) { + this.setBoardRules = function(rules) { var cells = graph.getCells(); - profile.set('boardRules', value); + profile.set('boardRules', rules); _.each(cells, function(cell) { if (!cell.isLink()) { - cell.attributes.rules = value; + cell.attributes.rules = rules; var cellView = paper.findViewByModel(cell); cellView.updateBox(); } @@ -568,13 +572,15 @@ angular.module('icestudio') this.appEnable = function(value) { paper.options.enabled = value; if (value) { - angular.element('#menu').removeClass('disable-menu'); - angular.element('#paper').removeClass('disable-paper'); + angular.element('#menu').removeClass('is-disabled'); + angular.element('#paper').removeClass('looks-disabled'); + angular.element('#board').removeClass('looks-disabled'); angular.element('#banner').addClass('hidden'); } else { - angular.element('#menu').addClass('disable-menu'); - angular.element('#paper').addClass('disable-paper'); + angular.element('#menu').addClass('is-disabled'); + angular.element('#paper').addClass('looks-disabled'); + angular.element('#board').addClass('looks-disabled'); angular.element('#banner').removeClass('hidden'); } var cells = graph.getCells(); @@ -614,14 +620,15 @@ angular.module('icestudio') this.addDraggableCell = function(cell) { this.addingDraggableBlock = true; - cell.attributes.position = { - x: Math.round(((mousePosition.x - state.pan.x) / state.zoom - cell.attributes.size.width/2) / gridsize) * gridsize, - y: Math.round(((mousePosition.y - state.pan.y - menuHeight) / state.zoom - cell.attributes.size.height/2) / gridsize) * gridsize, - }; + var menuHeight = $('#menu').height(); + cell.set('position', { + x: Math.round(((mousePosition.x - state.pan.x) / state.zoom - cell.get('size').width/2) / gridsize) * gridsize, + y: Math.round(((mousePosition.y - state.pan.y - menuHeight) / state.zoom - cell.get('size').height/2) / gridsize) * gridsize, + }); graph.trigger('batch:start'); addCell(cell); disableSelected(); - var opt = { transparent: true }; + var opt = { transparent: true, initooltip: false }; var noBatch = true; selection.add(cell); selectionView.createSelectionBox(cell, opt); @@ -630,15 +637,19 @@ angular.module('icestudio') this.addDraggableCells = function(cells) { this.addingDraggableBlock = true; + var menuHeight = $('#menu').height(); if (cells.length > 0) { - var firstCellAttrs = cells[0].attributes; + var firstCell = cells[0]; var offset = { - x: Math.round(((mousePosition.x - state.pan.x) / state.zoom - firstCellAttrs.size.width/2) / gridsize) * gridsize - firstCellAttrs.position.x, - y: Math.round(((mousePosition.y - state.pan.y - menuHeight) / state.zoom - firstCellAttrs.size.height/2) / gridsize) * gridsize - firstCellAttrs.position.y, + x: Math.round(((mousePosition.x - state.pan.x) / state.zoom - firstCell.get('size').width/2) / gridsize) * gridsize - firstCell.get('position').x, + y: Math.round(((mousePosition.y - state.pan.y - menuHeight) / state.zoom - firstCell.get('size').height/2) / gridsize) * gridsize - firstCell.get('position').y, }; _.each(cells, function(cell) { - cell.attributes.position.x += offset.x; - cell.attributes.position.y += offset.y; + var position = cell.get('position'); + cell.set('position', { + x: position.x + offset.x, + y: position.y + offset.y + }); }); graph.trigger('batch:start'); addCells(cells); @@ -681,6 +692,24 @@ angular.module('icestudio') return newBoard; }; + this.setInfo = function(values, newValues, project) { + graph.startBatch('change'); + // Trigger info event + var data = { + previous: values, + next: newValues + }; + graph.trigger('info', { data: data }); + project.set('package', { + name: newValues[0], + version: newValues[1], + description: newValues[2], + author: newValues[3], + image: newValues[4] + }); + graph.stopBatch('change'); + }; + this.selectLanguage = function(language) { graph.startBatch('change'); // Trigger lang event @@ -736,7 +765,6 @@ angular.module('icestudio') if (block.design.graph.blocks) { _.each(block.design.graph.blocks, function(item) { if (item.type === 'basic.input' && !item.data.range) { - console.log(item, connectedLinks); var connected = false; _.each(connectedLinks, function(connectedLink) { if (connectedLink.get('target').port === item.id) { @@ -1103,6 +1131,7 @@ angular.module('icestudio') // - assign new UUIDs to the cells // - add the graph in the mouse position var origin = graphOrigin(design.graph); + var menuHeight = $('#menu').height(); var opt = { new: true, disabled: false, @@ -1178,18 +1207,21 @@ angular.module('icestudio') this.resetCodeErrors = function() { var cells = graph.getCells(); - _.each(cells, function(cell) { - var cellView; - if (cell.attributes.type === 'ice.Code') { - cellView = paper.findViewByModel(cell); - cellView.clearAnnotations(); - } - else if (cell.attributes.type === 'ice.Generic') { - cellView = paper.findViewByModel(cell); - } - if (cellView) { - cellView.$box.removeClass('highlight-error'); - } + return new Promise(function(resolve) { + _.each(cells, function(cell) { + var cellView; + if ((cell.get('type') === 'ice.Code') || + (cell.get('type') === 'ice.Generic') || + (cell.get('type') === 'ice.Constant')) + { + cellView = paper.findViewByModel(cell); + cellView.$box.removeClass('highlight-error'); + if (cell.get('type') === 'ice.Code') { + cellView.clearAnnotations(); + } + } + }); + resolve(); }); }; @@ -1197,20 +1229,22 @@ angular.module('icestudio') var cells = graph.getCells(); _.each(cells, function(cell) { var blockId, cellView; - if (codeError.blockType === 'code' && cell.attributes.type === 'ice.Code') { + if ((codeError.blockType === 'code' && cell.get('type') === 'ice.Code') || + (codeError.blockType === 'constant' && cell.get('type') === 'ice.Constant')) + { blockId = utils.digestId(cell.id); - if (codeError.blockId === blockId) { - cellView = paper.findViewByModel(cell); - cellView.$box.addClass('highlight-error'); - cellView.setAnnotation(codeError); - } } - else if (codeError.blockType === 'generic' && cell.attributes.type === 'ice.Generic') { + else if (codeError.blockType === 'generic' && cell.get('type') === 'ice.Generic') { blockId = utils.digestId(cell.attributes.blockType); - if (codeError.blockId === blockId) { - cellView = paper.findViewByModel(cell); + } + if (codeError.blockId === blockId) { + cellView = paper.findViewByModel(cell); + if (codeError.type === 'error') { cellView.$box.addClass('highlight-error'); } + if (cell.get('type') === 'ice.Code') { + cellView.setAnnotation(codeError); + } } }); }); diff --git a/app/scripts/services/profile.js b/app/scripts/services/profile.js index 280b610ca..c978fd869 100644 --- a/app/scripts/services/profile.js +++ b/app/scripts/services/profile.js @@ -19,22 +19,27 @@ angular.module('icestudio') this.load = function(callback) { var self = this; - utils.readFile(common.PROFILE_PATH, function(data) { - if (data) { - self.data = { - 'language': data.language || '', - 'remoteHostname': data.remoteHostname || '', - 'collection': data.collection || '', - 'board': data.board || '', - 'boardRules': data.boardRules !== false - }; - if (common.DARWIN) { - self.data['macosDrivers'] = data.macosDrivers || false; - } + utils.readFile(common.PROFILE_PATH) + .then(function(data) { + self.data = { + 'language': data.language || '', + 'remoteHostname': data.remoteHostname || '', + 'collection': data.collection || '', + 'board': data.board || '', + 'boardRules': data.boardRules !== false + }; + if (common.DARWIN) { + self.data['macosDrivers'] = data.macosDrivers || false; } if (callback) { callback(); } + }) + .catch(function(error) { + alertify.error(error, 30); + if (callback) { + callback(); + } }); }; @@ -53,9 +58,13 @@ angular.module('icestudio') if (!nodeFs.existsSync(common.ICESTUDIO_DIR)) { nodeFs.mkdirSync(common.ICESTUDIO_DIR); } - utils.saveFile(common.PROFILE_PATH, this.data, function() { + utils.saveFile(common.PROFILE_PATH, this.data) + .then(function() { // Success - }, true); + }) + .catch(function(error) { + alertify.error(error, 30); + }); }; }); diff --git a/app/scripts/services/project.js b/app/scripts/services/project.js index 9aaf0a0fd..5c120bee8 100644 --- a/app/scripts/services/project.js +++ b/app/scripts/services/project.js @@ -85,11 +85,13 @@ angular.module('icestudio') var self = this; this.path = emptyPath ? '' : filepath; this.filepath = filepath; - utils.readFile(filepath, function(data) { - if (data) { - var name = utils.basename(filepath); - self.load(name, data); - } + utils.readFile(filepath) + .then(function(data) { + var name = utils.basename(filepath); + self.load(name, data); + }) + .catch(function(error) { + alertify.error(error, 30); }); }; @@ -342,9 +344,13 @@ angular.module('icestudio') this.filepath = filepath; function doSaveProject() { - utils.saveFile(filepath, pruneProject(project), function() { + utils.saveFile(filepath, pruneProject(project)) + .then(function() { alertify.success(gettextCatalog.getString('Project {{name}} saved', { name: utils.bold(name) })); - }, true); + }) + .catch(function(error) { + alertify.error(error, 30); + }); } }; @@ -355,7 +361,7 @@ angular.module('icestudio') // Sort Constant cells by x-coordinate cells = _.sortBy(cells, function(cell) { if (cell.get('type') === 'ice.Constant') { - return cell.attributes.position.x; + return cell.get('position').x; } }); @@ -363,7 +369,7 @@ angular.module('icestudio') cells = _.sortBy(cells, function(cell) { if (cell.get('type') === 'ice.Input' || cell.get('type') === 'ice.Output') { - return cell.attributes.position.y; + return cell.get('position').y; } }); @@ -372,7 +378,8 @@ angular.module('icestudio') this.addBlockFile = function(filepath, notification) { var self = this; - utils.readFile(filepath, function(data) { + utils.readFile(filepath) + .then(function(data) { if (data.version !== common.VERSION) { alertify.warning(gettextCatalog.getString('Old project format {{version}}', { version: data.version }), 5); } @@ -426,6 +433,9 @@ angular.module('icestudio') alertify.success(gettextCatalog.getString('Block {{name}} imported', { name: utils.bold(block.package.name) })); } } + }) + .catch(function(error) { + alertify.error(error, 30); }); }; @@ -542,13 +552,10 @@ angular.module('icestudio') utils.updateWindowTitle(title); }; - this.export = function(target, filepath, message) { + this.compile = function(target) { this.update(); var opt = { boardRules: profile.get('boardRules') }; - var data = compiler.generate(target, project, opt); - utils.saveFile(filepath, data, function() { - alertify.success(message); - }, false); + return compiler.generate(target, project, opt); }; this.addBasicBlock = function(type) { diff --git a/app/scripts/services/shortcuts.js b/app/scripts/services/shortcuts.js index 556212710..82769ce53 100644 --- a/app/scripts/services/shortcuts.js +++ b/app/scripts/services/shortcuts.js @@ -115,11 +115,6 @@ angular.module('icestudio') linux: { label: 'Ctrl+A', ctrl: true, key: 65 }, mac: { label: '⌘+A', meta: true, key: 65 } }, - resetView: { - linux: { label: 'Ctrl+0', ctrl: true, key: 48 }, - mac: { label: '⌘+0', meta: true, key: 48 }, - opt: { disabled: true } - }, fitContent: { linux: { label: 'Ctrl+1', ctrl: true, key: 49 }, mac: { label: '⌘+1', meta: true, key: 49 }, diff --git a/app/scripts/services/tools.js b/app/scripts/services/tools.js index db786b0ac..4ac91b8c0 100644 --- a/app/scripts/services/tools.js +++ b/app/scripts/services/tools.js @@ -18,10 +18,15 @@ angular.module('icestudio') nodeSSHexec, nodeRSync, nodeAdmZip, - _package) { + _package, + $rootScope) { - var currentAlert = null; var taskRunning = false; + var resources = []; + var startAlert = null; + var infoAlert = null; + var resultAlert = null; + var toolchainAlert = null; var toolchain = { apio: '-', installed: false, disabled: false }; this.toolchain = toolchain; @@ -29,76 +34,188 @@ angular.module('icestudio') // Check if the toolchain is installed checkToolchain(); - // Remove build directory on start - nodeFse.removeSync(common.BUILD_DIR); + // Remove old build directory on start + nodeFse.removeSync(common.OLD_BUILD_DIR); - this.verifyCode = function() { - this.apio(['verify']); + this.verifyCode = function(startMessage, endMessage) { + return apioRun(['verify'], startMessage, endMessage); }; - this.buildCode = function() { - this.apio(['build', '-b', common.selectedBoard.name]); + this.buildCode = function(startMessage, endMessage) { + return apioRun(['build', '-b', common.selectedBoard.name], startMessage, endMessage); }; - this.uploadCode = function() { - this.apio(['upload', '-b', common.selectedBoard.name]); + this.uploadCode = function(startMessage, endMessage) { + return apioRun(['upload', '-b', common.selectedBoard.name], startMessage, endMessage); }; - this.apio = function(commands) { - var check = true; - if (taskRunning) { - return; - } - taskRunning = true; - var code = this.generateCode(); - if (code) { - if (toolchain.installed || toolchain.disabled) { - angular.element('#menu').addClass('disable-menu'); - // Annotate strings for translation - /// Start verification ... - gettext('start_verify'); - /// Start building ... - gettext('start_build'); - /// Start uploading ... - gettext('start_upload'); - var label = commands[0]; - var message = 'start_' + label; - currentAlert = alertify.message(gettextCatalog.getString(message), 100000); - $('body').addClass('waiting'); - check = this.syncResources(code); - try { - if (check) { - execute(commands, label, code, currentAlert, function() { - if (currentAlert) { - setTimeout(function() { - angular.element('#menu').removeClass('disable-menu'); - currentAlert.dismiss(true); - taskRunning = false; - }, 1000); - } - }); + function apioRun(commands, startMessage, endMessage) { + return new Promise(function(resolve) { + var sourceCode = ''; + + if (!taskRunning) { + taskRunning = true; + + if (resultAlert) { + resultAlert.dismiss(false); + } + + checkToolchainInstalled() + .then(function() { + enableTaskMode(); + if (startMessage) { + startAlert = alertify.message(startMessage, 100000); + } + return generateCode(); + }) + .then(function(code) { + sourceCode = code; + return syncResources(code); + }) + .then(function() { + var hostname = profile.get('remoteHostname'); + if (hostname) { + return executeRemote(commands, hostname); } else { - setTimeout(function() { - angular.element('#menu').removeClass('disable-menu'); - currentAlert.dismiss(true); - taskRunning = false; - $('body').removeClass('waiting'); - }, 2000); + return executeLocal(commands); } - } - catch(e) { - } + }) + .then(function(result) { + var show = startMessage || endMessage; + return processResult(result, sourceCode, show); + }) + .then(function() { + // Success + if (endMessage) { + resultAlert = alertify.success(gettextCatalog.getString(endMessage)); + } + disableTaskMode(); + restoreTask(); + resolve(); + }) + .catch(function() { + // Error + disableTaskMode(); + restoreTask(); + }); } - else { - alertify.error(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 30); - taskRunning = false; + }); + } + + function restoreTask() { + setTimeout(function() { + // Wait 1s before run a task again + if (startAlert) { + startAlert.dismiss(false); } - } - else { taskRunning = false; + }, 1000); + } + + function enableTaskMode() { + angular.element('#menu').addClass('disable-menu'); + $('body').addClass('waiting'); + } + + function disableTaskMode() { + angular.element('#menu').removeClass('disable-menu'); + $('body').removeClass('waiting'); + } + + function checkToolchainInstalled() { + return new Promise(function(resolve, reject) { + if (toolchain.installed || toolchain.disabled) { + resolve(); + } + else { + var message = gettextCatalog.getString('Toolchain not installed') + '.
    ' + gettextCatalog.getString('Click here to install it'); + if (!resultAlert) { + resultAlert = alertify.error(message, 30); + resultAlert.callback = function(isClicked) { + resultAlert = null; + if (isClicked) { + $rootScope.$broadcast('installToolchain'); + } + }; + } + reject(); + } + }); + } + + function generateCode() { + return new Promise(function(resolve) { + project.update(); + var opt = { + datetime: false, + boardRules: profile.get('boardRules') + }; + if (opt.boardRules) { + opt.initPorts = compiler.getInitPorts(project.get()); + opt.initPins = compiler.getInitPins(project.get()); + } + var verilog = compiler.generate('verilog', project.get(), opt); + var pcf = compiler.generate('pcf', project.get(), opt); + nodeFs.writeFileSync(nodePath.join(common.BUILD_DIR, 'main.v'), verilog, 'utf8'); + nodeFs.writeFileSync(nodePath.join(common.BUILD_DIR, 'main.pcf'), pcf, 'utf8'); + resolve(verilog); + }); + } + + function syncResources(code) { + return new Promise(function(resolve, reject) { + // Remove resources + removeFiles(resources); + resources = []; + // Find included files + resources = resources.concat(findIncludedFiles(code, reject)); + // Find list files + resources = resources.concat(findInlineFiles(code, reject)); + // Sync resources + resources = _.uniq(resources); + syncFiles(resources, reject); + resolve(); + }); + } + + function removeFiles(files) { + _.each(files, function(file) { + var filepath = nodePath.join(common.BUILD_DIR, file); + nodeFse.removeSync(filepath); + }); + } + + function findIncludedFiles(code) { + return findFiles(/[\n|\s]\/\/\s*@include\s+([^\s]*\.(v|vh|list))(\n|\s)/g, code); + } + + function findInlineFiles(code) { + return findFiles(/[\n|\s][^\/]?\"(.*\.list?)\"/g, code); + } + + function findFiles(pattern, code) { + var match; + var files = []; + while (match = pattern.exec(code)) { + files.push(match[1]); } - }; + return files; + } + + function syncFiles(files, reject) { + _.each(files, function(file) { + var destPath = nodePath.join(common.BUILD_DIR, file); + var origPath = nodePath.join(utils.dirname(project.filepath), file); + + // Copy file + var copySuccess = utils.copySync(origPath, destPath); + if (!copySuccess) { + resultAlert = alertify.error(gettextCatalog.getString('File {{file}} does not exist', { file: file }), 30); + reject(); + } + }); + } function checkToolchain(callback) { var apio = utils.getApioExecutable(); @@ -125,6 +242,14 @@ angular.module('icestudio') }); } else { + // An old version is installed + alertify.warning(gettextCatalog.getString('Toolchain version does not match') + '.
    ' + gettextCatalog.getString('Click here to install it'), 30) + .callback = function(isClicked) { + if (isClicked) { + // Install the new toolchain + $rootScope.$broadcast('installToolchain'); + } + }; if (callback) { callback(); } @@ -134,71 +259,12 @@ angular.module('icestudio') } } - this.generateCode = function() { - if (!nodeFs.existsSync(common.BUILD_DIR)) { - nodeFs.mkdirSync(common.BUILD_DIR); - } - project.update(); - var opt = { - datetime: false, - boardRules: profile.get('boardRules') - }; - if (opt.boardRules) { - opt.initPorts = compiler.getInitPorts(project.get()); - opt.initPins = compiler.getInitPins(project.get()); - } - var verilog = compiler.generate('verilog', project.get(), opt); - var pcf = compiler.generate('pcf', project.get(), opt); - nodeFs.writeFileSync(nodePath.join(common.BUILD_DIR, 'main.v'), verilog, 'utf8'); - nodeFs.writeFileSync(nodePath.join(common.BUILD_DIR, 'main.pcf'), pcf, 'utf8'); - return verilog; - }; - - this.syncResources = function(code) { - var ret; - - // Remove resources - nodeFse.removeSync('!(main.*)'); - - // Sync included files - ret = this.syncFiles(/[\n|\s]\/\/\s*@include\s+([^\s]*\.(v|vh))(\n|\s)/g, code); - - // Sync list files - if (ret) { - ret = this.syncFiles(/[\n|\s][^\/]?\"(.*\.list?)\"/g, code); - } - - return ret; - }; - - this.syncFiles = function(pattern, code) { - var ret = true; - var match; - while (match = pattern.exec(code)) { - var file = match[1]; - var destPath = nodePath.join(common.BUILD_DIR, file); - var origPath = nodePath.join(utils.dirname(project.filepath), file); - - // Copy included file - var copySuccess = utils.copySync(origPath, destPath); - if (!copySuccess) { - alertify.error(gettextCatalog.getString('File {{file}} does not exist', { file: file }), 30); - ret = false; - break; - } - } - - return ret; - }; - - function execute(commands, label, code, currentAlert, callback) { - var remoteHostname = profile.get('remoteHostname'); - - if (remoteHostname) { - currentAlert.setContent(gettextCatalog.getString('Synchronize remote files ...')); + function executeRemote(commands, hostname) { + return new Promise(function(resolve) { + startAlert.setContent(gettextCatalog.getString('Synchronize remote files ...')); nodeRSync({ src: common.BUILD_DIR + '/', - dest: remoteHostname + ':.build/', + dest: hostname + ':.build/', ssh: true, recursive: true, delete: true, @@ -206,66 +272,76 @@ angular.module('icestudio') exclude: ['.sconsign.dblite', '*.out', '*.blif', '*.asc', '*.bin'] }, function (error, stdout, stderr/*, cmd*/) { if (!error) { - currentAlert.setContent(gettextCatalog.getString('Execute remote {{label}} ...', { label: label })); - nodeSSHexec((['apio'].concat(commands).concat(['-p', '.build'])).join(' '), remoteHostname, + startAlert.setContent(gettextCatalog.getString('Execute remote {{label}} ...', { label: '' })); + nodeSSHexec((['apio'].concat(commands).concat(['-p', '.build'])).join(' '), hostname, function (error, stdout, stderr) { - processExecute(label, code, callback, error, stdout, stderr); + resolve({ error: error, stdout: stdout, stderr: stderr }); }); } else { - processExecute(label, code, callback, error, stdout, stderr); + resolve({ error: error, stdout: stdout, stderr: stderr }); } }); - } - else { + }); + } + + function executeLocal(commands) { + return new Promise(function(resolve) { if (commands[0] === 'upload') { + // Upload command requires drivers setup (Mac OS X) drivers.preUpload(function() { - _execute(); + _executeLocal(); }); } else { - _execute(); + // Other !upload commands + _executeLocal(); } - } - function _execute() { - var apio = utils.getApioExecutable(); - toolchain.disabled = utils.toolchainDisabled; - nodeChildProcess.exec(([apio].concat(commands).concat(['-p', utils.coverPath(common.BUILD_DIR)])).join(' '), { maxBuffer: 5000 * 1024 }, - function(error, stdout, stderr) { - if (!error && !stderr) { + function _executeLocal() { + var apio = utils.getApioExecutable(); + toolchain.disabled = utils.toolchainDisabled; + nodeChildProcess.exec( + ([apio].concat(commands).concat(['-p', utils.coverPath(common.BUILD_DIR)])).join(' '), + { maxBuffer: 5000 * 1024 }, // To avoid buffer overflow + function(error, stdout, stderr) { if (commands[0] === 'upload') { + // Upload command requires to restore the drivers (Mac OS X) drivers.postUpload(); } - } - processExecute(label, code, callback, error, stdout, stderr); - }); - } + resolve({ error: error, stdout: stdout, stderr: stderr }); + }); + } + }); } - function processExecute(label, code, callback, error, stdout, stderr) { - if (callback) { - callback(); - } - //console.log(label, error, stdout, stderr) - if (label) { + function processResult(result, code, show) { + result = result || {}; + var error = result.error; + var stdout = result.stdout; + var stderr = result.stderr; + + return new Promise(function(resolve, reject) { if (error || stderr) { + // -- Process errors + reject(); + if (stdout) { // - Apio errors if (stdout.indexOf('[upload] Error') !== -1 || stdout.indexOf('Error: board not detected') !== -1) { - alertify.error(gettextCatalog.getString('Board {{name}} not detected', { name: utils.bold(common.selectedBoard.info.label) }), 30); + resultAlert = alertify.error(gettextCatalog.getString('Board {{name}} not detected', { name: utils.bold(common.selectedBoard.info.label) }), 30); } else if (stdout.indexOf('Error: unkown board') !== -1) { - alertify.error(gettextCatalog.getString('Unknown board'), 30); + resultAlert = alertify.error(gettextCatalog.getString('Unknown board'), 30); } // - Arachne-pnr errors else if (stdout.indexOf('set_io: too few arguments') !== -1 || stdout.indexOf('fatal error: unknown pin') !== -1) { - alertify.error(gettextCatalog.getString('FPGA I/O ports not defined'), 30); + resultAlert = alertify.error(gettextCatalog.getString('FPGA I/O ports not defined'), 30); } else if (stdout.indexOf('fatal error: duplicate pin constraints') !== -1) { - alertify.error(gettextCatalog.getString('Duplicated FPGA I/O ports'), 30); + resultAlert = alertify.error(gettextCatalog.getString('Duplicated FPGA I/O ports'), 30); } else { var re, matchError, codeErrors = []; @@ -326,17 +402,23 @@ angular.module('icestudio') // Extract modules map from code var modules = mapCodeModules(code); - + var hasErrors = false; + var hasWarnings = false; for (var i in codeErrors) { var codeError = normalizeCodeError(codeErrors[i], modules); if (codeError) { // Launch codeError event $(document).trigger('codeError', [codeError]); + hasErrors = hasErrors || codeError.type === 'error'; + hasWarnings = hasWarnings || codeError.type === 'warning'; } } - if (codeErrors.length !== 0) { - alertify.error(gettextCatalog.getString('Errors detected in the code'), 5); + if (hasErrors) { + resultAlert = alertify.error(gettextCatalog.getString('Errors detected in the design'), 5); + } + else if (hasWarnings) { + resultAlert = alertify.warning(gettextCatalog.getString('Warnings detected in the design'), 5); } else { var stdoutWarning = stdout.split('\n').filter(function (line) { @@ -353,10 +435,10 @@ angular.module('icestudio') alertify.warning(stdoutWarning[0]); } if (stdoutError.length > 0) { - alertify.error(stdoutError[0], 30); + resultAlert = alertify.error(stdoutError[0], 30); } else { - alertify.error(stdout, 30); + resultAlert = alertify.error(stdout, 30); } } } @@ -365,71 +447,73 @@ angular.module('icestudio') // Remote hostname errors if (stderr.indexOf('Could not resolve hostname') !== -1 || stderr.indexOf('Connection refused') !== -1) { - alertify.error(gettextCatalog.getString('Wrong remote hostname {{name}}', { name: profile.get('remoteHostname') }), 30); + resultAlert = alertify.error(gettextCatalog.getString('Wrong remote hostname {{name}}', { name: profile.get('remoteHostname') }), 30); } else if (stderr.indexOf('No route to host') !== -1) { - alertify.error(gettextCatalog.getString('Remote host {{name}} not connected', { name: profile.get('remoteHostname') }), 30); + resultAlert = alertify.error(gettextCatalog.getString('Remote host {{name}} not connected', { name: profile.get('remoteHostname') }), 30); } else { - alertify.error(stderr, 30); + resultAlert = alertify.error(stderr, 30); } } } else { - // Annotate strings for translation - /// Verification done - gettext('done_verify'); - /// Build done - gettext('done_build'); - /// Upload done - gettext('done_upload'); - var message = 'done_' + label; - alertify.success(gettextCatalog.getString(message)); - if ((label === 'build' || label === 'upload') && stdout) { + //-- Process output + resolve(); + + if (stdout && show) { // Show used resources in the FPGA /* PIOs 0 / 96 PLBs 0 / 160 BRAMs 0 / 16 */ - var match, - fpgaResources = '', - patterns = [ - /PIOs.+/g, - /PLBs.+/g, - /BRAMs.+/g - ]; + var match; + var fpgaResources = ''; + var patterns = [ /PIOs.+/g, /PLBs.+/g, /BRAMs.+/g ]; for (var p in patterns) { match = patterns[p].exec(stdout); fpgaResources += (match && match.length > 0) ? match[0] + '\n' : ''; } if (fpgaResources) { - alertify.message('
    ' + fpgaResources + '
    ', 5); + setTimeout(function() { + alertify.message('
    ' + fpgaResources + '
    ', 5); + }, 0); } } } - $('body').removeClass('waiting'); - } + }); } function mapCodeModules(code) { var codelines = code.split('\n'); - var match, module = {}, modules = []; + var match, module = { params: [] }, modules = []; // Find begin/end lines of the modules for (var i in codelines) { var codeline = codelines[i]; // Get the module name if (!module.name) { - match = /module\s+(.*?)[\s|\(|$]/.exec(codeline); + match = /^module\s(.*?)[\s|;]/.exec(codeline); if (match) { module.name = match[1]; continue; } } + // Get the module parameters + if (!module.begin) { + match = /^\sparameter\s(.*?)\s/.exec(codeline); + if (match) { + module.params.push({ + name: match[1], + line: parseInt(i) + 1 + }); + continue; + } + } // Get the begin of the module code if (!module.begin) { - match = /;/.exec(codeline); + match = /;$/.exec(codeline); if (match) { module.begin = parseInt(i) + 1; continue; @@ -437,11 +521,11 @@ angular.module('icestudio') } // Get the end of the module code if (!module.end) { - match = /endmodule/.exec(codeline); + match = /^endmodule$/.exec(codeline); if (match) { module.end = parseInt(i) + 1; modules.push(module); - module = {}; + module = { params: [] }; } } } @@ -453,29 +537,67 @@ angular.module('icestudio') // Find the module with the error for (var i in modules) { var module = modules[i]; - if ((codeError.line > module.begin) && (codeError.line <= module.end)) { + if (codeError.line <= module.end) { newCodeError = { - type: codeError.type, - line: codeError.line - module.begin - ((codeError.line === module.end) ? 1 : 0), - msg: codeError.msg - }; - if (module.name.startsWith('main_')) { - // Code block - newCodeError.blockId = module.name.split('_')[1]; - newCodeError.blockType = 'code'; + type: codeError.type, + msg: codeError.msg + }; + // Find constant blocks in Yosys error: + // The error comes from the generated code + // but the origin is the constant block value + var re = /Failed\sto\sdetect\swidth\sfor\sparameter\s\\(.*?)\sat/g; + var matchConstant = re.exec(newCodeError.msg); + + if (codeError.line > module.begin && !matchConstant) { + if (module.name.startsWith('main_')) { + // Code block + newCodeError.blockId = module.name.split('_')[1]; + newCodeError.blockType = 'code'; + newCodeError.line = codeError.line - module.begin - ((codeError.line === module.end) ? 1 : 0); + } + else { + // Generic block + newCodeError.blockId = module.name.split('_')[0]; + newCodeError.blockType = 'generic'; + } + break; } else { - // Generic block - newCodeError.blockId = module.name.split('_')[0]; - newCodeError.blockType = 'generic'; + if (module.name === 'main') { + // Constant block + for (var j in module.params) { + var param = module.params[j]; + if ((codeError.line === param.line) || + (matchConstant && param.name === matchConstant[1])) + { + newCodeError.blockId = param.name; + newCodeError.blockType = 'constant'; + break; + } + } + } + else { + // Generic block + newCodeError.blockId = module.name; + newCodeError.blockType = 'generic'; + } + break; } - break; } } return newCodeError; } + // Toolchain methods + + $rootScope.$on('installToolchain', function(/*event*/) { + this.installToolchain(); + }.bind(this)); + this.installToolchain = function() { + if (resultAlert) { + resultAlert.dismiss(false); + } utils.removeToolchain(); if (utils.checkDefaultToolchain()) { installDefaultToolchain(); @@ -489,6 +611,9 @@ angular.module('icestudio') }; this.updateToolchain = function() { + if (resultAlert) { + resultAlert.dismiss(false); + } alertify.confirm(gettextCatalog.getString('The toolchain will be updated. This operation requires Internet connection. Do you want to continue?'), function() { installOnlineToolchain(); @@ -496,6 +621,9 @@ angular.module('icestudio') }; this.resetToolchain = function() { + if (resultAlert) { + resultAlert.dismiss(false); + } if (utils.checkDefaultToolchain()) { alertify.confirm(gettextCatalog.getString('The toolchain will be restored to default. Do you want to continue?'), function() { @@ -509,6 +637,9 @@ angular.module('icestudio') }; this.removeToolchain = function() { + if (resultAlert) { + resultAlert.dismiss(false); + } alertify.confirm(gettextCatalog.getString('The toolchain will be removed. Do you want to continue?'), function() { utils.removeToolchain(); @@ -518,6 +649,10 @@ angular.module('icestudio') }); }; + $rootScope.$on('enableDrivers', function(/*event*/) { + this.enableDrivers(); + }.bind(this)); + this.enableDrivers = function() { drivers.enable(); }; @@ -527,10 +662,7 @@ angular.module('icestudio') }; function installDefaultToolchain() { - // Configure alert - alertify.defaults.closable = false; - - utils.disableClickEvent(); + installationStatus(); var content = [ '
    ', @@ -542,11 +674,15 @@ angular.module('icestudio') '
    ', ' ', ''].join('\n'); - alertify.alert(content, function() { - setTimeout(function() { - initProgress(); - }, 200); - }); + toolchainAlert = alertify.alert(content, function() { + setTimeout(function() { + initProgress(); + // Restore OK button + $(toolchainAlert.__internal.buttons[0].element).removeClass('hidden'); + }, 200); + }); + // Hide OK button + $(toolchainAlert.__internal.buttons[0].element).addClass('hidden'); // Reset toolchain async.series([ @@ -558,16 +694,10 @@ angular.module('icestudio') extractDefaultApioPackages, installationCompleted ]); - - // Restore alert - alertify.defaults.closable = true; } function installOnlineToolchain() { - // Configure alert - alertify.defaults.closable = false; - - utils.disableClickEvent(); + installationStatus(); var content = [ '
    ', @@ -579,11 +709,15 @@ angular.module('icestudio') '
    ', ' ', ''].join('\n'); - alertify.alert(content, function() { - setTimeout(function() { - initProgress(); - }, 200); - }); + toolchainAlert = alertify.alert(content, function() { + setTimeout(function() { + initProgress(); + // Restore OK button + $(toolchainAlert.__internal.buttons[0].element).removeClass('hidden'); + }, 200); + }); + // Hide OK button + $(toolchainAlert.__internal.buttons[0].element).addClass('hidden'); // Install toolchain async.series([ @@ -599,16 +733,15 @@ angular.module('icestudio') apioInstallScons, installationCompleted ]); - - // Restore alert - alertify.defaults.closable = true; } function checkInternetConnection(callback) { updateProgress(gettextCatalog.getString('Check Internet connection...'), 0); utils.isOnline(callback, function() { - errorProgress(gettextCatalog.getString('Internet connection required')); - utils.enableClickEvent(); + closeToolchainAlert(); + restoreStatus(); + resultAlert = alertify.error(gettextCatalog.getString('Internet connection required'), 30); + callback(true); }); } @@ -618,8 +751,9 @@ angular.module('icestudio') callback(); } else { - errorProgress(gettextCatalog.getString('Python 2.7 is required')); - utils.enableClickEvent(); + closeToolchainAlert(); + restoreStatus(); + resultAlert = alertify.error(gettextCatalog.getString('Python 2.7 is required'), 30); callback(true); } } @@ -692,12 +826,26 @@ angular.module('icestudio') checkToolchain(function() { if (toolchain.installed) { updateProgress(gettextCatalog.getString('Installation completed'), 100); + closeToolchainAlert(); alertify.success(gettextCatalog.getString('Toolchain installed')); + var message = gettextCatalog.getString('Click here to setup the drivers'); + if (!infoAlert) { + setTimeout(function() { + infoAlert = alertify.message(message, 30); + infoAlert.callback = function(isClicked) { + infoAlert = null; + if (isClicked) { + $rootScope.$broadcast('enableDrivers'); + } + }; + }, 1000); + } } else { - errorProgress(gettextCatalog.getString('Toolchain not installed')); + closeToolchainAlert(); + resultAlert = alertify.error(gettextCatalog.getString('Toolchain not installed'), 30); } - utils.enableClickEvent(); + restoreStatus(); callback(); }); } @@ -724,15 +872,23 @@ angular.module('icestudio') .removeClass('notransition'); } - function errorProgress(message) { - angular.element('#progress-message') - .text(message); - angular.element('#progress-bar') - .addClass('notransition progress-bar-danger') - .removeClass('progress-bar-info progress-bar-striped active') - .text('Error') - .attr('aria-valuenow', 100) - .css('width', '100%'); + function closeToolchainAlert() { + toolchainAlert.callback(); + toolchainAlert.close(); + } + + function installationStatus() { + // Disable user events + utils.disableKeyEvents(); + utils.disableClickEvents(); + $('body').addClass('waiting'); + } + + function restoreStatus() { + // Enable user events + utils.enableKeyEvents(); + utils.enableClickEvents(); + $('body').removeClass('waiting'); } // Collections management diff --git a/app/scripts/services/utils.js b/app/scripts/services/utils.js index bd73dfbd5..194bb3204 100644 --- a/app/scripts/services/utils.js +++ b/app/scripts/services/utils.js @@ -10,7 +10,7 @@ angular.module('icestudio') nodeFse, nodePath, nodeChildProcess, - nodeTarball, + nodeExtract, nodeZlib, nodeOnline, nodeGlob, @@ -55,10 +55,9 @@ angular.module('icestudio') } } - this.extractTargz = function(source, destination, callback) { - nodeTarball.extractTarball(source, destination, function(err) { - if(err) { - //console.log(err); + this.extractZip = function(source, destination, callback) { + nodeExtract(source, {dir: destination}, function(error) { + if (error) { callback(true); } else { @@ -68,31 +67,41 @@ angular.module('icestudio') }; this.extractVirtualEnv = function(callback) { - this.extractTargz(common.VENV_TARGZ, common.CACHE_DIR, callback); + this.extractZip(common.VENV_ZIP, common.CACHE_DIR, callback); }; - function disableClick(e) { - e.stopPropagation(); - e.preventDefault(); + function disableEvent(event) { + event.stopPropagation(); + event.preventDefault(); } - function enableClickEvent() { - document.removeEventListener('click', disableClick, true); - } + this.enableClickEvents = function() { + document.removeEventListener('click', disableEvent, true); + }; - function disableClickEvent() { - document.addEventListener('click', disableClick, true); - } + this.disableClickEvents = function() { + document.addEventListener('click', disableEvent, true); + }; + + this.enableKeyEvents = function() { + document.removeEventListener('keyup', disableEvent, true); + document.removeEventListener('keydown', disableEvent, true); + document.removeEventListener('keypress', disableEvent, true); + }; - this.enableClickEvent = enableClickEvent; - this.disableClickEvent = disableClickEvent; + this.disableKeyEvents = function() { + document.addEventListener('keyup', disableEvent, true); + document.addEventListener('keydown', disableEvent, true); + document.addEventListener('keypress', disableEvent, true); + }; this.executeCommand = function(command, callback) { nodeChildProcess.exec(command.join(' '), function (error, stdout, stderr) { // console.log(error, stdout, stderr); if (error) { - enableClickEvent(); + this.enableKeyEvents(); + this.enableClickEvents(); callback(true); angular.element('#progress-message') .text(stderr); @@ -106,7 +115,7 @@ angular.module('icestudio') else { callback(); } - } + }.bind(this) ); }; @@ -128,7 +137,7 @@ angular.module('icestudio') this.checkDefaultToolchain = function() { try { - // TODO: use tar.gz with sha1 + // TODO: use zip with sha1 return nodeFs.statSync(common.TOOLCHAIN_DIR).isDirectory(); } catch (err) { @@ -137,7 +146,7 @@ angular.module('icestudio') }; this.extractDefaultApio = function(callback) { - this.extractTargz(common.DEFAULT_APIO_TARGZ, common.DEFAULT_APIO_DIR, callback); + this.extractZip(common.DEFAULT_APIO_ZIP, common.DEFAULT_APIO_DIR, callback); }; this.installDefaultApio = function(callback) { @@ -151,7 +160,7 @@ angular.module('icestudio') }; this.extractDefaultApioPackages = function(callback) { - this.extractTargz(common.DEFAULT_APIO_PACKAGES_TARGZ, common.APIO_HOME_DIR, callback); + this.extractZip(common.DEFAULT_APIO_PACKAGES_ZIP, common.APIO_HOME_DIR, callback); }; this.isOnline = function(callback, error) { @@ -193,31 +202,33 @@ angular.module('icestudio') }; this.removeToolchain = function() { - deleteFolderRecursive(common.ENV_DIR); - deleteFolderRecursive(common.CACHE_DIR); - deleteFolderRecursive(common.APIO_HOME_DIR); + this.deleteFolderRecursive(common.ENV_DIR); + this.deleteFolderRecursive(common.CACHE_DIR); + this.deleteFolderRecursive(common.APIO_HOME_DIR); }; this.removeCollections = function() { - deleteFolderRecursive(common.COLLECTIONS_DIR); + this.deleteFolderRecursive(common.COLLECTIONS_DIR); }; - this.deleteFolderRecursive = deleteFolderRecursive; + this.removeTempBuildDir = function() { + this.deleteFolderRecursive(common.BUILD_DIR); + }; - function deleteFolderRecursive(path) { + this.deleteFolderRecursive = function(path) { if (nodeFs.existsSync(path)) { nodeFs.readdirSync(path).forEach(function(file/*, index*/) { var curPath = nodePath.join(path, file); if (nodeFs.lstatSync(curPath).isDirectory()) { // recursive - deleteFolderRecursive(curPath); + this.deleteFolderRecursive(curPath); } else { // delete file nodeFs.unlinkSync(curPath); } - }); + }.bind(this)); nodeFs.rmdirSync(path); } - } + }; this.sep = nodePath.sep; @@ -231,83 +242,70 @@ angular.module('icestudio') return nodePath.dirname(filepath); }; - this.readFile = function(filepath, callback) { - nodeFs.readFile(filepath, - function(err, data) { - if (!err) { - decompressJSON(data, callback); - } - else { - if (callback) { - callback(); + this.readFile = function(filepath) { + return new Promise(function(resolve, reject) { + nodeFs.readFile(filepath, + function(err, content) { + if (err) { + reject(err.toString()); } - } + else { + var data = isJSON(content); + if (data) { + // JSON data + resolve(data); + } + else { + reject(gettextCatalog.getString('Invalid project format')); + } + } + }); }); }; - var saveBin = false; - - this.saveFile = function(filepath, content, callback, compress) { - if (compress) { - compressJSON(content, function(compressed) { - nodeFs.writeFile(filepath, compressed, saveBin ? 'binary' : null, + this.saveFile = function(filepath, data) { + return new Promise(function(resolve, reject) { + var content = data; + if (typeof data !== 'string') { + content = JSON.stringify(data, null, 2); + } + nodeFs.writeFile(filepath, content, function(err) { - if (!err && callback) { - callback(); + if (err) { + reject(err.toString()); + } + else { + resolve(); } }); - }); - } - else { - nodeFs.writeFile(filepath, content, function(err) { - if (!err && callback) { - callback(); - } - }); - } + }); }; - function compressJSON(json, callback) { - if (!saveBin) { + /*function compressJSON(data, callback) { + var content = JSON.stringify(data); + nodeZlib.gzip(content, function (_, compressed) { if (callback) { - callback(JSON.stringify(json, null, 2)); + callback(compressed); } - } - else { - var data = JSON.stringify(json); - nodeZlib.gzip(data, function (_, result) { - if (callback) { - callback(result); - } - }); - } - } + }); + }*/ - function decompressJSON(json, callback) { - var data = isJSON(json); - if (data) { + /*function decompressJSON(content, callback) { + nodeZlib.gunzip(content, function(_, uncompressed) { + var data = JSON.parse(uncompressed); if (callback) { callback(data); } - } - else { - nodeZlib.gunzip(json, function(_, uncompressed) { - var result = JSON.parse(uncompressed); - if (callback) { - callback(result); - } - }); - } - } + }); + }*/ - function isJSON(str) { - var result = false; + function isJSON(content) { try { - result = JSON.parse(str); - } catch (e) { + return JSON.parse(content); + } + catch (e) { return false; } - return result; } this.getFilesRecursive = getFilesRecursive; diff --git a/app/styles/design.css b/app/styles/design.css index e0fed3c0f..c18dd7016 100644 --- a/app/styles/design.css +++ b/app/styles/design.css @@ -1,5 +1,4 @@ -#paper { - top: -20px; +.paper { position: relative; display: inline-block; background: transparent; @@ -7,48 +6,54 @@ cursor: default; } -#paper svg { +.paper svg { background: transparent; position: relative; z-index: 0; } -#footer { - position: absolute; +.footer { + display: flex; cursor: default; - bottom: -5px; + position: absolute; + bottom: 0; width: 100%; + min-height: 45px; + padding: 4px; + border-top: 1px solid #d5dadd; z-index: 1501; } -#breadcrumbs { - margin-bottom: 5px; - border-radius: 0px; - background-color: #f8f8f8; - border-top: 1px solid #e7e7e7; +.breadcrumbs-container { + flex: 1; } -#breadcrumbs>li { - color: #333; +.board-container { + display: flex; + align-items: center; + padding: 0 15px; } -#breadcrumbs>li>a:hover { - text-decoration: none; +.breadcrumb { + margin: 0; + background-color: #f5f6f7; } -#board { - position: absolute; - bottom: 12px; - right: 15px; +.breadcrumb>.active { + color: #333; } -#banner { +.breadcrumb>li>a:hover { + text-decoration: none; +} + +.banner { position: relative; } -#info { +.info { position: absolute; - top: -10px; + top: 10px; left: 15px; font-size: 15px; color: #656565; @@ -58,9 +63,9 @@ z-index: 1501; } -#read-only { +.read-only { position: absolute; - top: -10px; + top: 10px; right: 15px; font-size: 14px; color: #f05c5c; @@ -70,19 +75,22 @@ z-index: 1501; } -#back-button { +.back-button { position: absolute; - top: 20px; + top: 40px; right: 15px; font-size: 14px; color: #63afcf; background-color: white; border-radius: 5px; cursor: pointer; - text-decoration: none; z-index: 1501; } +.back-button:hover { + text-decoration: none; +} + .disable-graph { pointer-events: none; } diff --git a/app/styles/main.css b/app/styles/main.css index dd51c137c..a322eb26f 100644 --- a/app/styles/main.css +++ b/app/styles/main.css @@ -1,11 +1,6 @@ * { - -webkit-touch-callout: none; /* iOS Safari */ - -webkit-user-select: none; /* Chrome/Safari/Opera */ - -khtml-user-select: none; /* Konqueror */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* Internet Explorer/Edge */ - user-select: none; /* Non-prefixed version, currently - not supported by any browser */ + -webkit-user-select: none; + user-select: none; } .notransition { @@ -22,16 +17,24 @@ body { height: 100%; } +.hidden { + visibility: hidden; +} + +.ice-bar { + background: #f5f6f7; +} + .waiting * { - cursor: progress; + cursor: wait !important; } -.alertify-notifier.ajs-right { - bottom: 45px; +.alertify-notifier { + right: 0 !important; } .alertify-notifier.ajs-bottom { - bottom: 45px; + bottom: 69px; } .alertify-notifier .ajs-message { diff --git a/app/styles/menu.css b/app/styles/menu.css index 3d6653854..3f834a4c4 100644 --- a/app/styles/menu.css +++ b/app/styles/menu.css @@ -1,14 +1,16 @@ -.disable-menu { +.is-disabled { pointer-events: none; opacity: 0.8; } -.disable-paper { +.looks-disabled { opacity: 0.8; } .navbar { - z-index: 1501; + border-bottom: 1px solid #d5dadd; + margin-bottom: 0; + z-index: 1502; } .navbar-right { @@ -26,6 +28,7 @@ } .dropdown-submenu > .dropdown-menu { + display: block; top: 0; left: 100%; margin-top: -6px; @@ -33,10 +36,13 @@ -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; + visibility: hidden; + transition-delay: 0.3s; } .dropdown-submenu:hover > .dropdown-menu { - display: block; + visibility: visible; + transition-delay: 0.3s; } .dropdown-submenu > a:after { @@ -53,10 +59,6 @@ margin-right: -10px; } -.dropdown-submenu:hover > a:after { - border-left-color: #fff; -} - .dropdown-submenu.pull-left { float: none; } @@ -74,6 +76,7 @@ } .dropdown-submenu-right > .dropdown-menu { + display: block; top: 0; right: 100%; margin-top: -6px; @@ -81,34 +84,29 @@ -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; + visibility: hidden; + transition-delay: 0.3s; } .dropdown-submenu-right:hover > .dropdown-menu { - display: block; + visibility: visible; + transition-delay: 0.3s; } .dropdown-submenu-right > a:after { display: block; content: " "; - float: right; + float: left; width: 0; height: 0; border-color: transparent; border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: #ccc; + border-width: 5px 5px 5px 0; + border-right-color: #ccc; margin-top: 5px; - margin-right: -10px; -} - -.dropdown-submenu-right:hover > a:after { - border-left-color: #fff; + margin-right: 10px; } .navbar-default .navbar-nav>li>a { - color: #555; -} - -.navbar-default .navbar-nav>li>a:focus, .navbar-default .navbar-nav>li>a:hover { - color: #555; + color: #333 !important; } diff --git a/app/views/design.html b/app/views/design.html index a6e57a95c..ff5309b64 100644 --- a/app/views/design.html +++ b/app/views/design.html @@ -1,18 +1,22 @@
    -