diff --git a/.gitignore b/.gitignore
index 399b3aed0..be82bc7d5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,7 @@
*.bin
*.blif
*.log
+*.mo
.tmp
dist
@@ -16,3 +17,4 @@ bower_components
app/profile.json
app/_cache
app/_build
+app/resources/locale/**/*.json
diff --git a/README.md b/README.md
index 52f2df594..b177b6dc2 100644
--- a/README.md
+++ b/README.md
@@ -80,6 +80,18 @@ npm run dist
NOTE: in Mac OS X this commmand generates also a **dmg** package.
+## Languages
+
+| Language | Translated strings |
+|:----------:|:------------------------------------------:|
+| English | ![Progress](http://progressed.io/bar/100) |
+| Spanish | ![Progress](http://progressed.io/bar/100) |
+| French | ![Progress](http://progressed.io/bar/87) |
+| Basque | ![Progress](http://progressed.io/bar/80) |
+| Galician | ![Progress](http://progressed.io/bar/78) |
+
+**Contribute**: add or update the [translations](https://github.com/FPGAwars/icestudio/tree/develop/app/resources/locale) by following the [next instructions](https://angular-gettext.rocketeer.be/dev-guide/translate/#poedit).
+
## Version 0.1
![][icestudio-0.1-demo]
@@ -114,6 +126,7 @@ NOTE: in Mac OS X this commmand generates also a **dmg** package.
* [Xoan Sampaiño](https://github.com/xoan)
* [Salvador E. Tropea](https://github.com/set-soft)
* [Democrito](https://github.com/Democrito)
+ * [Martoni](https://github.com/Martoni)
* v0.1
* [Miguel Sánchez de León Peque](https://github.com/Peque)
diff --git a/app/bower.json b/app/bower.json
index c352491e9..bdc87e504 100644
--- a/app/bower.json
+++ b/app/bower.json
@@ -36,6 +36,7 @@
"async": "^1.5.2",
"svg-pan-zoom": "^3.2.9",
"alertify-js": "^1.8.0",
- "jquery-resize": "*"
+ "jquery-resize": "*",
+ "angular-gettext": "^2.3.8"
}
}
diff --git a/app/index.html b/app/index.html
index eaa2b6368..a7e5f817b 100644
--- a/app/index.html
+++ b/app/index.html
@@ -46,6 +46,7 @@
+
diff --git a/app/resources/blocks/labels.js b/app/resources/blocks/labels.js
new file mode 100644
index 000000000..92297d24b
--- /dev/null
+++ b/app/resources/blocks/labels.js
@@ -0,0 +1,56 @@
+// In this file the blocks labels are annotated for translation
+
+/// Bit
+gettext('bit')
+/// Config
+gettext('config')
+/// Pull up
+gettext('pull_up')
+/// Pull up inv
+gettext('pull_up_inv')
+/// Tri-state
+gettext('tri_state')
+/// Logic
+gettext('logic')
+/// Comb
+gettext('comb')
+/// Demux 1:2
+gettext('demux_1_2')
+/// Demux 1:4
+gettext('demux_1_4')
+/// Demux 1:8
+gettext('demux_1_8')
+/// Hex 7 Segment CC
+gettext('hex_7seg_cc')
+/// Hex 7 Segment CA
+gettext('hex_7seg_ca')
+/// Mux 2:1
+gettext('mux_2_1')
+/// Mux 4:1
+gettext('mux_4_1')
+/// Gate
+gettext('gate')
+/// And
+gettext('and')
+/// Nand
+gettext('nand')
+/// Nor
+gettext('nor')
+/// Not
+gettext('not')
+/// Or
+gettext('or')
+/// Xnor
+gettext('xnor')
+/// Xor
+gettext('xor')
+/// Sec
+gettext('sec')
+/// D flip-flop async
+gettext('dff_ar')
+/// D flip-flop async
+gettext('dff_sr')
+/// T flip-flop async
+gettext('tff_ar')
+/// T flip-flop
+gettext('tff_sr')
diff --git a/app/resources/examples/labels.js b/app/resources/examples/labels.js
new file mode 100644
index 000000000..73c95cac6
--- /dev/null
+++ b/app/resources/examples/labels.js
@@ -0,0 +1,10 @@
+// In this file the examples labels are annotated for translation
+
+/// 1. Basic
+gettext('1_basic')
+/// 1. Led on
+gettext('1_led_on')
+/// 2. Switch led
+gettext('2_switch_led')
+/// 3. Switch and gate
+gettext('3_switch_and_gate')
diff --git a/app/resources/locale/en.json b/app/resources/locale/en.json
deleted file mode 100644
index cb6512fce..000000000
--- a/app/resources/locale/en.json
+++ /dev/null
@@ -1,142 +0,0 @@
-{
- "file": "File",
- "edit": "Edit",
- "view": "View",
- "boards": "Boards",
- "tools": "Tools",
- "help": "Help",
- "new_project": "New project",
- "open_project": "Open project",
- "examples": "Examples",
- "templates": "Templates",
- "save": "Save",
- "save_as": "Save as",
- "import_block": "Import block",
- "export_as_block": "Export as block",
- "export": "Export",
- "verilog": "Verilog",
- "preferences": "Preferences",
- "pcf": "PCF",
- "datasheet_not_defined": "Datasheet not defined",
- "testbench": "Testbench",
- "gtkwave": "GTKWave",
- "datasheet": "Datasheet",
- "clone_selected": "Clone selected",
- "remove_selected": "Remove selected",
- "clear_all": "Clear all",
- "image_path": "Image path",
- "remote_hostname": "Remote hostname",
- "language": "Language",
- "english": "English",
- "spanish": "Spanish",
- "galician": "Galician",
- "french": "French",
- "basque": "Basque",
- "reset_view": "Reset view",
- "verify": "Verify",
- "build": "Build",
- "upload": "Upload",
- "sync_remote_files": "Synchronize remote files ...",
- "execute_remote": "Execute remote {{label}} ...",
- "toolchain": "Toolchain",
- "install": "Install",
- "update": "Update",
- "remove": "Remove",
- "reset_default": "Reset default",
- "toolchain_not_installed": "Toolchain not installed. Please, install the toolchain",
- "drivers": "Drivers",
- "enable": "Enable",
- "drivers_enabled": "Drivers enabled",
- "disable": "Disable",
- "drivers_disabled": "Drivers disabled",
- "homebrew_required": "Homebrew is required",
- "unplug_and_reconnect": "Unplug and reconnect the board",
- "install_drivers_windows": "
FTDI driver installation instructions
- Connect the FPGA board
- Replace the (Interface 0) driver of the board by libusbK
- Unplug and reconnect the board
Note: not fully working with Windows 10 + USB 3.0
",
- "uninstall_drivers_windows": "FTDI driver uninstallation instructions
- Find the FPGA USB Device
- Select the board interface and uninstall the driver
",
- "view_license": "View license",
- "version": "Version",
- "documentation": "Documentation",
- "source_code": "Source code",
- "community_forum": "Community forum",
- "about_icestudio": "About Icestudio",
- "basic": "Basic",
- "code": "Code",
- "info": "Info",
- "input": "Input",
- "output": "Output",
- "bit": "Bit",
- "config": "Config",
- "pull_up": "Pull up",
- "pull_up_inv": "Pull up inv",
- "tri_state": "Tri-state",
- "logic": "Logic",
- "comb": "Comb",
- "demux_1_2": "Demux 1:2",
- "demux_1_4": "Demux 1:4",
- "demux_1_8": "Demux 1:8",
- "hex_7seg_cc": "Hex 7 Segment CC",
- "hex_7seg_ca": "Hex 7 Segment CA",
- "mux_2_1": "Mux 2:1",
- "mux_4_1": "Mux 4:1",
- "gate": "Gate",
- "and": "And",
- "nand": "Nand",
- "nor": "Nor",
- "not": "Not",
- "or": "Or",
- "xnor": "Xnor",
- "xor": "Xor",
- "sec": "Sec",
- "dff_ar": "D flip-flop async",
- "dff_sr": "D flip-flop",
- "tff_ar": "T flip-flop async",
- "tff_sr": "T flip-flop",
- "1_basic": "1. Basic",
- "1_led_on": "1. Led on",
- "2_switch_led": "2. Switch led",
- "3_switch_and_gate": "3. Switch and gate",
- "read_only": "Read only",
- "untitled": "untitled",
- "enter_project_title": "Enter the project's title",
- "load_project_confirmation": "The current project will be removed. Do you want to continue loading the project?",
- "enter_project_image_path": "Enter the project's image path",
- "enter_remote_hostname": "Enter the remote hostname user@host (experimental)",
- "wrong_remote_hostname": "Wrong remote hostname {{name}}",
- "remote_host_not_connected": "Remote host {{name}} not connected",
- "clear_all_confirmation": "Do you want to clear all?",
- "remove_block_confirmation": "Do you want to remove the selected block?",
- "change_board_confirmation": "The current FPGA I/O configuration will be lost. Do you want to change to {{name}} board?",
- "board_selected": "Board {{name}} selected",
- "remove_toolchain_confirmation": "The toolchain will be removed. Do you want to continue?",
- "toolchain_removed": "Toolchain removed",
- "project_created": "New project {{name}} created",
- "project_loaded": "Project {{name}} loaded",
- "wrong_project_format": "Wrong project format: {{name}}",
- "project_saved": "Project {{name}} saved",
- "block_imported": "Block {{name}} imported",
- "block_exported_as": "Block exported as {{name}}",
- "verilog_exported": "Verilog code exported",
- "pcf_exported": "PCF file exported",
- "testbench_exported": "Testbench exported",
- "gtkwave_exported": "GTKWave exported",
- "enter_block_label": "Enter the block's label",
- "label_updated": "Label updated",
- "enter_block_ports": "Enter the block's ports",
- "wrong_block_format": "Wrong block format: {{type}}",
- "start_verify": "Start verification ...",
- "start_build": "Start building ...",
- "start_upload": "Start uploading ...",
- "done_verify": "Verification done",
- "done_build": "Build done",
- "done_upload": "Upload done",
- "generic_error": "Error: {{error}}",
- "file_does_not_exist": "File {{file}} does not exist",
- "board_not_detected": "Board {{name}} not detected",
- "unknown_board": "Unknown board",
- "fpga_io_not_defined": "FPGA I/O ports not defined",
- "duplicated_fpga_io": "Duplicated FPGA I/O ports",
- "installing_toolchain": "Installing toolchain",
- "internet_connection_required": "Internet connection required",
- "installation_completed": "Installation completed",
- "toolchain_installed": "Toolchain installed"
-}
diff --git a/app/resources/locale/en/en.po b/app/resources/locale/en/en.po
new file mode 100644
index 000000000..18a1f7dd5
--- /dev/null
+++ b/app/resources/locale/en/en.po
@@ -0,0 +1,678 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: en\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. 1. Basic
+#: app/resources/examples/labels.js:4
+msgid "1_basic"
+msgstr "1. Basic"
+
+#. 1. Led on
+#: app/resources/examples/labels.js:6
+msgid "1_led_on"
+msgstr "1. Led on"
+
+#. 2. Switch led
+#: app/resources/examples/labels.js:8
+msgid "2_switch_led"
+msgstr "2. Switch led"
+
+#. 3. Switch and gate
+#: app/resources/examples/labels.js:10
+msgid "3_switch_and_gate"
+msgstr "3. Switch and gate"
+
+#: app/scripts/services/utils.service.js:414
+#: app/scripts/services/utils.service.js:489
+msgid "Unplug and reconnect the board"
+msgstr "Unplug and reconnect the board"
+
+#: app/scripts/services/utils.service.js:480
+msgid ""
+"FTDI driver installation instructions
- Connect the FPGA "
+"board
- Replace the (Interface 0) driver of the board by "
+"libusbK
- Unplug and reconnect the board
"
+msgstr ""
+"FTDI driver installation instructions
- Connect the FPGA "
+"board
- Replace the (Interface 0) driver of the board by "
+"libusbK
- Unplug and reconnect the board
"
+
+#: app/scripts/services/utils.service.js:496
+msgid ""
+"FTDI driver uninstallation instructions
- Find the FPGA USB "
+"Device
- Select the board interface and uninstall the driver
"
+msgstr ""
+"FTDI driver uninstallation instructions
- Find the FPGA USB "
+"Device
- Select the board interface and uninstall the driver
"
+
+#: app/views/menu.html:271
+msgid "About Icestudio"
+msgstr "About Icestudio"
+
+#: app/views/menu.html:281
+msgid "Basic"
+msgstr "Basic"
+
+#: app/views/menu.html:152
+msgid "Basque"
+msgstr "Basque"
+
+#: app/scripts/services/common.service.js:94
+msgid "Block exported as {{name}}"
+msgstr "Block exported as {{name}}"
+
+#: app/scripts/services/common.service.js:75
+msgid "Block {{name}} imported"
+msgstr "Block {{name}} imported"
+
+#: app/scripts/services/tools.service.js:218
+msgid "Board {{name}} not detected"
+msgstr "Board {{name}} not detected"
+
+#: app/scripts/controllers/menu.js:407 app/scripts/controllers/menu.js:413
+msgid "Board {{name}} selected"
+msgstr "Board {{name}} selected"
+
+#: app/views/menu.html:185
+msgid "Boards"
+msgstr "Boards"
+
+#: app/views/menu.html:203
+msgid "Build"
+msgstr "Build"
+
+#: app/scripts/services/tools.service.js:406
+msgid "Check Internet connection..."
+msgstr "Check Internet connection..."
+
+#: app/scripts/services/tools.service.js:414
+msgid "Check Python..."
+msgstr "Check Python..."
+
+#: app/views/menu.html:112
+msgid "Clear all"
+msgstr "Clear all"
+
+#: app/views/menu.html:106
+msgid "Clone selected"
+msgstr "Clone selected"
+
+#: app/views/menu.html:284
+msgid "Code"
+msgstr "Code"
+
+#: app/views/menu.html:267
+msgid "Community forum"
+msgstr "Community forum"
+
+#: app/views/menu.html:179
+msgid "Datasheet"
+msgstr "Datasheet"
+
+#: app/scripts/controllers/menu.js:394
+msgid "Datasheet not defined"
+msgstr "Datasheet not defined"
+
+#: app/scripts/services/tools.service.js:283
+msgid ""
+"Default toolchain not found. Toolchain will be downloaded. This operation "
+"requires Internet connection. Do you want to continue?"
+msgstr ""
+"Default toolchain not found. Toolchain will be downloaded. This operation "
+"requires Internet connection. Do you want to continue?"
+
+#: app/views/menu.html:241
+msgid "Disable"
+msgstr "Disable"
+
+#: app/scripts/controllers/menu.js:314
+msgid "Do you want to clear all?"
+msgstr "Do you want to clear all?"
+
+#: app/scripts/controllers/menu.js:327
+msgid "Do you want to remove the selected block?"
+msgstr "Do you want to remove the selected block?"
+
+#: app/views/menu.html:260
+msgid "Documentation"
+msgstr "Documentation"
+
+#: app/views/menu.html:234
+msgid "Drivers"
+msgstr "Drivers"
+
+#: app/scripts/services/utils.service.js:411
+#: app/scripts/services/utils.service.js:474
+msgid "Drivers disabled"
+msgstr "Drivers disabled"
+
+#: app/scripts/services/utils.service.js:408
+#: app/scripts/services/utils.service.js:455
+msgid "Drivers enabled"
+msgstr "Drivers enabled"
+
+#: app/scripts/services/tools.service.js:230
+msgid "Duplicated FPGA I/O ports"
+msgstr "Duplicated FPGA I/O ports"
+
+#: app/views/menu.html:99
+msgid "Edit"
+msgstr "Edit"
+
+#: app/views/menu.html:237
+msgid "Enable"
+msgstr "Enable"
+
+#: app/views/menu.html:134
+msgid "English"
+msgstr "English"
+
+#: app/scripts/services/graph.service.js:257
+#: app/scripts/services/graph.service.js:464
+#: app/scripts/services/graph.service.js:504
+msgid "Enter the block's label"
+msgstr "Enter the block's label"
+
+#: app/scripts/services/graph.service.js:409
+msgid "Enter the block's ports"
+msgstr "Enter the block's ports"
+
+#: app/scripts/controllers/menu.js:290
+msgid "Enter the project's image path"
+msgstr "Enter the project's image path"
+
+#: app/scripts/controllers/menu.js:72
+msgid "Enter the project's title"
+msgstr "Enter the project's title"
+
+#: app/scripts/controllers/menu.js:298
+msgid "Enter the remote hostname user@host (experimental)"
+msgstr "Enter the remote hostname user@host (experimental)"
+
+#: app/scripts/services/tools.service.js:306
+msgid "Error: default toolchain not found in '{{dir}}'"
+msgstr "Error: default toolchain not found in '{{dir}}'"
+
+#: app/scripts/services/tools.service.js:161
+msgid "Error: {{error}}"
+msgstr "Error: {{error}}"
+
+#: app/views/menu.html:32
+msgid "Examples"
+msgstr "Examples"
+
+#: app/scripts/services/tools.service.js:189
+msgid "Execute remote {{label}} ..."
+msgstr "Execute remote {{label}} ..."
+
+#: app/views/menu.html:79
+msgid "Export"
+msgstr "Export"
+
+#: app/views/menu.html:75
+msgid "Export as block"
+msgstr "Export as block"
+
+#: app/scripts/services/tools.service.js:438
+msgid "Extract default apio files..."
+msgstr "Extract default apio files..."
+
+#: app/scripts/services/tools.service.js:448
+msgid "Extract default apio packages..."
+msgstr "Extract default apio packages..."
+
+#: app/scripts/services/tools.service.js:426
+msgid "Extract virtual env files..."
+msgstr "Extract virtual env files..."
+
+#: app/scripts/services/tools.service.js:224
+#: app/scripts/services/tools.service.js:227
+msgid "FPGA I/O ports not defined"
+msgstr "FPGA I/O ports not defined"
+
+#: app/views/menu.html:23
+msgid "File"
+msgstr "File"
+
+#: app/scripts/services/tools.service.js:155
+msgid "File {{file}} does not exist"
+msgstr "File {{file}} does not exist"
+
+#: app/views/menu.html:158
+msgid "French"
+msgstr "French"
+
+#: app/scripts/services/common.service.js:134
+msgid "GTKWave exported"
+msgstr "GTKWave exported"
+
+#: app/views/menu.html:146
+msgid "Galician"
+msgstr "Galician"
+
+#: app/views/menu.html:250
+msgid "Help"
+msgstr "Help"
+
+#: app/scripts/services/utils.service.js:445
+msgid "Homebrew is required"
+msgstr "Homebrew is required"
+
+#: app/views/menu.html:119
+msgid "Image path"
+msgstr "Image path"
+
+#: app/views/menu.html:72
+msgid "Import block"
+msgstr "Import block"
+
+#: app/views/menu.html:285
+msgid "Info"
+msgstr "Info"
+
+#: app/views/menu.html:286
+msgid "Input"
+msgstr "Input"
+
+#: app/scripts/services/tools.service.js:443
+msgid "Install default apio..."
+msgstr "Install default apio..."
+
+#: app/scripts/services/tools.service.js:492
+msgid "Installation completed"
+msgstr "Installation completed"
+
+#: app/scripts/services/tools.service.js:335
+#: app/scripts/services/tools.service.js:372
+msgid "Installing toolchain"
+msgstr "Installing toolchain"
+
+#: app/scripts/services/tools.service.js:408
+#: app/scripts/services/utils.service.js:448
+msgid "Internet connection required"
+msgstr "Internet connection required"
+
+#: app/scripts/services/graph.service.js:261
+msgid "Label updated"
+msgstr "Label updated"
+
+#: app/views/menu.html:130
+msgid "Language"
+msgstr "Language"
+
+#: app/scripts/services/tools.service.js:431
+msgid "Make virtual env..."
+msgstr "Make virtual env..."
+
+#: app/views/menu.html:26
+msgid "New project"
+msgstr "New project"
+
+#: app/scripts/services/common.service.js:31
+msgid "New project {{name}} created"
+msgstr "New project {{name}} created"
+
+#: app/views/menu.html:29
+msgid "Open project"
+msgstr "Open project"
+
+#: app/views/menu.html:287
+msgid "Output"
+msgstr "Output"
+
+#: app/scripts/services/common.service.js:114
+msgid "PCF file exported"
+msgstr "PCF file exported"
+
+#: app/views/menu.html:116
+msgid "Preferences"
+msgstr "Preferences"
+
+#: app/scripts/services/common.service.js:51
+msgid "Project {{name}} loaded"
+msgstr "Project {{name}} loaded"
+
+#: app/scripts/services/common.service.js:63
+msgid "Project {{name}} saved"
+msgstr "Project {{name}} saved"
+
+#: app/scripts/services/tools.service.js:419
+msgid "Python 2.7 is required"
+msgstr "Python 2.7 is required"
+
+#: app/views/project.html:2
+msgid "Read only"
+msgstr "Read only"
+
+#: app/scripts/services/tools.service.js:256
+msgid "Remote host {{name}} not connected"
+msgstr "Remote host {{name}} not connected"
+
+#: app/views/menu.html:124
+msgid "Remote hostname"
+msgstr "Remote hostname"
+
+#: app/views/menu.html:219
+msgid "Remove"
+msgstr "Remove"
+
+#: app/views/menu.html:109
+msgid "Remove selected"
+msgstr "Remove selected"
+
+#: app/views/menu.html:224
+msgid "Reset default"
+msgstr "Reset default"
+
+#: app/views/menu.html:102
+msgid "Reset view"
+msgstr "Reset view"
+
+#: app/views/menu.html:65
+msgid "Save"
+msgstr "Save"
+
+#: app/views/menu.html:68
+msgid "Save as"
+msgstr "Save as"
+
+#: app/views/menu.html:263
+msgid "Source code"
+msgstr "Source code"
+
+#: app/views/menu.html:140
+msgid "Spanish"
+msgstr "Spanish"
+
+#: app/scripts/services/tools.service.js:178
+msgid "Synchronize remote files ..."
+msgstr "Synchronize remote files ..."
+
+#: app/views/menu.html:49
+msgid "Templates"
+msgstr "Templates"
+
+#: app/views/menu.html:88
+msgid "Testbench"
+msgstr "Testbench"
+
+#: app/scripts/services/common.service.js:124
+msgid "Testbench exported"
+msgstr "Testbench exported"
+
+#: app/scripts/controllers/menu.js:403
+msgid ""
+"The current FPGA I/O configuration will be lost. Do you want to change to "
+"{{name}} board?"
+msgstr ""
+"The current FPGA I/O configuration will be lost. Do you want to change to "
+"{{name}} board?"
+
+#: app/scripts/controllers/menu.js:117 app/scripts/controllers/menu.js:94
+msgid ""
+"The current project will be removed. Do you want to continue loading the "
+"project?"
+msgstr ""
+"The current project will be removed. Do you want to continue loading the "
+"project?"
+
+#: app/scripts/services/tools.service.js:311
+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.service.js:299
+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.service.js:291
+msgid ""
+"The toolchain will be updated. This operation requires Internet connection. "
+"Do you want to continue?"
+msgstr ""
+"The toolchain will be updated. This operation requires Internet connection. "
+"Do you want to continue?"
+
+#: app/views/menu.html:210
+msgid "Toolchain"
+msgstr "Toolchain"
+
+#: app/scripts/services/tools.service.js:493
+msgid "Toolchain installed"
+msgstr "Toolchain installed"
+
+#: app/scripts/services/tools.service.js:497
+msgid "Toolchain not installed"
+msgstr "Toolchain not installed"
+
+#: app/scripts/services/tools.service.js:79
+#: app/scripts/services/utils.service.js:486
+#: app/scripts/services/utils.service.js:502
+msgid "Toolchain not installed. Please, install the toolchain"
+msgstr "Toolchain not installed. Please, install the toolchain"
+
+#: app/scripts/services/tools.service.js:315
+msgid "Toolchain removed"
+msgstr "Toolchain removed"
+
+#: app/views/menu.html:197
+msgid "Tools"
+msgstr "Tools"
+
+#: app/scripts/services/tools.service.js:221
+msgid "Unknown board"
+msgstr "Unknown board"
+
+#: app/views/menu.html:206
+msgid "Upload"
+msgstr "Upload"
+
+#: app/views/menu.html:200
+msgid "Verify"
+msgstr "Verify"
+
+#: app/scripts/services/common.service.js:104
+msgid "Verilog code exported"
+msgstr "Verilog code exported"
+
+#: app/views/menu.html:256
+msgid "Version"
+msgstr "Version"
+
+#: app/views/menu.html:170
+msgid "View"
+msgstr "View"
+
+#: app/views/menu.html:253
+msgid "View license"
+msgstr "View license"
+
+#: app/scripts/services/graph.service.js:561
+msgid "Wrong block format: {{type}}"
+msgstr "Wrong block format: {{type}}"
+
+#: app/scripts/services/common.service.js:54
+msgid "Wrong project format: {{name}}"
+msgstr "Wrong project format: {{name}}"
+
+#: app/scripts/services/tools.service.js:253
+msgid "Wrong remote hostname {{name}}"
+msgstr "Wrong remote hostname {{name}}"
+
+#. And
+#: app/resources/blocks/labels.js:34
+msgid "and"
+msgstr "And"
+
+#. Bit
+#: app/resources/blocks/labels.js:4
+msgid "bit"
+msgstr "Bit"
+
+#. Comb
+#: app/resources/blocks/labels.js:16
+msgid "comb"
+msgstr "Comb"
+
+#. Config
+#: app/resources/blocks/labels.js:6
+msgid "config"
+msgstr "Config"
+
+#. Demux 1:2
+#: app/resources/blocks/labels.js:18
+msgid "demux_1_2"
+msgstr "Demux 1:2"
+
+#. Demux 1:4
+#: app/resources/blocks/labels.js:20
+msgid "demux_1_4"
+msgstr "Demux 1:4"
+
+#. Demux 1:8
+#: app/resources/blocks/labels.js:22
+msgid "demux_1_8"
+msgstr "Demux 1:8"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:50
+msgid "dff_ar"
+msgstr "D flip-flop async"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:52
+msgid "dff_sr"
+msgstr "D flip-flop"
+
+#. Build done
+#: app/scripts/services/tools.service.js:268
+msgid "done_build"
+msgstr "Build done"
+
+#. Upload done
+#: app/scripts/services/tools.service.js:270
+msgid "done_upload"
+msgstr "Upload done"
+
+#. Verification done
+#: app/scripts/services/tools.service.js:266
+msgid "done_verify"
+msgstr "Verification done"
+
+#. Gate
+#: app/resources/blocks/labels.js:32
+msgid "gate"
+msgstr "Gate"
+
+#. Hex 7 Segment CA
+#: app/resources/blocks/labels.js:26
+msgid "hex_7seg_ca"
+msgstr "Hex 7 Segment CA"
+
+#. Hex 7 Segment CC
+#: app/resources/blocks/labels.js:24
+msgid "hex_7seg_cc"
+msgstr "Hex 7 Segment CC"
+
+#. Logic
+#: app/resources/blocks/labels.js:14
+msgid "logic"
+msgstr "Logic"
+
+#. Mux 2:1
+#: app/resources/blocks/labels.js:28
+msgid "mux_2_1"
+msgstr "Mux 2:1"
+
+#. Mux 4:1
+#: app/resources/blocks/labels.js:30
+msgid "mux_4_1"
+msgstr "Mux 4:1"
+
+#. Nand
+#: app/resources/blocks/labels.js:36
+msgid "nand"
+msgstr "Nand"
+
+#. Nor
+#: app/resources/blocks/labels.js:38
+msgid "nor"
+msgstr "Nor"
+
+#. Not
+#: app/resources/blocks/labels.js:40
+msgid "not"
+msgstr "Not"
+
+#. Or
+#: app/resources/blocks/labels.js:42
+msgid "or"
+msgstr "Or"
+
+#. Pull up
+#: app/resources/blocks/labels.js:8
+msgid "pull_up"
+msgstr "Pull up"
+
+#. Pull up inv
+#: app/resources/blocks/labels.js:10
+msgid "pull_up_inv"
+msgstr "Pull up inv"
+
+#. Sec
+#: app/resources/blocks/labels.js:48
+msgid "sec"
+msgstr "Sec"
+
+#. Start building ...
+#: app/scripts/services/tools.service.js:45
+msgid "start_build"
+msgstr "Start building ..."
+
+#. Start uploading ...
+#: app/scripts/services/tools.service.js:47
+msgid "start_upload"
+msgstr "Start uploading ..."
+
+#. Start verification ...
+#: app/scripts/services/tools.service.js:43
+msgid "start_verify"
+msgstr "start_verify"
+
+#. T flip-flop async
+#: app/resources/blocks/labels.js:54
+msgid "tff_ar"
+msgstr "T flip-flop async"
+
+#. T flip-flop
+#: app/resources/blocks/labels.js:56
+msgid "tff_sr"
+msgstr "T flip-flop"
+
+#. Tri-state
+#: app/resources/blocks/labels.js:12
+msgid "tri_state"
+msgstr "Tri-state"
+
+#: app/scripts/controllers/menu.js:73
+msgid "untitled"
+msgstr "untitled"
+
+#. Xnor
+#: app/resources/blocks/labels.js:44
+msgid "xnor"
+msgstr "Xnor"
+
+#. Xor
+#: app/resources/blocks/labels.js:46
+msgid "xor"
+msgstr "Xor"
diff --git a/app/resources/locale/es-ES.json b/app/resources/locale/es-ES.json
deleted file mode 100644
index fc9b890c9..000000000
--- a/app/resources/locale/es-ES.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "file": "Archivo",
- "edit": "Editar",
- "view": "Ver",
- "boards": "Placas",
- "tools": "Herramientas",
- "help": "Ayuda",
- "new_project": "Nuevo projecto",
- "open_project": "Abrir proyecto",
- "examples": "Ejemplos",
- "templates": "Plantillas",
- "save": "Guardar",
- "save_as": "Guardar como",
- "import_block": "Importar bloque",
- "export_as_block": "Exportar como bloque",
- "export": "Exportar",
- "verilog": "Verilog",
- "pcf": "PCF",
- "testbench": "Testbench",
- "gtkwave": "GTKWave",
- "clone_selected": "Clonar seleccionado",
- "remove_selected": "Eliminar seleccionado",
- "clear_all": "Borrar todo",
- "image_path": "Ruta de la imagen",
- "remote_hostname": "Nombre del host remoto",
- "language": "Idioma",
- "english": "Inglés",
- "spanish": "Español",
- "galician": "Gallego",
- "basque": "Euskera",
- "reset_view": "Resetear vista",
- "verify": "Verificar",
- "build": "Sintetizar",
- "upload": "Cargar",
- "sync_remote_files": "Sincronizando ficheros remotos ...",
- "execute_remote": "Ejecutar {{label}} remoto ...",
- "toolchain": "Toolchain",
- "install": "Instalar",
- "update": "Actualizar",
- "remove": "Eliminar",
- "toolchain_not_installed": "La toolchain no está instalada. Por favor, instala la toolchain",
- "drivers": "Drivers",
- "enable": "Habilitar",
- "drivers_enabled": "Drivers habilitados",
- "disable": "Deshabilitar",
- "drivers_disabled": "Drivers deshabilitados",
- "homebrew_required": "Homebrew es necesario",
- "unplug_and_reconnect": "Desconecta y conecta la placa",
- "install_drivers_windows": "Instrucciones de instalación del driver FTDI
- Conecta la placa FPGA
- Reemplaza el driver de la (Interface 0) de la placa por libusbK
- Desconecta y conecta la placa
Aviso: no funciona con Windows 10 + USB 3.0
",
- "uninstall_drivers_windows": "Instrucciones de desinstalación del driver FTDI
- Encuentra el dispositivo USB FPGA
- Selecciona la interfaz de la placa y desinstala el driver
",
- "view_license": "Ver licencia",
- "version": "Versión",
- "documentation": "Documentación",
- "source_code": "Código fuente",
- "community_forum": "Foro de la comunidad",
- "about_icestudio": "Sobre Icestudio",
- "basic": "Básico",
- "code": "Código",
- "info": "Info",
- "input": "Entrada",
- "output": "Salida",
- "bit": "Bit",
- "config": "Config",
- "pull_up": "Pull up",
- "pull_up_inv": "Pull up inv",
- "tri_state": "Tri-state",
- "logic": "Lógica",
- "comb": "Comb",
- "demux_1_2": "Demux 1:2",
- "demux_1_4": "Demux 1:4",
- "demux_1_8": "Demux 1:8",
- "hex_7seg_cc": "Hex 7 Segment CC",
- "hex_7seg_ca": "Hex 7 Segment AC",
- "mux_2_1": "Mux 2:1",
- "mux_4_1": "Mux 4:1",
- "gate": "Puerta",
- "and": "And",
- "nand": "Nand",
- "nor": "Nor",
- "not": "Not",
- "or": "Or",
- "xnor": "Xnor",
- "xor": "Xor",
- "sec": "Sec",
- "dff_ar": "Biestable D asinc",
- "dff_sr": "Biestable D",
- "tff_ar": "Biestable T asinc",
- "tff_sr": "Biestable T",
- "1_basic": "1. Básico",
- "1_led_on": "1. Encender led",
- "2_switch_led": "2. Interruptor con led",
- "3_switch_and_gate": "3. Interruptor con puerta and",
- "read_only": "Solo lectura",
- "untitled": "Sin título",
- "enter_project_title": "Introduce el título del proyecto",
- "load_project_confirmation": "El actual projecto se borrará. ¿Deseas continuar abriendo el proyecto?",
- "enter_project_image_path": "Introduce la ruta de la imagen del proyecto",
- "enter_remote_hostname": "Introduce el nombre del host remoto usuario@host (experimental)",
- "wrong_remote_hostname": "Nombre del host remoto incorrecto {{name}}",
- "remote_host_not_connected": "Host remoto {{name}} no conectado",
- "clear_all_confirmation": "¿Deseas borrar todo?",
- "remove_block_confirmation": "¿Deseas eliminar el bloque seleccionado?",
- "change_board_confirmation": "La configuración actual de E/S de la FPGA se perderá. ¿Deseas cambiar a la placa {{name}}?",
- "board_selected": "Placa {{name}} seleccionada",
- "remove_toolchain_confirmation": "La toolchain será eliminada. ¿Deseas continuar?",
- "toolchain_removed": "Toolchain eliminada",
- "project_created": "Nuevo proyecto {{name}} creado",
- "project_loaded": "Proyecto {{name}} cargado",
- "wrong_project_format": "Formato de proyecto incorrecto: {{name}}",
- "project_saved": "Proyecto {{name}} guardado",
- "block_imported": "Bloque {{name}} importado",
- "block_exported_as": "Bloque exportado como {{name}}",
- "verilog_exported": "Código Verilog exportado",
- "pcf_exported": "Fichero PCF exportado",
- "testbench_exported": "Testbench exportado",
- "gtkwave_exported": "GTKWave exportado",
- "enter_block_label": "Introduce la etiqueta del bloque",
- "label_updated": "Etiqueta actualizada",
- "enter_block_ports": "Introduce los puertos del bloque",
- "wrong_block_format": "Formato de bloque incorrecto: {{type}}",
- "start_verify": "Comenzar verificación ...",
- "start_build": "Comenzar sintetizado ...",
- "start_upload": "Comenzar carga ...",
- "done_verify": "Verificación realizada",
- "done_build": "Sintetizado realizado",
- "done_upload": "Carga realizada",
- "generic_error": "Error: {{error}}",
- "file_does_not_exist": "El fichero {{file}} no existe",
- "board_not_detected": "Placa no detectada",
- "unknown_board": "Placa desconocida",
- "fpga_io_not_defined": "Puertos E/S de la FPGA no definidos",
- "duplicated_fpga_io": "Puertos E/S de la FPGA duplicados",
- "installing_toolchain": "Instalando la toolchain",
- "internet_connection_required": "Se requiere conexión a Internet",
- "installation_completed": "Instalación completada",
- "toolchain_installed": "Toolchain instalada"
-}
diff --git a/app/resources/locale/es_ES/es_ES.po b/app/resources/locale/es_ES/es_ES.po
new file mode 100644
index 000000000..fc038e29b
--- /dev/null
+++ b/app/resources/locale/es_ES/es_ES.po
@@ -0,0 +1,678 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: es_ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. 1. Basic
+#: app/resources/examples/labels.js:4
+msgid "1_basic"
+msgstr "1. Básico"
+
+#. 1. Led on
+#: app/resources/examples/labels.js:6
+msgid "1_led_on"
+msgstr "1. Encender led"
+
+#. 2. Switch led
+#: app/resources/examples/labels.js:8
+msgid "2_switch_led"
+msgstr "2. Interruptor con led"
+
+#. 3. Switch and gate
+#: app/resources/examples/labels.js:10
+msgid "3_switch_and_gate"
+msgstr "3. Interruptor con puerta and"
+
+#: app/scripts/services/utils.service.js:414
+#: app/scripts/services/utils.service.js:489
+msgid "Unplug and reconnect the board"
+msgstr "Desconecta y conecta la placa"
+
+#: app/scripts/services/utils.service.js:480
+msgid ""
+"FTDI driver installation instructions
- Connect the FPGA "
+"board
- Replace the (Interface 0) driver of the board by "
+"libusbK
- Unplug and reconnect the board
"
+msgstr ""
+"Instrucciones de instalación del driver FTDI
- Conecta la "
+"placa FPGA
- Reemplaza el driver de la (Interface 0) de la "
+"placa por libusbK
- Desconecta y conecta la placa
"
+
+#: app/scripts/services/utils.service.js:496
+msgid ""
+"FTDI driver uninstallation instructions
- Find the FPGA USB "
+"Device
- Select the board interface and uninstall the driver
"
+msgstr ""
+"Instrucciones de desinstalación del driver FTDI
- Encuentra el "
+"dispositivo USB FPGA
- Selecciona la interfaz de la placa y desinstala "
+"el driver
"
+
+#: app/views/menu.html:271
+msgid "About Icestudio"
+msgstr "Sobre Icestudio"
+
+#: app/views/menu.html:281
+msgid "Basic"
+msgstr "Básico"
+
+#: app/views/menu.html:152
+msgid "Basque"
+msgstr "Euskera"
+
+#: app/scripts/services/common.service.js:94
+msgid "Block exported as {{name}}"
+msgstr "Bloque exportado como {{name}}"
+
+#: app/scripts/services/common.service.js:75
+msgid "Block {{name}} imported"
+msgstr "Bloque {{name}} importado"
+
+#: app/scripts/services/tools.service.js:218
+msgid "Board {{name}} not detected"
+msgstr "Placa {{name}} no detectada"
+
+#: app/scripts/controllers/menu.js:407 app/scripts/controllers/menu.js:413
+msgid "Board {{name}} selected"
+msgstr "Placa {{name}} seleccionada"
+
+#: app/views/menu.html:185
+msgid "Boards"
+msgstr "Placas"
+
+#: app/views/menu.html:203
+msgid "Build"
+msgstr "Sintetizar"
+
+#: app/scripts/services/tools.service.js:406
+msgid "Check Internet connection..."
+msgstr "Comprobando conexión a Internet..."
+
+#: app/scripts/services/tools.service.js:414
+msgid "Check Python..."
+msgstr "Comprobando Python..."
+
+#: app/views/menu.html:112
+msgid "Clear all"
+msgstr "Borrar todo"
+
+#: app/views/menu.html:106
+msgid "Clone selected"
+msgstr "Clonar seleccionado"
+
+#: app/views/menu.html:284
+msgid "Code"
+msgstr "Código"
+
+#: app/views/menu.html:267
+msgid "Community forum"
+msgstr "Foro de la comunidad"
+
+#: app/views/menu.html:179
+msgid "Datasheet"
+msgstr "Datasheet"
+
+#: app/scripts/controllers/menu.js:394
+msgid "Datasheet not defined"
+msgstr "Datasheet no definido"
+
+#: app/scripts/services/tools.service.js:283
+msgid ""
+"Default toolchain not found. Toolchain will be downloaded. This operation "
+"requires Internet connection. Do you want to continue?"
+msgstr ""
+"No se encuentra la toolchain por defecto, por lo que será descargada. Esta "
+"operación requiere conexión a Internet. ¿Deseas continuar?"
+
+#: app/views/menu.html:241
+msgid "Disable"
+msgstr "Deshabilitar"
+
+#: app/scripts/controllers/menu.js:314
+msgid "Do you want to clear all?"
+msgstr "¿Deseas borrar todo?"
+
+#: app/scripts/controllers/menu.js:327
+msgid "Do you want to remove the selected block?"
+msgstr "¿Deseas eliminar el bloque seleccionado?"
+
+#: app/views/menu.html:260
+msgid "Documentation"
+msgstr "Documentación"
+
+#: app/views/menu.html:234
+msgid "Drivers"
+msgstr "Drivers"
+
+#: app/scripts/services/utils.service.js:411
+#: app/scripts/services/utils.service.js:474
+msgid "Drivers disabled"
+msgstr "Drivers deshabilitados"
+
+#: app/scripts/services/utils.service.js:408
+#: app/scripts/services/utils.service.js:455
+msgid "Drivers enabled"
+msgstr "Drivers habilitados"
+
+#: app/scripts/services/tools.service.js:230
+msgid "Duplicated FPGA I/O ports"
+msgstr "Puertos E/S de la FPGA duplicados"
+
+#: app/views/menu.html:99
+msgid "Edit"
+msgstr "Editar"
+
+#: app/views/menu.html:237
+msgid "Enable"
+msgstr "Habilitar"
+
+#: app/views/menu.html:134
+msgid "English"
+msgstr "Inglés"
+
+#: app/scripts/services/graph.service.js:257
+#: app/scripts/services/graph.service.js:464
+#: app/scripts/services/graph.service.js:504
+msgid "Enter the block's label"
+msgstr "Introduce la etiqueta del bloque"
+
+#: app/scripts/services/graph.service.js:409
+msgid "Enter the block's ports"
+msgstr "Introduce los puertos del bloque"
+
+#: app/scripts/controllers/menu.js:290
+msgid "Enter the project's image path"
+msgstr "Introduce la ruta de la imagen del proyecto"
+
+#: app/scripts/controllers/menu.js:72
+msgid "Enter the project's title"
+msgstr "Introduce el título del proyecto"
+
+#: app/scripts/controllers/menu.js:298
+msgid "Enter the remote hostname user@host (experimental)"
+msgstr "Introduce el nombre del host remoto usuario@host (experimental)"
+
+#: app/scripts/services/tools.service.js:306
+msgid "Error: default toolchain not found in '{{dir}}'"
+msgstr "Error: toolchain por defecto no encontrada en '{{dir}}'"
+
+#: app/scripts/services/tools.service.js:161
+msgid "Error: {{error}}"
+msgstr "Error: {{error}}"
+
+#: app/views/menu.html:32
+msgid "Examples"
+msgstr "Ejemplos"
+
+#: app/scripts/services/tools.service.js:189
+msgid "Execute remote {{label}} ..."
+msgstr "Ejecutar {{label}} remoto ..."
+
+#: app/views/menu.html:79
+msgid "Export"
+msgstr "Exportar"
+
+#: app/views/menu.html:75
+msgid "Export as block"
+msgstr "Exportar como bloque"
+
+#: app/scripts/services/tools.service.js:438
+msgid "Extract default apio files..."
+msgstr "Extraer ficheros de apio..."
+
+#: app/scripts/services/tools.service.js:448
+msgid "Extract default apio packages..."
+msgstr "Extraer paquetes de apio..."
+
+#: app/scripts/services/tools.service.js:426
+msgid "Extract virtual env files..."
+msgstr "Extraer ficheros del virtual env"
+
+#: app/scripts/services/tools.service.js:224
+#: app/scripts/services/tools.service.js:227
+msgid "FPGA I/O ports not defined"
+msgstr "Puertos E/S de la FPGA no definidos"
+
+#: app/views/menu.html:23
+msgid "File"
+msgstr "Archivo"
+
+#: app/scripts/services/tools.service.js:155
+msgid "File {{file}} does not exist"
+msgstr "El fichero {{file}} no existe"
+
+#: app/views/menu.html:158
+msgid "French"
+msgstr "Francés"
+
+#: app/scripts/services/common.service.js:134
+msgid "GTKWave exported"
+msgstr "GTKWave exportado"
+
+#: app/views/menu.html:146
+msgid "Galician"
+msgstr "Gallego"
+
+#: app/views/menu.html:250
+msgid "Help"
+msgstr "Ayuda"
+
+#: app/scripts/services/utils.service.js:445
+msgid "Homebrew is required"
+msgstr "Homebrew es necesario"
+
+#: app/views/menu.html:119
+msgid "Image path"
+msgstr "Ruta de la imagen"
+
+#: app/views/menu.html:72
+msgid "Import block"
+msgstr "Importar bloque"
+
+#: app/views/menu.html:285
+msgid "Info"
+msgstr "Info"
+
+#: app/views/menu.html:286
+msgid "Input"
+msgstr "Entrada"
+
+#: app/scripts/services/tools.service.js:443
+msgid "Install default apio..."
+msgstr "Instalar apio..."
+
+#: app/scripts/services/tools.service.js:492
+msgid "Installation completed"
+msgstr "Instalación completada"
+
+#: app/scripts/services/tools.service.js:335
+#: app/scripts/services/tools.service.js:372
+msgid "Installing toolchain"
+msgstr "Instalando la toolchain"
+
+#: app/scripts/services/tools.service.js:408
+#: app/scripts/services/utils.service.js:448
+msgid "Internet connection required"
+msgstr "Se requiere conexión a Internet"
+
+#: app/scripts/services/graph.service.js:261
+msgid "Label updated"
+msgstr "Etiqueta actualizada"
+
+#: app/views/menu.html:130
+msgid "Language"
+msgstr "Idioma"
+
+#: app/scripts/services/tools.service.js:431
+msgid "Make virtual env..."
+msgstr "Crear virtual env..."
+
+#: app/views/menu.html:26
+msgid "New project"
+msgstr "Nuevo projecto"
+
+#: app/scripts/services/common.service.js:31
+msgid "New project {{name}} created"
+msgstr "Nuevo proyecto {{name}} creado"
+
+#: app/views/menu.html:29
+msgid "Open project"
+msgstr "Abrir proyecto"
+
+#: app/views/menu.html:287
+msgid "Output"
+msgstr "Salida"
+
+#: app/scripts/services/common.service.js:114
+msgid "PCF file exported"
+msgstr "Fichero PCF exportado"
+
+#: app/views/menu.html:116
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: app/scripts/services/common.service.js:51
+msgid "Project {{name}} loaded"
+msgstr "Proyecto {{name}} cargado"
+
+#: app/scripts/services/common.service.js:63
+msgid "Project {{name}} saved"
+msgstr "Proyecto {{name}} guardado"
+
+#: app/scripts/services/tools.service.js:419
+msgid "Python 2.7 is required"
+msgstr "Se requiere Python 2.7"
+
+#: app/views/project.html:2
+msgid "Read only"
+msgstr "Solo lectura"
+
+#: app/scripts/services/tools.service.js:256
+msgid "Remote host {{name}} not connected"
+msgstr "Host remoto {{name}} no conectado"
+
+#: app/views/menu.html:124
+msgid "Remote hostname"
+msgstr "Nombre del host remoto"
+
+#: app/views/menu.html:219
+msgid "Remove"
+msgstr "Eliminar"
+
+#: app/views/menu.html:109
+msgid "Remove selected"
+msgstr "Eliminar seleccionado"
+
+#: app/views/menu.html:224
+msgid "Reset default"
+msgstr "Reset default"
+
+#: app/views/menu.html:102
+msgid "Reset view"
+msgstr "Resetear vista"
+
+#: app/views/menu.html:65
+msgid "Save"
+msgstr "Guardar"
+
+#: app/views/menu.html:68
+msgid "Save as"
+msgstr "Guardar como"
+
+#: app/views/menu.html:263
+msgid "Source code"
+msgstr "Código fuente"
+
+#: app/views/menu.html:140
+msgid "Spanish"
+msgstr "Español"
+
+#: app/scripts/services/tools.service.js:178
+msgid "Synchronize remote files ..."
+msgstr "Sincronizando ficheros remotos ..."
+
+#: app/views/menu.html:49
+msgid "Templates"
+msgstr "Plantillas"
+
+#: app/views/menu.html:88
+msgid "Testbench"
+msgstr "Testbench"
+
+#: app/scripts/services/common.service.js:124
+msgid "Testbench exported"
+msgstr "Testbench exportado"
+
+#: app/scripts/controllers/menu.js:403
+msgid ""
+"The current FPGA I/O configuration will be lost. Do you want to change to "
+"{{name}} board?"
+msgstr ""
+"La configuración actual de E/S de la FPGA se perderá. ¿Deseas cambiar a la "
+"placa {{name}}?"
+
+#: app/scripts/controllers/menu.js:117 app/scripts/controllers/menu.js:94
+msgid ""
+"The current project will be removed. Do you want to continue loading the "
+"project?"
+msgstr "El actual projecto se borrará. ¿Deseas continuar abriendo el proyecto?"
+
+#: app/scripts/services/tools.service.js:311
+msgid "The toolchain will be removed. Do you want to continue?"
+msgstr "La toolchain será eliminada. ¿Deseas continuar?"
+
+#: app/scripts/services/tools.service.js:299
+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.service.js:291
+msgid ""
+"The toolchain will be updated. This operation requires Internet connection. "
+"Do you want to continue?"
+msgstr ""
+"La toolchain será actualizada. Esta operación requiere conexión a Internet. "
+"¿Deseas continuar?"
+
+#: app/views/menu.html:210
+msgid "Toolchain"
+msgstr "Toolchain"
+
+#: app/scripts/services/tools.service.js:493
+msgid "Toolchain installed"
+msgstr "Toolchain instalada"
+
+#: app/scripts/services/tools.service.js:497
+msgid "Toolchain not installed"
+msgstr "La toolchain no está instalada"
+
+#: app/scripts/services/tools.service.js:79
+#: app/scripts/services/utils.service.js:486
+#: app/scripts/services/utils.service.js:502
+msgid "Toolchain not installed. Please, install the toolchain"
+msgstr "La toolchain no está instalada. Por favor, instala la toolchain"
+
+#: app/scripts/services/tools.service.js:315
+msgid "Toolchain removed"
+msgstr "Toolchain eliminada"
+
+#: app/views/menu.html:197
+msgid "Tools"
+msgstr "Herramientas"
+
+#: app/scripts/services/tools.service.js:221
+msgid "Unknown board"
+msgstr "Placa desconocida"
+
+#: app/views/menu.html:206
+msgid "Upload"
+msgstr "Cargar"
+
+#: app/views/menu.html:200
+msgid "Verify"
+msgstr "Verificar"
+
+#: app/scripts/services/common.service.js:104
+msgid "Verilog code exported"
+msgstr "Código Verilog exportado"
+
+#: app/views/menu.html:256
+msgid "Version"
+msgstr "Versión"
+
+#: app/views/menu.html:170
+msgid "View"
+msgstr "Ver"
+
+#: app/views/menu.html:253
+msgid "View license"
+msgstr "Ver licencia"
+
+#: app/scripts/services/graph.service.js:561
+msgid "Wrong block format: {{type}}"
+msgstr "Formato de bloque incorrecto: {{type}}"
+
+#: app/scripts/services/common.service.js:54
+msgid "Wrong project format: {{name}}"
+msgstr "Formato de proyecto incorrecto: {{name}}"
+
+#: app/scripts/services/tools.service.js:253
+msgid "Wrong remote hostname {{name}}"
+msgstr "Nombre del host remoto incorrecto {{name}}"
+
+#. And
+#: app/resources/blocks/labels.js:34
+msgid "and"
+msgstr "And"
+
+#. Bit
+#: app/resources/blocks/labels.js:4
+msgid "bit"
+msgstr "Bit"
+
+#. Comb
+#: app/resources/blocks/labels.js:16
+msgid "comb"
+msgstr "Comb"
+
+#. Config
+#: app/resources/blocks/labels.js:6
+msgid "config"
+msgstr "Config"
+
+#. Demux 1:2
+#: app/resources/blocks/labels.js:18
+msgid "demux_1_2"
+msgstr "Demux 1:2"
+
+#. Demux 1:4
+#: app/resources/blocks/labels.js:20
+msgid "demux_1_4"
+msgstr "Demux 1:4"
+
+#. Demux 1:8
+#: app/resources/blocks/labels.js:22
+msgid "demux_1_8"
+msgstr "Demux 1:8"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:50
+msgid "dff_ar"
+msgstr "Biestable D asinc"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:52
+msgid "dff_sr"
+msgstr "Biestable D"
+
+#. Build done
+#: app/scripts/services/tools.service.js:268
+msgid "done_build"
+msgstr "Sintetizado realizado"
+
+#. Upload done
+#: app/scripts/services/tools.service.js:270
+msgid "done_upload"
+msgstr "Carga realizada"
+
+#. Verification done
+#: app/scripts/services/tools.service.js:266
+msgid "done_verify"
+msgstr "Verificación realizada"
+
+#. Gate
+#: app/resources/blocks/labels.js:32
+msgid "gate"
+msgstr "Puerta"
+
+#. Hex 7 Segment CA
+#: app/resources/blocks/labels.js:26
+msgid "hex_7seg_ca"
+msgstr "Hex 7 Segment AC"
+
+#. Hex 7 Segment CC
+#: app/resources/blocks/labels.js:24
+msgid "hex_7seg_cc"
+msgstr "Hex 7 Segment CC"
+
+#. Logic
+#: app/resources/blocks/labels.js:14
+msgid "logic"
+msgstr "Lógica"
+
+#. Mux 2:1
+#: app/resources/blocks/labels.js:28
+msgid "mux_2_1"
+msgstr "Mux 2:1"
+
+#. Mux 4:1
+#: app/resources/blocks/labels.js:30
+msgid "mux_4_1"
+msgstr "Mux 4:1"
+
+#. Nand
+#: app/resources/blocks/labels.js:36
+msgid "nand"
+msgstr "Nand"
+
+#. Nor
+#: app/resources/blocks/labels.js:38
+msgid "nor"
+msgstr "Nor"
+
+#. Not
+#: app/resources/blocks/labels.js:40
+msgid "not"
+msgstr "Not"
+
+#. Or
+#: app/resources/blocks/labels.js:42
+msgid "or"
+msgstr "Or"
+
+#. Pull up
+#: app/resources/blocks/labels.js:8
+msgid "pull_up"
+msgstr "Pull up"
+
+#. Pull up inv
+#: app/resources/blocks/labels.js:10
+msgid "pull_up_inv"
+msgstr "Pull up inv"
+
+#. Sec
+#: app/resources/blocks/labels.js:48
+msgid "sec"
+msgstr "Sec"
+
+#. Start building ...
+#: app/scripts/services/tools.service.js:45
+msgid "start_build"
+msgstr "Comenzar sintetizado ..."
+
+#. Start uploading ...
+#: app/scripts/services/tools.service.js:47
+msgid "start_upload"
+msgstr "Comenzar carga ..."
+
+#. Start verification ...
+#: app/scripts/services/tools.service.js:43
+msgid "start_verify"
+msgstr "Comenzar verificación ..."
+
+#. T flip-flop async
+#: app/resources/blocks/labels.js:54
+msgid "tff_ar"
+msgstr "Biestable T asinc"
+
+#. T flip-flop
+#: app/resources/blocks/labels.js:56
+msgid "tff_sr"
+msgstr "Biestable T"
+
+#. Tri-state
+#: app/resources/blocks/labels.js:12
+msgid "tri_state"
+msgstr "Tri-estado"
+
+#: app/scripts/controllers/menu.js:73
+msgid "untitled"
+msgstr "Sin título"
+
+#. Xnor
+#: app/resources/blocks/labels.js:44
+msgid "xnor"
+msgstr "Xnor"
+
+#. Xor
+#: app/resources/blocks/labels.js:46
+msgid "xor"
+msgstr "Xor"
diff --git a/app/resources/locale/eu.json b/app/resources/locale/eu.json
deleted file mode 100644
index 781e0309c..000000000
--- a/app/resources/locale/eu.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
-"file": "Fitxategia",
-"edit": "Editatu",
-"view": "Ikusi",
-"boards": "Plakak",
-"tools": "Erremintak",
-"help": "Laguntza",
-"new_project": " Proiektu berria ",
-"open_project": "Ireki proiektua",
-"examples": "Adibideak",
-"templates": "Ereduak",
-"save": "Gorde",
-"save_as": "Gorde honela",
-"import_block": "Blokea inportatu",
-"export_as_block": "Blokea bezala esportatu",
-"export": "Esportatu",
-"verilog": "Verilog",
-"pcf": "PCF",
-"testbench": "Testbench",
-"gtkwave": "GTKWave",
-"clone_selected": "Aukeratua klonatu",
-"remove_selected": "Aukeratua ezabatu",
-"clear_all": "Dena ezabatu",
-"image_path": "Ruta de la imagen",
-"remote_hostname": "Remote hostname",
-"language": "Hizkuntza",
-"english": "Ingelesa",
-"spanish": "Gaztelera",
-"basque" : "Euskera",
-"galician": "Galiziako",
-"reset_view": "Bista reseteatu",
-"verify": "Egiaztatu",
-"build": "Sintetizatu",
-"upload": "Kargatu",
-"sync_remote_files": "Synchronize remote files ...",
-"execute_remote": "Execute remote {{label}} ...",
-"toolchain": "Toolchain",
-"install": "Instalatu",
-"update": "Freskatu",
-"remove": "Ezabatu",
-"toolchain_not_installed": "Toolchain not installed. Please, install the toolchain",
-"drivers": "Drivers",
-"enable": "Enable",
-"drivers_enabled": "Drivers enabled",
-"disable": "Disable",
-"drivers_disabled": "Drivers disabled",
-"homebrew_required": "Homebrew is required",
-"unplug_and_reconnect": "Unplug and reconnect the board",
-"install_drivers_windows": "FTDI driver installation instructions
- Connect the FPGA board
- Replace the (Interface 0) driver of the board by libusbK
- Unplug and reconnect the board
Note: not fully working with Windows 10 + USB 3.0
",
-"uninstall_drivers_windows": "FTDI driver uninstallation instructions
- Find the FPGA USB Device
- Select the board interface and uninstall the driver
",
-"view_license": "Lizentzia ikusi",
-"version": "Bertsioa",
-"documentation": "Documentazioa",
-"source_code": "Jatorrizko kodea",
-"community_forum": "Komunitatearen foroa",
-"about_icestudio": "Icestudio informazioa",
-"basic": "Basikoa",
-"code": "Kodea",
-"info": "Info",
-"input": "Sarrera",
-"output": "Irteera",
-"bit": "Bit",
-"config": "Config",
-"pull_up": "Pull up",
-"pull_up_inv": "Pull up inv",
-"tri_state": "Tri-state",
-"logic": "Logika",
-"comb": "Comb",
-"demux_1_2": "Demux 1:2",
-"demux_1_4": "Demux 1:4",
-"demux_1_8": "Demux 1:8",
-"hex_7seg_cc": "Hex 7 Segment CC",
-"hex_7seg_ca": "Hex 7 Segment CA",
-"mux_2_1": "Mux 2:1",
-"mux_4_1": "Mux 4:1",
-"gate": "Gate",
-"and": "And",
-"nand": "Nand",
-"nor": "Nor",
-"not": "Not",
-"or": "Or",
-"xnor": "Xnor",
-"xor": "Xor",
-"sec": "Sec",
-"dff_ar": "Bistable D asink",
-"dff_sr": "Bistable D",
-"tff_ar": "Bistable T asink",
-"tff_sr": "Bistable T",
-"1_basic": "1. Basikoa",
-"1_led_on": "1. Led-a piztu",
-"2_switch_led": "2. Etengailua led batekin",
-"3_switch_and_gate": "3. Etengailua and atearekin",
-"read_only": "Irakurtzeko soilik",
-"untitled": "Izenik gabe",
-"enter_project_title": "Proiektuari izena jarri",
-"load_project_confirmation": "Proiektu hau ezabatuko da. Proiektua irekitzen jarraitu nahi duzu?",
-"enter_project_image_path": "Proiektuaren irudi bidea sartu",
-"enter_remote_hostname": "Enter the remote hostname user@host (experimental)",
-"wrong_remote_hostname": "Wrong remote hostname {{name}}",
-"remote_host_not_connected": "Remote host {{name}} not connected",
-"clear_all_confirmation": "¿Dena ezabatu nahi duzu?",
-"remove_block_confirmation": "¿Aukeratutako blokea ezabatu nahi duzu?",
-"change_board_confirmation": "FPGAaren E/S configurazioa galduko da. {{name}} plaka aldatu nahi duzu?",
-"board_selected": "{{name}} plaka aukeratu",
-"remove_toolchain_confirmation": "The toolchain will be removed. Do you want to continue?",
-"toolchain_removed": "Toolchain ezabatuta",
-"project_created": "{{name}} proiektu sortuta ",
-"project_loaded": "{{name}} proiektua irekita",
-"wrong_project_format": "Proiektu formatua okerra: {{name}}",
-"project_saved": "{{name}} proiektua gordeta",
-"block_imported": "{{name}} blokea importatua",
-"block_exported_as": "Blokea {{name}} bezala esportatua",
-"verilog_exported": "Verilog kodea esportatua",
-"pcf_exported": "PCF fitxategia esportatua",
-"testbench_exported": "Testbench esportatua",
-"gtkwave_exported": "GTKWave esportatua",
-"enter_block_label": "Blokearen etiketa sartu",
-"label_updated": "Etiketa freskatua",
-"enter_block_ports": "Blokearen portuak sartu",
-"wrong_block_format": "Blokearen formatua okerra: {{type}}",
-"start_verify": "Egiaztapena hasi ...",
-"start_build": "Sintetizatua hasi ...",
-"start_upload": "Karga hasi ...",
-"done_verify": "Egiaztapena egina",
-"done_build": "Sintetizatua egina",
-"done_upload": "Karga egina",
-"generic_error": "Errorea: {{error}}",
-"file_does_not_exist": "{{file}} fitxeroa ez da existitzen",
-"board_not_detected": "Plaka ez da aurkitzen",
-"unknown_board": "Plaka ezezaguna",
-"fpga_io_not_defined": "FPGAren E/S portuak definitu gabe",
-"duplicated_fpga_io": " FPGAren E/S portuak bikoiztuak",
-"installing_toolchain": "Toolchain instalatzen",
-"internet_connection_required": "Internet konexioa behar da",
-"installation_completed": "Instalazioa amaitua",
-"toolchain_installed": "Toolchain instalatua"
-}
diff --git a/app/resources/locale/eu_ES/eu_ES.po b/app/resources/locale/eu_ES/eu_ES.po
new file mode 100644
index 000000000..d598e6817
--- /dev/null
+++ b/app/resources/locale/eu_ES/eu_ES.po
@@ -0,0 +1,666 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: eu_ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. 1. Basic
+#: app/resources/examples/labels.js:4
+msgid "1_basic"
+msgstr "1. Basikoa"
+
+#. 1. Led on
+#: app/resources/examples/labels.js:6
+msgid "1_led_on"
+msgstr "1. Led-a piztu"
+
+#. 2. Switch led
+#: app/resources/examples/labels.js:8
+msgid "2_switch_led"
+msgstr "2. Etengailua led batekin"
+
+#. 3. Switch and gate
+#: app/resources/examples/labels.js:10
+msgid "3_switch_and_gate"
+msgstr "3. Etengailua and atearekin"
+
+#: app/scripts/services/utils.service.js:414
+#: app/scripts/services/utils.service.js:489
+msgid "Unplug and reconnect the board"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:480
+msgid ""
+"FTDI driver installation instructions
- Connect the FPGA "
+"board
- Replace the (Interface 0) driver of the board by "
+"libusbK
- Unplug and reconnect the board
"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:496
+msgid ""
+"FTDI driver uninstallation instructions
- Find the FPGA USB "
+"Device
- Select the board interface and uninstall the driver
"
+msgstr ""
+
+#: app/views/menu.html:271
+msgid "About Icestudio"
+msgstr "Icestudio informazioa"
+
+#: app/views/menu.html:281
+msgid "Basic"
+msgstr "Basikoa"
+
+#: app/views/menu.html:152
+msgid "Basque"
+msgstr "Euskera"
+
+#: app/scripts/services/common.service.js:94
+msgid "Block exported as {{name}}"
+msgstr "Blokea {{name}} bezala esportatua"
+
+#: app/scripts/services/common.service.js:75
+msgid "Block {{name}} imported"
+msgstr "{{name}} blokea importatua"
+
+#: app/scripts/services/tools.service.js:218
+msgid "Board {{name}} not detected"
+msgstr "{{name}} plaka ez da aurkitzen"
+
+#: app/scripts/controllers/menu.js:407 app/scripts/controllers/menu.js:413
+msgid "Board {{name}} selected"
+msgstr "{{name}} paka aukeratul"
+
+#: app/views/menu.html:185
+msgid "Boards"
+msgstr "Plakak"
+
+#: app/views/menu.html:203
+msgid "Build"
+msgstr "Sintetizatu"
+
+#: app/scripts/services/tools.service.js:406
+msgid "Check Internet connection..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:414
+msgid "Check Python..."
+msgstr ""
+
+#: app/views/menu.html:112
+msgid "Clear all"
+msgstr "Dena ezabatu"
+
+#: app/views/menu.html:106
+msgid "Clone selected"
+msgstr "Aukeratua klonatu"
+
+#: app/views/menu.html:284
+msgid "Code"
+msgstr "Kodea"
+
+#: app/views/menu.html:267
+msgid "Community forum"
+msgstr "Komunitatearen foroa"
+
+#: app/views/menu.html:179
+msgid "Datasheet"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:394
+msgid "Datasheet not defined"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:283
+msgid ""
+"Default toolchain not found. Toolchain will be downloaded. This operation "
+"requires Internet connection. Do you want to continue?"
+msgstr ""
+
+#: app/views/menu.html:241
+msgid "Disable"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:314
+msgid "Do you want to clear all?"
+msgstr "¿Dena ezabatu nahi duzu?"
+
+#: app/scripts/controllers/menu.js:327
+msgid "Do you want to remove the selected block?"
+msgstr "¿Aukeratutako blokea ezabatu nahi duzu?"
+
+#: app/views/menu.html:260
+msgid "Documentation"
+msgstr "Documentazioa"
+
+#: app/views/menu.html:234
+msgid "Drivers"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:411
+#: app/scripts/services/utils.service.js:474
+msgid "Drivers disabled"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:408
+#: app/scripts/services/utils.service.js:455
+msgid "Drivers enabled"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:230
+msgid "Duplicated FPGA I/O ports"
+msgstr "FPGAren E/S portuak bikoiztuak"
+
+#: app/views/menu.html:99
+msgid "Edit"
+msgstr "Editatu"
+
+#: app/views/menu.html:237
+msgid "Enable"
+msgstr "Enable"
+
+#: app/views/menu.html:134
+msgid "English"
+msgstr "Ingelesa"
+
+#: app/scripts/services/graph.service.js:257
+#: app/scripts/services/graph.service.js:464
+#: app/scripts/services/graph.service.js:504
+msgid "Enter the block's label"
+msgstr "Blokearen etiketa sartu"
+
+#: app/scripts/services/graph.service.js:409
+msgid "Enter the block's ports"
+msgstr "Blokearen portuak sartu"
+
+#: app/scripts/controllers/menu.js:290
+msgid "Enter the project's image path"
+msgstr "Proiektuaren irudi bidea sartu"
+
+#: app/scripts/controllers/menu.js:72
+msgid "Enter the project's title"
+msgstr "Proiektuari izena jarri"
+
+#: app/scripts/controllers/menu.js:298
+msgid "Enter the remote hostname user@host (experimental)"
+msgstr "Enter the remote hostname user@host (experimental)"
+
+#: app/scripts/services/tools.service.js:306
+msgid "Error: default toolchain not found in '{{dir}}'"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:161
+msgid "Error: {{error}}"
+msgstr "Errorea: {{error}}"
+
+#: app/views/menu.html:32
+msgid "Examples"
+msgstr "Adibideak"
+
+#: app/scripts/services/tools.service.js:189
+msgid "Execute remote {{label}} ..."
+msgstr "Execute remote {{label}} ..."
+
+#: app/views/menu.html:79
+msgid "Export"
+msgstr "Esportatu"
+
+#: app/views/menu.html:75
+msgid "Export as block"
+msgstr "Blokea bezala esportatu"
+
+#: app/scripts/services/tools.service.js:438
+msgid "Extract default apio files..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:448
+msgid "Extract default apio packages..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:426
+msgid "Extract virtual env files..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:224
+#: app/scripts/services/tools.service.js:227
+msgid "FPGA I/O ports not defined"
+msgstr "FPGAren E/S portuak definitu gabe"
+
+#: app/views/menu.html:23
+msgid "File"
+msgstr "Fitxategia"
+
+#: app/scripts/services/tools.service.js:155
+msgid "File {{file}} does not exist"
+msgstr "{{file}} fitxeroa ez da existitzen"
+
+#: app/views/menu.html:158
+msgid "French"
+msgstr ""
+
+#: app/scripts/services/common.service.js:134
+msgid "GTKWave exported"
+msgstr "GTKWave esportatua"
+
+#: app/views/menu.html:146
+msgid "Galician"
+msgstr "Galiziako"
+
+#: app/views/menu.html:250
+msgid "Help"
+msgstr "Laguntza"
+
+#: app/scripts/services/utils.service.js:445
+msgid "Homebrew is required"
+msgstr "Homebrew is required"
+
+#: app/views/menu.html:119
+msgid "Image path"
+msgstr "Ruta de la imagen"
+
+#: app/views/menu.html:72
+msgid "Import block"
+msgstr "Blokea inportatu"
+
+#: app/views/menu.html:285
+msgid "Info"
+msgstr "Info"
+
+#: app/views/menu.html:286
+msgid "Input"
+msgstr "Sarrera"
+
+#: app/scripts/services/tools.service.js:443
+msgid "Install default apio..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:492
+msgid "Installation completed"
+msgstr "Instalazioa amaitua"
+
+#: app/scripts/services/tools.service.js:335
+#: app/scripts/services/tools.service.js:372
+msgid "Installing toolchain"
+msgstr "Toolchain instalatzen"
+
+#: app/scripts/services/tools.service.js:408
+#: app/scripts/services/utils.service.js:448
+msgid "Internet connection required"
+msgstr "Internet konexioa behar da"
+
+#: app/scripts/services/graph.service.js:261
+msgid "Label updated"
+msgstr "Etiketa freskatua"
+
+#: app/views/menu.html:130
+msgid "Language"
+msgstr "Hizkuntza"
+
+#: app/scripts/services/tools.service.js:431
+msgid "Make virtual env..."
+msgstr ""
+
+#: app/views/menu.html:26
+msgid "New project"
+msgstr "Proiektu berria"
+
+#: app/scripts/services/common.service.js:31
+msgid "New project {{name}} created"
+msgstr "{{name}} proiektu sortuta"
+
+#: app/views/menu.html:29
+msgid "Open project"
+msgstr "Ireki proiektua"
+
+#: app/views/menu.html:287
+msgid "Output"
+msgstr "Irteera"
+
+#: app/scripts/services/common.service.js:114
+msgid "PCF file exported"
+msgstr "PCF fitxategia esportatua"
+
+#: app/views/menu.html:116
+msgid "Preferences"
+msgstr ""
+
+#: app/scripts/services/common.service.js:51
+msgid "Project {{name}} loaded"
+msgstr "{{name}} proiektua irekita"
+
+#: app/scripts/services/common.service.js:63
+msgid "Project {{name}} saved"
+msgstr "{{name}} proiektua gordeta"
+
+#: app/scripts/services/tools.service.js:419
+msgid "Python 2.7 is required"
+msgstr ""
+
+#: app/views/project.html:2
+msgid "Read only"
+msgstr "Irakurtzeko soilik"
+
+#: app/scripts/services/tools.service.js:256
+msgid "Remote host {{name}} not connected"
+msgstr "Remote host {{name}} not connected"
+
+#: app/views/menu.html:124
+msgid "Remote hostname"
+msgstr ""
+
+#: app/views/menu.html:219
+msgid "Remove"
+msgstr "Ezabatu"
+
+#: app/views/menu.html:109
+msgid "Remove selected"
+msgstr "Aukeratua ezabatu"
+
+#: app/views/menu.html:224
+msgid "Reset default"
+msgstr ""
+
+#: app/views/menu.html:102
+msgid "Reset view"
+msgstr "Bista reseteatu"
+
+#: app/views/menu.html:65
+msgid "Save"
+msgstr "Gorde"
+
+#: app/views/menu.html:68
+msgid "Save as"
+msgstr "Gorde honela"
+
+#: app/views/menu.html:263
+msgid "Source code"
+msgstr "Jatorrizko kodea"
+
+#: app/views/menu.html:140
+msgid "Spanish"
+msgstr "Gaztelera"
+
+#: app/scripts/services/tools.service.js:178
+msgid "Synchronize remote files ..."
+msgstr "Synchronize remote files ..."
+
+#: app/views/menu.html:49
+msgid "Templates"
+msgstr "Ereduak"
+
+#: app/views/menu.html:88
+msgid "Testbench"
+msgstr "Testbench esportatua"
+
+#: app/scripts/services/common.service.js:124
+msgid "Testbench exported"
+msgstr "Testbench esportatua"
+
+#: app/scripts/controllers/menu.js:403
+msgid ""
+"The current FPGA I/O configuration will be lost. Do you want to change to "
+"{{name}} board?"
+msgstr ""
+"FPGAaren E/S configurazioa galduko da. {{name}} plaka aldatu nahi duzu?"
+
+#: app/scripts/controllers/menu.js:117 app/scripts/controllers/menu.js:94
+msgid ""
+"The current project will be removed. Do you want to continue loading the "
+"project?"
+msgstr "Proiektu hau ezabatuko da. Proiektua irekitzen jarraitu nahi duzu?"
+
+#: app/scripts/services/tools.service.js:311
+msgid "The toolchain will be removed. Do you want to continue?"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:299
+msgid "The toolchain will be restored to default. Do you want to continue?"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:291
+msgid ""
+"The toolchain will be updated. This operation requires Internet connection. "
+"Do you want to continue?"
+msgstr ""
+
+#: app/views/menu.html:210
+msgid "Toolchain"
+msgstr "Toolchain"
+
+#: app/scripts/services/tools.service.js:493
+msgid "Toolchain installed"
+msgstr "Toolchain instalatua"
+
+#: app/scripts/services/tools.service.js:497
+msgid "Toolchain not installed"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:79
+#: app/scripts/services/utils.service.js:486
+#: app/scripts/services/utils.service.js:502
+msgid "Toolchain not installed. Please, install the toolchain"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:315
+msgid "Toolchain removed"
+msgstr "Toolchain ezabatuta"
+
+#: app/views/menu.html:197
+msgid "Tools"
+msgstr "Erremintak"
+
+#: app/scripts/services/tools.service.js:221
+msgid "Unknown board"
+msgstr "Plaka ezezaguna"
+
+#: app/views/menu.html:206
+msgid "Upload"
+msgstr "Kargatu"
+
+#: app/views/menu.html:200
+msgid "Verify"
+msgstr "Egiaztatu"
+
+#: app/scripts/services/common.service.js:104
+msgid "Verilog code exported"
+msgstr "Verilog kodea esportatua"
+
+#: app/views/menu.html:256
+msgid "Version"
+msgstr "Bertsioa"
+
+#: app/views/menu.html:170
+msgid "View"
+msgstr "Ikusi"
+
+#: app/views/menu.html:253
+msgid "View license"
+msgstr "Lizentzia ikusi"
+
+#: app/scripts/services/graph.service.js:561
+msgid "Wrong block format: {{type}}"
+msgstr "Blokearen formatua okerra: {{type}}"
+
+#: app/scripts/services/common.service.js:54
+msgid "Wrong project format: {{name}}"
+msgstr "Proiektu formatua okerra: {{name}}"
+
+#: app/scripts/services/tools.service.js:253
+msgid "Wrong remote hostname {{name}}"
+msgstr ""
+
+#. And
+#: app/resources/blocks/labels.js:34
+msgid "and"
+msgstr "And"
+
+#. Bit
+#: app/resources/blocks/labels.js:4
+msgid "bit"
+msgstr "Bit"
+
+#. Comb
+#: app/resources/blocks/labels.js:16
+msgid "comb"
+msgstr "Comb"
+
+#. Config
+#: app/resources/blocks/labels.js:6
+msgid "config"
+msgstr "Config"
+
+#. Demux 1:2
+#: app/resources/blocks/labels.js:18
+msgid "demux_1_2"
+msgstr "Demux 1:2"
+
+#. Demux 1:4
+#: app/resources/blocks/labels.js:20
+msgid "demux_1_4"
+msgstr "Demux 1:4"
+
+#. Demux 1:8
+#: app/resources/blocks/labels.js:22
+msgid "demux_1_8"
+msgstr "Demux 1:8"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:50
+msgid "dff_ar"
+msgstr "Bistable D asink"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:52
+msgid "dff_sr"
+msgstr "Bistable D"
+
+#. Build done
+#: app/scripts/services/tools.service.js:268
+msgid "done_build"
+msgstr "Sintetizatua egina"
+
+#. Upload done
+#: app/scripts/services/tools.service.js:270
+msgid "done_upload"
+msgstr "Karga egina"
+
+#. Verification done
+#: app/scripts/services/tools.service.js:266
+msgid "done_verify"
+msgstr "Egiaztapena egina"
+
+#. Gate
+#: app/resources/blocks/labels.js:32
+msgid "gate"
+msgstr "Gate"
+
+#. Hex 7 Segment CA
+#: app/resources/blocks/labels.js:26
+msgid "hex_7seg_ca"
+msgstr "Hex 7 Segment CA"
+
+#. Hex 7 Segment CC
+#: app/resources/blocks/labels.js:24
+msgid "hex_7seg_cc"
+msgstr "Hex 7 Segment CC"
+
+#. Logic
+#: app/resources/blocks/labels.js:14
+msgid "logic"
+msgstr "Logika"
+
+#. Mux 2:1
+#: app/resources/blocks/labels.js:28
+msgid "mux_2_1"
+msgstr "Mux 2:1"
+
+#. Mux 4:1
+#: app/resources/blocks/labels.js:30
+msgid "mux_4_1"
+msgstr "Mux 4:1"
+
+#. Nand
+#: app/resources/blocks/labels.js:36
+msgid "nand"
+msgstr "Nand"
+
+#. Nor
+#: app/resources/blocks/labels.js:38
+msgid "nor"
+msgstr "Nor"
+
+#. Not
+#: app/resources/blocks/labels.js:40
+msgid "not"
+msgstr "Not"
+
+#. Or
+#: app/resources/blocks/labels.js:42
+msgid "or"
+msgstr "Or"
+
+#. Pull up
+#: app/resources/blocks/labels.js:8
+msgid "pull_up"
+msgstr "Pull up"
+
+#. Pull up inv
+#: app/resources/blocks/labels.js:10
+msgid "pull_up_inv"
+msgstr "Pull up inv"
+
+#. Sec
+#: app/resources/blocks/labels.js:48
+msgid "sec"
+msgstr "Sec"
+
+#. Start building ...
+#: app/scripts/services/tools.service.js:45
+msgid "start_build"
+msgstr "Sintetizatua hasi ..."
+
+#. Start uploading ...
+#: app/scripts/services/tools.service.js:47
+msgid "start_upload"
+msgstr "Karga hasi ..."
+
+#. Start verification ...
+#: app/scripts/services/tools.service.js:43
+msgid "start_verify"
+msgstr "Egiaztapena hasi ..."
+
+#. T flip-flop async
+#: app/resources/blocks/labels.js:54
+msgid "tff_ar"
+msgstr "Bistable T asink"
+
+#. T flip-flop
+#: app/resources/blocks/labels.js:56
+msgid "tff_sr"
+msgstr "Bistable T"
+
+#. Tri-state
+#: app/resources/blocks/labels.js:12
+msgid "tri_state"
+msgstr "Tri-state"
+
+#: app/scripts/controllers/menu.js:73
+msgid "untitled"
+msgstr "Izenik gabe"
+
+#. Xnor
+#: app/resources/blocks/labels.js:44
+msgid "xnor"
+msgstr "Xnor"
+
+#. Xor
+#: app/resources/blocks/labels.js:46
+msgid "xor"
+msgstr "Xor"
diff --git a/app/resources/locale/fr-FR.json b/app/resources/locale/fr-FR.json
deleted file mode 100644
index f1fce8e71..000000000
--- a/app/resources/locale/fr-FR.json
+++ /dev/null
@@ -1,134 +0,0 @@
-{
- "file": "Fichier",
- "edit": "Édition",
- "view": "Vue",
- "boards": "Cartes",
- "tools": "Outils",
- "help": "Aide",
- "new_project": "Nouveau projet",
- "open_project": "Ouvrir un projet",
- "examples": "Exemples",
- "templates": "Modèles",
- "save": "Sauvegarder",
- "save_as": "Sauvegarder sous ...",
- "import_block": "Importer un bloc",
- "export_as_block": "Exporter un bloc",
- "export_verilog": "Exporter en Verilog",
- "export_pcf": "Exporter en PCF",
- "export_testbench": "Exporter le banc de tests",
- "export_gtkwave": "Exporter en GTKWave",
- "clone_selected": "Cloner la selection",
- "remove_selected": "Supprimer la selection",
- "clear_all": "Tout nettoyer ",
- "image_path": "Chemin image",
- "remote_hostname": "hostname distant",
- "language": "Langage",
- "english": "Anglais",
- "spanish": "Espagnole",
- "galician": "Galois",
- "basque": "Basque",
- "reset_view": "Reinitialiser la vue",
- "verify": "Verifier",
- "build": "Construire",
- "upload": "Télécharger",
- "sync_remote_files": "Synchroniser les fichiers distants ...",
- "execute_remote": "Executer à distance {{label}} ...",
- "install_toolchain": "Installer la toolchain",
- "upgrade_toolchain": "Mettre la toolchain à jour",
- "remove_toolchain": "Supprimer la toolchain",
- "toolchain_not_installed": "La toolchain n'est pas à jour. Installer, ou mettre à jour svp",
- "enable_drivers": "Activer le pilote",
- "drivers_enabled": "Pilote activé",
- "disable_drivers": "Désactiver le pilote",
- "drivers_disabled": "Pilote désactivé",
- "homebrew_required": "Homebrew est requis",
- "unplug_and_reconnect": "Débrancher et reconnecter la carte",
- "install_drivers_windows": "Instructions d'installation du pilote FTDI
- Connecter la carte FPGA
- Remplacer le pilote (Interface 0) de la carte par libusbK
- Débrancher puis rebrancher la carte
Note: ne fonctionne pas complètement bien avec Windows 10 + USB 3.0
",
- "uninstall_drivers_windows": "Instructions de désinstallation du pilote FTDI
- Trouver le périphérique USB FPGA
- Sélectionner la carte interface et désinstaller le pilote
",
- "view_license": "Voir la licence",
- "version": "Version",
- "documentation": "Documentation",
- "source_code": "Code source",
- "community_forum": "Forum communautaire",
- "about_icestudio": "À propos d'Icestudio",
- "basic": "Basique",
- "code": "Code",
- "info": "Info",
- "input": "Entrée",
- "output": "Sortie",
- "bit": "Bit",
- "config": "Configuration",
- "pull_up": "Pull up",
- "pull_up_inv": "Pull up inv",
- "tri_state": "Tri-state",
- "logic": "Logique",
- "comb": "Combinatoire",
- "demux_1_2": "Démultiplexeur 1:2",
- "demux_1_4": "Démultiplexeur 1:4",
- "demux_1_8": "Démultiplexeur 1:8",
- "hex_7seg_cc": "Hex 7 Segment CC",
- "hex_7seg_ca": "Hex 7 Segment CA",
- "mux_2_1": "Multiplexeur 2:1",
- "mux_4_1": "Multiplexeur 4:1",
- "gate": "Porte",
- "and": "Et",
- "nand": "Non Et",
- "nor": "Non Ou",
- "not": "Non",
- "or": "Ou",
- "xnor": "Xnor",
- "xor": "Xor",
- "sec": "Sec",
- "dff_ar": "D flip-flop async",
- "dff_sr": "D flip-flop",
- "tff_ar": "T flip-flop async",
- "tff_sr": "T flip-flop",
- "1_basic": "1. Basique",
- "1_led_on": "1. Led on",
- "2_switch_led": "2. Switch led",
- "3_switch_and_gate": "3. Switch and gate",
- "read_only": "Lecture seule",
- "untitled": "sans titre",
- "enter_project_title": "Entrer un nom de projet",
- "load_project_confirmation": "Le projet actuel sera supprimé. Continuer de charger le projet ?",
- "enter_project_image_path": "Entrer le chemin image du projet",
- "enter_remote_hostname": "Entrer le hostname distant user@host (experimentale)",
- "wrong_remote_hostname": "Mauvais hostname distant {{name}}",
- "remote_host_not_connected": "Remote host {{name}} not connected",
- "clear_all_confirmation": "Voulez vous tout nettoyer ?",
- "remove_block_confirmation": "Voulez vous supprimer le bloc séléctionné ?",
- "change_board_confirmation": "La configuration des entrées sorties du FPGA actuel va être perdue. Voulez vous changer pour la carte {{name}} ?",
- "board_selected": "Carte {{name}} séléctionnée",
- "remove_toolchain_confirmation": "Les répertoires de configuration d'Icestudio et apio vont être supprimés. Voulez-vous continuer ?",
- "toolchain_removed": "Toolchain supprimée",
- "project_created": "Nouveau projet {{name}} créé",
- "project_loaded": "Projet {{name}} chargé",
- "wrong_project_format": "Mauvais format de projet: {{name}}",
- "project_saved": "Projet {{name}} sauvegardé",
- "block_imported": "Bloc {{name}} importé",
- "block_exported_as": "Bloc exporté comme {{name}}",
- "verilog_exported": "Code Verilog exporté",
- "pcf_exported": "Fichier PCF exporté",
- "testbench_exported": "Banc de tests exporté",
- "gtkwave_exported": "GTKWave exporté",
- "enter_block_label": "Entrer le titre du bloc",
- "label_updated": "Titre mis à jour",
- "enter_block_ports": "Entrer les port du bloc",
- "wrong_block_format": "Mauvais format de bloc: {{type}}",
- "start_verify": "Début de la verification ...",
- "start_build": "Début de la construction ...",
- "start_upload": "Début du téléchargement ...",
- "done_verify": "Vérification faite",
- "done_build": "Construction terminée",
- "done_upload": "Téléchargement terminé",
- "generic_error": "Erreur: {{error}}",
- "file_does_not_exist": "Le fichier {{file}} n'existe pas",
- "board_not_detected": "Carte non détectée",
- "unknown_board": "Carte inconnue",
- "fpga_io_not_defined": "Ports d'entrée sortie FPGA non définits.",
- "duplicated_fpga_io": "Ports d'entrée sortie FPGA dupliqué",
- "installing_toolchain": "Installation de la toolchain",
- "internet_connection_required": "Une connexion internet est requise",
- "installation_completed": "Installation terminée",
- "toolchain_installed": "La toolchain est installée"
-}
diff --git a/app/resources/locale/fr_FR/fr_FR.po b/app/resources/locale/fr_FR/fr_FR.po
new file mode 100644
index 000000000..78d2158be
--- /dev/null
+++ b/app/resources/locale/fr_FR/fr_FR.po
@@ -0,0 +1,675 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: fr_FR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#. 1. Basic
+#: app/resources/examples/labels.js:4
+msgid "1_basic"
+msgstr "1. Basique"
+
+#. 1. Led on
+#: app/resources/examples/labels.js:6
+msgid "1_led_on"
+msgstr "1. Led on"
+
+#. 2. Switch led
+#: app/resources/examples/labels.js:8
+msgid "2_switch_led"
+msgstr "2. Switch led"
+
+#. 3. Switch and gate
+#: app/resources/examples/labels.js:10
+msgid "3_switch_and_gate"
+msgstr "3. Switch and gate"
+
+#: app/scripts/services/utils.service.js:414
+#: app/scripts/services/utils.service.js:489
+msgid "Unplug and reconnect the board"
+msgstr "Débrancher et reconnecter la carte"
+
+#: app/scripts/services/utils.service.js:480
+msgid ""
+"FTDI driver installation instructions
- Connect the FPGA "
+"board
- Replace the (Interface 0) driver of the board by "
+"libusbK
- Unplug and reconnect the board
"
+msgstr ""
+"Instructions d'installation du pilote FTDI
- Connecter la "
+"carte FPGA
- Remplacer le pilote (Interface 0) de la carte par "
+"libusbK
- Débrancher puis rebrancher la carte
"
+
+#: app/scripts/services/utils.service.js:496
+msgid ""
+"FTDI driver uninstallation instructions
- Find the FPGA USB "
+"Device
- Select the board interface and uninstall the driver
"
+msgstr ""
+"Instructions de désinstallation du pilote FTDI
- Trouver le "
+"périphérique USB FPGA
- Sélectionner la carte interface et "
+"désinstaller le pilote
"
+
+#: app/views/menu.html:271
+msgid "About Icestudio"
+msgstr "À propos d'Icestudio"
+
+#: app/views/menu.html:281
+msgid "Basic"
+msgstr "Basique"
+
+#: app/views/menu.html:152
+msgid "Basque"
+msgstr "Basque"
+
+#: app/scripts/services/common.service.js:94
+msgid "Block exported as {{name}}"
+msgstr "Bloc exporté comme {{name}}"
+
+#: app/scripts/services/common.service.js:75
+msgid "Block {{name}} imported"
+msgstr "Bloc {{name}} importé"
+
+#: app/scripts/services/tools.service.js:218
+msgid "Board {{name}} not detected"
+msgstr "Carte {{name}} non détectée"
+
+#: app/scripts/controllers/menu.js:407 app/scripts/controllers/menu.js:413
+msgid "Board {{name}} selected"
+msgstr "Carte {{name}} séléctionnée"
+
+#: app/views/menu.html:185
+msgid "Boards"
+msgstr "Cartes"
+
+#: app/views/menu.html:203
+msgid "Build"
+msgstr "Construire"
+
+#: app/scripts/services/tools.service.js:406
+msgid "Check Internet connection..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:414
+msgid "Check Python..."
+msgstr ""
+
+#: app/views/menu.html:112
+msgid "Clear all"
+msgstr "Tout nettoyer"
+
+#: app/views/menu.html:106
+msgid "Clone selected"
+msgstr "Cloner la selection"
+
+#: app/views/menu.html:284
+msgid "Code"
+msgstr "Code"
+
+#: app/views/menu.html:267
+msgid "Community forum"
+msgstr "Forum communautaire"
+
+#: app/views/menu.html:179
+msgid "Datasheet"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:394
+msgid "Datasheet not defined"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:283
+msgid ""
+"Default toolchain not found. Toolchain will be downloaded. This operation "
+"requires Internet connection. Do you want to continue?"
+msgstr ""
+
+#: app/views/menu.html:241
+msgid "Disable"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:314
+msgid "Do you want to clear all?"
+msgstr "Voulez vous tout nettoyer?"
+
+#: app/scripts/controllers/menu.js:327
+msgid "Do you want to remove the selected block?"
+msgstr "Voulez vous supprimer le bloc séléctionné?"
+
+#: app/views/menu.html:260
+msgid "Documentation"
+msgstr "Documentation"
+
+#: app/views/menu.html:234
+msgid "Drivers"
+msgstr "Pilote"
+
+#: app/scripts/services/utils.service.js:411
+#: app/scripts/services/utils.service.js:474
+msgid "Drivers disabled"
+msgstr "Pilote désactivé"
+
+#: app/scripts/services/utils.service.js:408
+#: app/scripts/services/utils.service.js:455
+msgid "Drivers enabled"
+msgstr "Pilote activé"
+
+#: app/scripts/services/tools.service.js:230
+msgid "Duplicated FPGA I/O ports"
+msgstr "Ports d'entrée sortie FPGA dupliqué"
+
+#: app/views/menu.html:99
+msgid "Edit"
+msgstr "Édition"
+
+#: app/views/menu.html:237
+msgid "Enable"
+msgstr ""
+
+#: app/views/menu.html:134
+msgid "English"
+msgstr "Anglais"
+
+#: app/scripts/services/graph.service.js:257
+#: app/scripts/services/graph.service.js:464
+#: app/scripts/services/graph.service.js:504
+msgid "Enter the block's label"
+msgstr "Entrer le titre du bloc"
+
+#: app/scripts/services/graph.service.js:409
+msgid "Enter the block's ports"
+msgstr "Entrer les port du bloc"
+
+#: app/scripts/controllers/menu.js:290
+msgid "Enter the project's image path"
+msgstr "Entrer le chemin image du projet"
+
+#: app/scripts/controllers/menu.js:72
+msgid "Enter the project's title"
+msgstr "Entrer un nom de projet"
+
+#: app/scripts/controllers/menu.js:298
+msgid "Enter the remote hostname user@host (experimental)"
+msgstr "Entrer le hostname distant user@host (experimentale)"
+
+#: app/scripts/services/tools.service.js:306
+msgid "Error: default toolchain not found in '{{dir}}'"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:161
+msgid "Error: {{error}}"
+msgstr "Erreur: {{error}}"
+
+#: app/views/menu.html:32
+msgid "Examples"
+msgstr "Exemples"
+
+#: app/scripts/services/tools.service.js:189
+msgid "Execute remote {{label}} ..."
+msgstr "Executer à distance {{label}} ..."
+
+#: app/views/menu.html:79
+msgid "Export"
+msgstr "Exporter"
+
+#: app/views/menu.html:75
+msgid "Export as block"
+msgstr "Exporter un bloc"
+
+#: app/scripts/services/tools.service.js:438
+msgid "Extract default apio files..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:448
+msgid "Extract default apio packages..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:426
+msgid "Extract virtual env files..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:224
+#: app/scripts/services/tools.service.js:227
+msgid "FPGA I/O ports not defined"
+msgstr "Ports d'entrée sortie FPGA non définits"
+
+#: app/views/menu.html:23
+msgid "File"
+msgstr "Fichier"
+
+#: app/scripts/services/tools.service.js:155
+msgid "File {{file}} does not exist"
+msgstr "Le fichier {{file}} n'existe pas"
+
+#: app/views/menu.html:158
+msgid "French"
+msgstr "Français"
+
+#: app/scripts/services/common.service.js:134
+msgid "GTKWave exported"
+msgstr "GTKWave exporté"
+
+#: app/views/menu.html:146
+msgid "Galician"
+msgstr "Galois"
+
+#: app/views/menu.html:250
+msgid "Help"
+msgstr "Aide"
+
+#: app/scripts/services/utils.service.js:445
+msgid "Homebrew is required"
+msgstr "Homebrew est requis"
+
+#: app/views/menu.html:119
+msgid "Image path"
+msgstr "Chemin image"
+
+#: app/views/menu.html:72
+msgid "Import block"
+msgstr "Importer un bloc"
+
+#: app/views/menu.html:285
+msgid "Info"
+msgstr "Info"
+
+#: app/views/menu.html:286
+msgid "Input"
+msgstr "Entrée"
+
+#: app/scripts/services/tools.service.js:443
+msgid "Install default apio..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:492
+msgid "Installation completed"
+msgstr "Installation terminée"
+
+#: app/scripts/services/tools.service.js:335
+#: app/scripts/services/tools.service.js:372
+msgid "Installing toolchain"
+msgstr "Installation de la toolchain"
+
+#: app/scripts/services/tools.service.js:408
+#: app/scripts/services/utils.service.js:448
+msgid "Internet connection required"
+msgstr "Une connexion internet est requise"
+
+#: app/scripts/services/graph.service.js:261
+msgid "Label updated"
+msgstr "Titre mis à jour"
+
+#: app/views/menu.html:130
+msgid "Language"
+msgstr "Langage"
+
+#: app/scripts/services/tools.service.js:431
+msgid "Make virtual env..."
+msgstr ""
+
+#: app/views/menu.html:26
+msgid "New project"
+msgstr "Nouveau projet"
+
+#: app/scripts/services/common.service.js:31
+msgid "New project {{name}} created"
+msgstr "Nouveau projet {{name}} créé"
+
+#: app/views/menu.html:29
+msgid "Open project"
+msgstr "Ouvrir un projet"
+
+#: app/views/menu.html:287
+msgid "Output"
+msgstr "Sortie"
+
+#: app/scripts/services/common.service.js:114
+msgid "PCF file exported"
+msgstr "Fichier PCF exporté"
+
+#: app/views/menu.html:116
+msgid "Preferences"
+msgstr ""
+
+#: app/scripts/services/common.service.js:51
+msgid "Project {{name}} loaded"
+msgstr "Projet {{name}} chargé"
+
+#: app/scripts/services/common.service.js:63
+msgid "Project {{name}} saved"
+msgstr "Projet {{name}} sauvegardé"
+
+#: app/scripts/services/tools.service.js:419
+msgid "Python 2.7 is required"
+msgstr ""
+
+#: app/views/project.html:2
+msgid "Read only"
+msgstr "Lecture seule"
+
+#: app/scripts/services/tools.service.js:256
+msgid "Remote host {{name}} not connected"
+msgstr "Remote host {{name}} not connected"
+
+#: app/views/menu.html:124
+msgid "Remote hostname"
+msgstr "Hostname distant"
+
+#: app/views/menu.html:219
+msgid "Remove"
+msgstr ""
+
+#: app/views/menu.html:109
+msgid "Remove selected"
+msgstr "Supprimer la selection"
+
+#: app/views/menu.html:224
+msgid "Reset default"
+msgstr ""
+
+#: app/views/menu.html:102
+msgid "Reset view"
+msgstr "Reinitialiser la vue"
+
+#: app/views/menu.html:65
+msgid "Save"
+msgstr "Sauvegarder"
+
+#: app/views/menu.html:68
+msgid "Save as"
+msgstr "Sauvegarder sous"
+
+#: app/views/menu.html:263
+msgid "Source code"
+msgstr "Code source"
+
+#: app/views/menu.html:140
+msgid "Spanish"
+msgstr "Espagnole"
+
+#: app/scripts/services/tools.service.js:178
+msgid "Synchronize remote files ..."
+msgstr "Synchroniser les fichiers distants ..."
+
+#: app/views/menu.html:49
+msgid "Templates"
+msgstr "Modèles"
+
+#: app/views/menu.html:88
+msgid "Testbench"
+msgstr "Banc de tests exporté"
+
+#: app/scripts/services/common.service.js:124
+msgid "Testbench exported"
+msgstr "Banc de tests exporté"
+
+#: app/scripts/controllers/menu.js:403
+msgid ""
+"The current FPGA I/O configuration will be lost. Do you want to change to "
+"{{name}} board?"
+msgstr ""
+"La configuration des entrées sorties du FPGA actuel va être perdue. Voulez "
+"vous changer pour la carte {{name}}?"
+
+#: app/scripts/controllers/menu.js:117 app/scripts/controllers/menu.js:94
+msgid ""
+"The current project will be removed. Do you want to continue loading the "
+"project?"
+msgstr "Le projet actuel sera supprimé. Continuer de charger le projet?"
+
+#: app/scripts/services/tools.service.js:311
+msgid "The toolchain will be removed. Do you want to continue?"
+msgstr ""
+"Les répertoires de configuration d'Icestudio et apio vont être supprimés. "
+"Voulez-vous continuer?"
+
+#: app/scripts/services/tools.service.js:299
+msgid "The toolchain will be restored to default. Do you want to continue?"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:291
+msgid ""
+"The toolchain will be updated. This operation requires Internet connection. "
+"Do you want to continue?"
+msgstr ""
+
+#: app/views/menu.html:210
+msgid "Toolchain"
+msgstr "Toolchain"
+
+#: app/scripts/services/tools.service.js:493
+msgid "Toolchain installed"
+msgstr "La toolchain est installée"
+
+#: app/scripts/services/tools.service.js:497
+msgid "Toolchain not installed"
+msgstr "La toolchain n'est pas à jour"
+
+#: app/scripts/services/tools.service.js:79
+#: app/scripts/services/utils.service.js:486
+#: app/scripts/services/utils.service.js:502
+msgid "Toolchain not installed. Please, install the toolchain"
+msgstr "La toolchain n'est pas à jour. Installer, ou mettre à jour svp"
+
+#: app/scripts/services/tools.service.js:315
+msgid "Toolchain removed"
+msgstr "Toolchain supprimée"
+
+#: app/views/menu.html:197
+msgid "Tools"
+msgstr "Outils"
+
+#: app/scripts/services/tools.service.js:221
+msgid "Unknown board"
+msgstr "Carte inconnue"
+
+#: app/views/menu.html:206
+msgid "Upload"
+msgstr "Télécharger"
+
+#: app/views/menu.html:200
+msgid "Verify"
+msgstr "Verifier"
+
+#: app/scripts/services/common.service.js:104
+msgid "Verilog code exported"
+msgstr "Code Verilog exporté"
+
+#: app/views/menu.html:256
+msgid "Version"
+msgstr "Version"
+
+#: app/views/menu.html:170
+msgid "View"
+msgstr "Vue"
+
+#: app/views/menu.html:253
+msgid "View license"
+msgstr "Voir la licence"
+
+#: app/scripts/services/graph.service.js:561
+msgid "Wrong block format: {{type}}"
+msgstr "Mauvais format de bloc: {{type}}"
+
+#: app/scripts/services/common.service.js:54
+msgid "Wrong project format: {{name}}"
+msgstr "Mauvais format de projet: {{name}}"
+
+#: app/scripts/services/tools.service.js:253
+msgid "Wrong remote hostname {{name}}"
+msgstr "Mauvais hostname distant {{name}}"
+
+#. And
+#: app/resources/blocks/labels.js:34
+msgid "and"
+msgstr "Et"
+
+#. Bit
+#: app/resources/blocks/labels.js:4
+msgid "bit"
+msgstr "Bit"
+
+#. Comb
+#: app/resources/blocks/labels.js:16
+msgid "comb"
+msgstr "Combinatoire"
+
+#. Config
+#: app/resources/blocks/labels.js:6
+msgid "config"
+msgstr "Configuration"
+
+#. Demux 1:2
+#: app/resources/blocks/labels.js:18
+msgid "demux_1_2"
+msgstr "Démultiplexeur 1:2"
+
+#. Demux 1:4
+#: app/resources/blocks/labels.js:20
+msgid "demux_1_4"
+msgstr "Démultiplexeur 1:4"
+
+#. Demux 1:8
+#: app/resources/blocks/labels.js:22
+msgid "demux_1_8"
+msgstr "Démultiplexeur 1:8"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:50
+msgid "dff_ar"
+msgstr "D flip-flop async"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:52
+msgid "dff_sr"
+msgstr "D flip-flop"
+
+#. Build done
+#: app/scripts/services/tools.service.js:268
+msgid "done_build"
+msgstr "Construction terminée"
+
+#. Upload done
+#: app/scripts/services/tools.service.js:270
+msgid "done_upload"
+msgstr "Téléchargement terminé"
+
+#. Verification done
+#: app/scripts/services/tools.service.js:266
+msgid "done_verify"
+msgstr "Vérification faite"
+
+#. Gate
+#: app/resources/blocks/labels.js:32
+msgid "gate"
+msgstr "Porte"
+
+#. Hex 7 Segment CA
+#: app/resources/blocks/labels.js:26
+msgid "hex_7seg_ca"
+msgstr "Hex 7 Segment CA"
+
+#. Hex 7 Segment CC
+#: app/resources/blocks/labels.js:24
+msgid "hex_7seg_cc"
+msgstr "Hex 7 Segment CC"
+
+#. Logic
+#: app/resources/blocks/labels.js:14
+msgid "logic"
+msgstr "Logique"
+
+#. Mux 2:1
+#: app/resources/blocks/labels.js:28
+msgid "mux_2_1"
+msgstr "Multiplexeur 2:1"
+
+#. Mux 4:1
+#: app/resources/blocks/labels.js:30
+msgid "mux_4_1"
+msgstr "Multiplexeur 4:1"
+
+#. Nand
+#: app/resources/blocks/labels.js:36
+msgid "nand"
+msgstr "Non Et"
+
+#. Nor
+#: app/resources/blocks/labels.js:38
+msgid "nor"
+msgstr "Non Ou"
+
+#. Not
+#: app/resources/blocks/labels.js:40
+msgid "not"
+msgstr "Non"
+
+#. Or
+#: app/resources/blocks/labels.js:42
+msgid "or"
+msgstr "Ou"
+
+#. Pull up
+#: app/resources/blocks/labels.js:8
+msgid "pull_up"
+msgstr "Pull up"
+
+#. Pull up inv
+#: app/resources/blocks/labels.js:10
+msgid "pull_up_inv"
+msgstr "Pull up inv"
+
+#. Sec
+#: app/resources/blocks/labels.js:48
+msgid "sec"
+msgstr "Séquentiel"
+
+#. Start building ...
+#: app/scripts/services/tools.service.js:45
+msgid "start_build"
+msgstr "Début de la construction ..."
+
+#. Start uploading ...
+#: app/scripts/services/tools.service.js:47
+msgid "start_upload"
+msgstr "Début du téléchargement ..."
+
+#. Start verification ...
+#: app/scripts/services/tools.service.js:43
+msgid "start_verify"
+msgstr "Début de la verification ..."
+
+#. T flip-flop async
+#: app/resources/blocks/labels.js:54
+msgid "tff_ar"
+msgstr "T flip-flop async"
+
+#. T flip-flop
+#: app/resources/blocks/labels.js:56
+msgid "tff_sr"
+msgstr "T flip-flop"
+
+#. Tri-state
+#: app/resources/blocks/labels.js:12
+msgid "tri_state"
+msgstr "Tri-state"
+
+#: app/scripts/controllers/menu.js:73
+msgid "untitled"
+msgstr "sans titre"
+
+#. Xnor
+#: app/resources/blocks/labels.js:44
+msgid "xnor"
+msgstr "Xnor"
+
+#. Xor
+#: app/resources/blocks/labels.js:46
+msgid "xor"
+msgstr "Xor"
diff --git a/app/resources/locale/gl.json b/app/resources/locale/gl.json
deleted file mode 100644
index 33efcaa1f..000000000
--- a/app/resources/locale/gl.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "file": "Ficheiro",
- "edit": "Editar",
- "view": "Ver",
- "boards": "Placas",
- "tools": "Ferramentas",
- "help": "Axuda",
- "new_project": "Novo proxecto",
- "open_project": "Abrir proxecto",
- "examples": "Exemplos",
- "templates": "Modelos",
- "save": "Gardar",
- "save_as": "Gardar como",
- "import_block": "Importar bloque",
- "export_as_block": "Exportar como bloque",
- "export": "Exportar",
- "verilog": "Verilog",
- "pcf": "PCF",
- "testbench": "Testbench",
- "gtkwave": "GTKWave",
- "clone_selected": "Clonar seleccionado",
- "remove_selected": "Suprimir seleccionado",
- "clear_all": "Suprimir todo",
- "image_path": "Ruta da imaxe",
- "remote_hostname": "Remote hostname",
- "language": "Idioma",
- "english": "Inglés",
- "spanish": "Castelán",
- "galician": "Galego",
- "basque": "Euskera",
- "reset_view": "Restablecer vista",
- "verify": "Verificar",
- "build": "Sintetizar",
- "upload": "Cargar",
- "sync_remote_files": "Synchronize remote files ...",
- "execute_remote": "Execute remote {{label}} ...",
- "toolchain": "Toolchain",
- "install": "Instalar",
- "update": "Actualizar",
- "remove": "Eliminar",
- "toolchain_not_installed": "Toolchain not installed. Please, install the toolchain",
- "drivers": "Drivers",
- "enable": "Enable",
- "drivers_enabled": "Drivers enabled",
- "disable": "Disable",
- "drivers_disabled": "Drivers disabled",
- "homebrew_required": "Homebrew is required",
- "unplug_and_reconnect": "Unplug and reconnect the board",
- "install_drivers_windows": "FTDI driver installation instructions
- Connect the FPGA board
- Replace the (Interface 0) driver of the board by libusbK
- Unplug and reconnect the board
Note: not fully working with Windows 10 + USB 3.0
",
- "uninstall_drivers_windows": "FTDI driver uninstallation instructions
- Find the FPGA USB Device
- Select the board interface and uninstall the driver
",
- "view_license": "Ver licenza",
- "version": "Versión",
- "documentation": "Documentación",
- "source_code": "Código fonte",
- "community_forum": "Foro da comunidade",
- "about_icestudio": "Acerca de Icestudio",
- "basic": "Básico",
- "code": "Código",
- "info": "Info",
- "input": "Entrada",
- "output": "Saída",
- "bit": "Bit",
- "config": "Config",
- "pull_up": "Pull up",
- "pull_up_inv": "Pull up inv",
- "tri_state": "Tri-state",
- "logic": "Lóxica",
- "comb": "Comb",
- "demux_1_2": "Demux 1:2",
- "demux_1_4": "Demux 1:4",
- "demux_1_8": "Demux 1:8",
- "hex_7seg_cc": "Hex 7 Segment CC",
- "hex_7seg_ca": "Hex 7 Segment CA",
- "mux_2_1": "Mux 2:1",
- "mux_4_1": "Mux 4:1",
- "gate": "Gate",
- "and": "And",
- "nand": "Nand",
- "nor": "Nor",
- "not": "Not",
- "or": "Or",
- "xnor": "Xnor",
- "xor": "Xor",
- "sec": "Sec",
- "dff_ar": "Bistable D asinc",
- "dff_sr": "Bistable D",
- "tff_ar": "Bistable T asinc",
- "tff_sr": "Bistable T",
- "1_basic": "1. Básico",
- "1_led_on": "1. Acender led",
- "2_switch_led": "2. Interruptor con led",
- "3_switch_and_gate": "3. Interruptor con porta and",
- "read_only": "Só lectura",
- "untitled": "Sen título",
- "enter_project_title": "Introduza o título do proxecto",
- "load_project_confirmation": "O proxecto actual perderase. ¿Desexa continuar abrindo o proxecto?",
- "enter_project_image_path": "Introduza a ruta da imaxe do proxecto",
- "enter_remote_hostname": "Enter the remote hostname user@host (experimental)",
- "wrong_remote_hostname": "Wrong remote hostname {{name}}",
- "remote_host_not_connected": "Remote host {{name}} not connected",
- "clear_all_confirmation": "¿Desexa borrar todo?",
- "remove_block_confirmation": "¿Desexa eliminar o bloque seleccionado?",
- "change_board_confirmation": "A configuración actual de E/S da FPGA perderase. ¿Desexa cambiar á placa {{name}}?",
- "board_selected": "Placa {{name}} seleccionada",
- "remove_toolchain_confirmation": "The toolchain will be removed. Do you want to continue?",
- "toolchain_removed": "Toolchain eliminada",
- "project_created": "Novo proxecto {{name}} creado",
- "project_loaded": "Proxecto {{name}} cargado",
- "wrong_project_format": "Formato de proxecto incorrecto: {{name}}",
- "project_saved": "Proxecto {{name}} gardado",
- "block_imported": "Bloque {{name}} importado",
- "block_exported_as": "Bloque exportado como {{name}}",
- "verilog_exported": "Código Verilog exportado",
- "pcf_exported": "Ficheiro PCF exportado",
- "testbench_exported": "Testbench exportado",
- "gtkwave_exported": "GTKWave exportado",
- "enter_block_label": "Introduza a etiqueta para o bloque",
- "label_updated": "Etiqueta actualizada",
- "enter_block_ports": "Introduza os portos para o bloque",
- "wrong_block_format": "Formato de bloque incorrecto: {{type}}",
- "start_verify": "Iniciar a verificación...",
- "start_build": "Iniciar a sintetizado...",
- "start_upload": "Iniciar a carga...",
- "done_verify": "Verificación realizada",
- "done_build": "Sintetizado realizado",
- "done_upload": "Carga realizada",
- "generic_error": "Error: {{error}}",
- "file_does_not_exist": "O ficheiro {{file}} non existe",
- "board_not_detected": "Placa non detectada",
- "unknown_board": "Placa desconocida",
- "fpga_io_not_defined": "Portos E/S da FPGA non definidos",
- "duplicated_fpga_io": "Portos E/S da FPGA duplicados",
- "installing_toolchain": "Instalando a toolchain",
- "internet_connection_required": "Requírese dunha conexión a Internet",
- "installation_completed": "Instalación completada",
- "toolchain_installed": "Toolchain instalada"
-}
diff --git a/app/resources/locale/gl_ES/gl_ES.po b/app/resources/locale/gl_ES/gl_ES.po
new file mode 100644
index 000000000..ef3ad457e
--- /dev/null
+++ b/app/resources/locale/gl_ES/gl_ES.po
@@ -0,0 +1,667 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: gl_ES\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.7.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. 1. Basic
+#: app/resources/examples/labels.js:4
+msgid "1_basic"
+msgstr "1. Básico"
+
+#. 1. Led on
+#: app/resources/examples/labels.js:6
+msgid "1_led_on"
+msgstr "1. Acender led"
+
+#. 2. Switch led
+#: app/resources/examples/labels.js:8
+msgid "2_switch_led"
+msgstr "2. Interruptor con led"
+
+#. 3. Switch and gate
+#: app/resources/examples/labels.js:10
+msgid "3_switch_and_gate"
+msgstr "3. Interruptor con porta and"
+
+#: app/scripts/services/utils.service.js:414
+#: app/scripts/services/utils.service.js:489
+msgid "Unplug and reconnect the board"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:480
+msgid ""
+"FTDI driver installation instructions
- Connect the FPGA "
+"board
- Replace the (Interface 0) driver of the board by "
+"libusbK
- Unplug and reconnect the board
"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:496
+msgid ""
+"FTDI driver uninstallation instructions
- Find the FPGA USB "
+"Device
- Select the board interface and uninstall the driver
"
+msgstr ""
+
+#: app/views/menu.html:271
+msgid "About Icestudio"
+msgstr "Acerca de Icestudio"
+
+#: app/views/menu.html:281
+msgid "Basic"
+msgstr "Básico"
+
+#: app/views/menu.html:152
+msgid "Basque"
+msgstr "Euskera"
+
+#: app/scripts/services/common.service.js:94
+msgid "Block exported as {{name}}"
+msgstr "Bloque exportado como {{name}}"
+
+#: app/scripts/services/common.service.js:75
+msgid "Block {{name}} imported"
+msgstr "Bloque {{name}} importado"
+
+#: app/scripts/services/tools.service.js:218
+msgid "Board {{name}} not detected"
+msgstr "Placa {{name}} non detectada"
+
+#: app/scripts/controllers/menu.js:407 app/scripts/controllers/menu.js:413
+msgid "Board {{name}} selected"
+msgstr "Placa {{name}} seleccionada"
+
+#: app/views/menu.html:185
+msgid "Boards"
+msgstr "Placas"
+
+#: app/views/menu.html:203
+msgid "Build"
+msgstr "Sintetizar"
+
+#: app/scripts/services/tools.service.js:406
+msgid "Check Internet connection..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:414
+msgid "Check Python..."
+msgstr ""
+
+#: app/views/menu.html:112
+msgid "Clear all"
+msgstr "Suprimir todo"
+
+#: app/views/menu.html:106
+msgid "Clone selected"
+msgstr "Clonar seleccionado"
+
+#: app/views/menu.html:284
+msgid "Code"
+msgstr "Código"
+
+#: app/views/menu.html:267
+msgid "Community forum"
+msgstr "Foro da comunidade"
+
+#: app/views/menu.html:179
+msgid "Datasheet"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:394
+msgid "Datasheet not defined"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:283
+msgid ""
+"Default toolchain not found. Toolchain will be downloaded. This operation "
+"requires Internet connection. Do you want to continue?"
+msgstr ""
+
+#: app/views/menu.html:241
+msgid "Disable"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:314
+msgid "Do you want to clear all?"
+msgstr "¿Desexa borrar todo?"
+
+#: app/scripts/controllers/menu.js:327
+msgid "Do you want to remove the selected block?"
+msgstr "¿Desexa eliminar o bloque seleccionado?"
+
+#: app/views/menu.html:260
+msgid "Documentation"
+msgstr "Documentación"
+
+#: app/views/menu.html:234
+msgid "Drivers"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:411
+#: app/scripts/services/utils.service.js:474
+msgid "Drivers disabled"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:408
+#: app/scripts/services/utils.service.js:455
+msgid "Drivers enabled"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:230
+msgid "Duplicated FPGA I/O ports"
+msgstr "Portos E/S da FPGA duplicados"
+
+#: app/views/menu.html:99
+msgid "Edit"
+msgstr "Editar"
+
+#: app/views/menu.html:237
+msgid "Enable"
+msgstr ""
+
+#: app/views/menu.html:134
+msgid "English"
+msgstr "Inglés"
+
+#: app/scripts/services/graph.service.js:257
+#: app/scripts/services/graph.service.js:464
+#: app/scripts/services/graph.service.js:504
+msgid "Enter the block's label"
+msgstr "Introduza a etiqueta para o bloque"
+
+#: app/scripts/services/graph.service.js:409
+msgid "Enter the block's ports"
+msgstr "Introduza os portos para o bloque"
+
+#: app/scripts/controllers/menu.js:290
+msgid "Enter the project's image path"
+msgstr "Introduza a ruta da imaxe do proxecto"
+
+#: app/scripts/controllers/menu.js:72
+msgid "Enter the project's title"
+msgstr "Introduza o título do proxecto"
+
+#: app/scripts/controllers/menu.js:298
+msgid "Enter the remote hostname user@host (experimental)"
+msgstr "Enter the remote hostname user@host (experimental)"
+
+#: app/scripts/services/tools.service.js:306
+msgid "Error: default toolchain not found in '{{dir}}'"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:161
+msgid "Error: {{error}}"
+msgstr "Error: {{error}}"
+
+#: app/views/menu.html:32
+msgid "Examples"
+msgstr "Exemplos"
+
+#: app/scripts/services/tools.service.js:189
+msgid "Execute remote {{label}} ..."
+msgstr "Execute remote {{label}} ..."
+
+#: app/views/menu.html:79
+msgid "Export"
+msgstr "Exportar"
+
+#: app/views/menu.html:75
+msgid "Export as block"
+msgstr "Exportar como bloque"
+
+#: app/scripts/services/tools.service.js:438
+msgid "Extract default apio files..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:448
+msgid "Extract default apio packages..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:426
+msgid "Extract virtual env files..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:224
+#: app/scripts/services/tools.service.js:227
+msgid "FPGA I/O ports not defined"
+msgstr "Portos E/S da FPGA non definidos"
+
+#: app/views/menu.html:23
+msgid "File"
+msgstr "Ficheiro"
+
+#: app/scripts/services/tools.service.js:155
+msgid "File {{file}} does not exist"
+msgstr "O ficheiro {{file}} non existe"
+
+#: app/views/menu.html:158
+msgid "French"
+msgstr ""
+
+#: app/scripts/services/common.service.js:134
+msgid "GTKWave exported"
+msgstr "GTKWave exportado"
+
+#: app/views/menu.html:146
+msgid "Galician"
+msgstr "Galego"
+
+#: app/views/menu.html:250
+msgid "Help"
+msgstr "Axuda"
+
+#: app/scripts/services/utils.service.js:445
+msgid "Homebrew is required"
+msgstr ""
+
+#: app/views/menu.html:119
+msgid "Image path"
+msgstr "Ruta da imaxe"
+
+#: app/views/menu.html:72
+msgid "Import block"
+msgstr "Importar bloque"
+
+#: app/views/menu.html:285
+msgid "Info"
+msgstr "Info"
+
+#: app/views/menu.html:286
+msgid "Input"
+msgstr "Entrada"
+
+#: app/scripts/services/tools.service.js:443
+msgid "Install default apio..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:492
+msgid "Installation completed"
+msgstr "Instalación completada"
+
+#: app/scripts/services/tools.service.js:335
+#: app/scripts/services/tools.service.js:372
+msgid "Installing toolchain"
+msgstr "Instalando a toolchain"
+
+#: app/scripts/services/tools.service.js:408
+#: app/scripts/services/utils.service.js:448
+msgid "Internet connection required"
+msgstr "Requírese dunha conexión a Internet"
+
+#: app/scripts/services/graph.service.js:261
+msgid "Label updated"
+msgstr "Etiqueta actualizada"
+
+#: app/views/menu.html:130
+msgid "Language"
+msgstr "Idioma"
+
+#: app/scripts/services/tools.service.js:431
+msgid "Make virtual env..."
+msgstr ""
+
+#: app/views/menu.html:26
+msgid "New project"
+msgstr "Novo proxecto"
+
+#: app/scripts/services/common.service.js:31
+msgid "New project {{name}} created"
+msgstr "Novo proxecto {{name}} creado"
+
+#: app/views/menu.html:29
+msgid "Open project"
+msgstr "Abrir proxecto"
+
+#: app/views/menu.html:287
+msgid "Output"
+msgstr "Saída"
+
+#: app/scripts/services/common.service.js:114
+msgid "PCF file exported"
+msgstr "Ficheiro PCF exportado"
+
+#: app/views/menu.html:116
+msgid "Preferences"
+msgstr ""
+
+#: app/scripts/services/common.service.js:51
+msgid "Project {{name}} loaded"
+msgstr "Proxecto {{name}} cargado"
+
+#: app/scripts/services/common.service.js:63
+msgid "Project {{name}} saved"
+msgstr "Proxecto {{name}} gardado"
+
+#: app/scripts/services/tools.service.js:419
+msgid "Python 2.7 is required"
+msgstr ""
+
+#: app/views/project.html:2
+msgid "Read only"
+msgstr "Só lectura"
+
+#: app/scripts/services/tools.service.js:256
+msgid "Remote host {{name}} not connected"
+msgstr ""
+
+#: app/views/menu.html:124
+msgid "Remote hostname"
+msgstr ""
+
+#: app/views/menu.html:219
+msgid "Remove"
+msgstr "Eliminar"
+
+#: app/views/menu.html:109
+msgid "Remove selected"
+msgstr "Suprimir seleccionado"
+
+#: app/views/menu.html:224
+msgid "Reset default"
+msgstr ""
+
+#: app/views/menu.html:102
+msgid "Reset view"
+msgstr "Restablecer vista"
+
+#: app/views/menu.html:65
+msgid "Save"
+msgstr "Gardar"
+
+#: app/views/menu.html:68
+msgid "Save as"
+msgstr "Gardar como"
+
+#: app/views/menu.html:263
+msgid "Source code"
+msgstr "Código fonte"
+
+#: app/views/menu.html:140
+msgid "Spanish"
+msgstr "Castelán"
+
+#: app/scripts/services/tools.service.js:178
+msgid "Synchronize remote files ..."
+msgstr "Synchronize remote files ..."
+
+#: app/views/menu.html:49
+msgid "Templates"
+msgstr "Modelos"
+
+#: app/views/menu.html:88
+msgid "Testbench"
+msgstr "Testbench"
+
+#: app/scripts/services/common.service.js:124
+msgid "Testbench exported"
+msgstr "Testbench exportado"
+
+#: app/scripts/controllers/menu.js:403
+msgid ""
+"The current FPGA I/O configuration will be lost. Do you want to change to "
+"{{name}} board?"
+msgstr ""
+"A configuración actual de E/S da FPGA perderase. ¿Desexa cambiar á placa "
+"{{name}}?"
+
+#: app/scripts/controllers/menu.js:117 app/scripts/controllers/menu.js:94
+msgid ""
+"The current project will be removed. Do you want to continue loading the "
+"project?"
+msgstr "O proxecto actual perderase. ¿Desexa continuar abrindo o proxecto?"
+
+#: app/scripts/services/tools.service.js:311
+msgid "The toolchain will be removed. Do you want to continue?"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:299
+msgid "The toolchain will be restored to default. Do you want to continue?"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:291
+msgid ""
+"The toolchain will be updated. This operation requires Internet connection. "
+"Do you want to continue?"
+msgstr ""
+
+#: app/views/menu.html:210
+msgid "Toolchain"
+msgstr "Toolchain"
+
+#: app/scripts/services/tools.service.js:493
+msgid "Toolchain installed"
+msgstr "Toolchain instalada"
+
+#: app/scripts/services/tools.service.js:497
+msgid "Toolchain not installed"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:79
+#: app/scripts/services/utils.service.js:486
+#: app/scripts/services/utils.service.js:502
+msgid "Toolchain not installed. Please, install the toolchain"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:315
+msgid "Toolchain removed"
+msgstr "Toolchain eliminada"
+
+#: app/views/menu.html:197
+msgid "Tools"
+msgstr "Ferramentas"
+
+#: app/scripts/services/tools.service.js:221
+msgid "Unknown board"
+msgstr "Placa desconocida"
+
+#: app/views/menu.html:206
+msgid "Upload"
+msgstr "Cargar"
+
+#: app/views/menu.html:200
+msgid "Verify"
+msgstr "Verificar"
+
+#: app/scripts/services/common.service.js:104
+msgid "Verilog code exported"
+msgstr "Código Verilog exportado"
+
+#: app/views/menu.html:256
+msgid "Version"
+msgstr "Versión"
+
+#: app/views/menu.html:170
+msgid "View"
+msgstr "Ver"
+
+#: app/views/menu.html:253
+msgid "View license"
+msgstr "Ver licenza"
+
+#: app/scripts/services/graph.service.js:561
+msgid "Wrong block format: {{type}}"
+msgstr "Formato de bloque incorrecto: {{type}}"
+
+#: app/scripts/services/common.service.js:54
+msgid "Wrong project format: {{name}}"
+msgstr "Formato de proxecto incorrecto: {{name}}\""
+
+#: app/scripts/services/tools.service.js:253
+msgid "Wrong remote hostname {{name}}"
+msgstr ""
+
+#. And
+#: app/resources/blocks/labels.js:34
+msgid "and"
+msgstr "And"
+
+#. Bit
+#: app/resources/blocks/labels.js:4
+msgid "bit"
+msgstr "Bit"
+
+#. Comb
+#: app/resources/blocks/labels.js:16
+msgid "comb"
+msgstr "Comb"
+
+#. Config
+#: app/resources/blocks/labels.js:6
+msgid "config"
+msgstr "Config"
+
+#. Demux 1:2
+#: app/resources/blocks/labels.js:18
+msgid "demux_1_2"
+msgstr "Demux 1:2"
+
+#. Demux 1:4
+#: app/resources/blocks/labels.js:20
+msgid "demux_1_4"
+msgstr "Demux 1:4"
+
+#. Demux 1:8
+#: app/resources/blocks/labels.js:22
+msgid "demux_1_8"
+msgstr "Demux 1:8"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:50
+msgid "dff_ar"
+msgstr "Bistable D asinc"
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:52
+msgid "dff_sr"
+msgstr "Bistable D"
+
+#. Build done
+#: app/scripts/services/tools.service.js:268
+msgid "done_build"
+msgstr "Sintetizado realizado"
+
+#. Upload done
+#: app/scripts/services/tools.service.js:270
+msgid "done_upload"
+msgstr "Carga realizada"
+
+#. Verification done
+#: app/scripts/services/tools.service.js:266
+msgid "done_verify"
+msgstr "Verificación realizada"
+
+#. Gate
+#: app/resources/blocks/labels.js:32
+msgid "gate"
+msgstr "Gate"
+
+#. Hex 7 Segment CA
+#: app/resources/blocks/labels.js:26
+msgid "hex_7seg_ca"
+msgstr "Hex 7 Segment CA"
+
+#. Hex 7 Segment CC
+#: app/resources/blocks/labels.js:24
+msgid "hex_7seg_cc"
+msgstr "Hex 7 Segment CC"
+
+#. Logic
+#: app/resources/blocks/labels.js:14
+msgid "logic"
+msgstr "Lóxica"
+
+#. Mux 2:1
+#: app/resources/blocks/labels.js:28
+msgid "mux_2_1"
+msgstr "Mux 2:1"
+
+#. Mux 4:1
+#: app/resources/blocks/labels.js:30
+msgid "mux_4_1"
+msgstr "Mux 4:1"
+
+#. Nand
+#: app/resources/blocks/labels.js:36
+msgid "nand"
+msgstr "Nand"
+
+#. Nor
+#: app/resources/blocks/labels.js:38
+msgid "nor"
+msgstr "Nor"
+
+#. Not
+#: app/resources/blocks/labels.js:40
+msgid "not"
+msgstr "Not"
+
+#. Or
+#: app/resources/blocks/labels.js:42
+msgid "or"
+msgstr "Or"
+
+#. Pull up
+#: app/resources/blocks/labels.js:8
+msgid "pull_up"
+msgstr "Pull up"
+
+#. Pull up inv
+#: app/resources/blocks/labels.js:10
+msgid "pull_up_inv"
+msgstr "Pull up inv"
+
+#. Sec
+#: app/resources/blocks/labels.js:48
+msgid "sec"
+msgstr "Sec"
+
+#. Start building ...
+#: app/scripts/services/tools.service.js:45
+msgid "start_build"
+msgstr "Iniciar a sintetizado ..."
+
+#. Start uploading ...
+#: app/scripts/services/tools.service.js:47
+msgid "start_upload"
+msgstr "Iniciar a carga ..."
+
+#. Start verification ...
+#: app/scripts/services/tools.service.js:43
+msgid "start_verify"
+msgstr "Iniciar a verificación ..."
+
+#. T flip-flop async
+#: app/resources/blocks/labels.js:54
+msgid "tff_ar"
+msgstr "Bistable T asinc"
+
+#. T flip-flop
+#: app/resources/blocks/labels.js:56
+msgid "tff_sr"
+msgstr "Bistable T"
+
+#. Tri-state
+#: app/resources/blocks/labels.js:12
+msgid "tri_state"
+msgstr "Tri-state"
+
+#: app/scripts/controllers/menu.js:73
+msgid "untitled"
+msgstr "Sen título"
+
+#. Xnor
+#: app/resources/blocks/labels.js:44
+msgid "xnor"
+msgstr "Xnor"
+
+#. Xor
+#: app/resources/blocks/labels.js:46
+msgid "xor"
+msgstr "Xor"
diff --git a/app/resources/locale/template.pot b/app/resources/locale/template.pot
new file mode 100644
index 000000000..a82a3e74b
--- /dev/null
+++ b/app/resources/locale/template.pot
@@ -0,0 +1,646 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Project-Id-Version: \n"
+
+#. 1. Basic
+#: app/resources/examples/labels.js:4
+msgid "1_basic"
+msgstr ""
+
+#. 1. Led on
+#: app/resources/examples/labels.js:6
+msgid "1_led_on"
+msgstr ""
+
+#. 2. Switch led
+#: app/resources/examples/labels.js:8
+msgid "2_switch_led"
+msgstr ""
+
+#. 3. Switch and gate
+#: app/resources/examples/labels.js:10
+msgid "3_switch_and_gate"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:414
+#: app/scripts/services/utils.service.js:489
+msgid "Unplug and reconnect the board"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:480
+msgid "FTDI driver installation instructions
- Connect the FPGA board
- Replace the (Interface 0) driver of the board by libusbK
- Unplug and reconnect the board
"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:496
+msgid "FTDI driver uninstallation instructions
- Find the FPGA USB Device
- Select the board interface and uninstall the driver
"
+msgstr ""
+
+#: app/views/menu.html:271
+msgid "About Icestudio"
+msgstr ""
+
+#: app/views/menu.html:281
+msgid "Basic"
+msgstr ""
+
+#: app/views/menu.html:152
+msgid "Basque"
+msgstr ""
+
+#: app/scripts/services/common.service.js:94
+msgid "Block exported as {{name}}"
+msgstr ""
+
+#: app/scripts/services/common.service.js:75
+msgid "Block {{name}} imported"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:218
+msgid "Board {{name}} not detected"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:407
+#: app/scripts/controllers/menu.js:413
+msgid "Board {{name}} selected"
+msgstr ""
+
+#: app/views/menu.html:185
+msgid "Boards"
+msgstr ""
+
+#: app/views/menu.html:203
+msgid "Build"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:406
+msgid "Check Internet connection..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:414
+msgid "Check Python..."
+msgstr ""
+
+#: app/views/menu.html:112
+msgid "Clear all"
+msgstr ""
+
+#: app/views/menu.html:106
+msgid "Clone selected"
+msgstr ""
+
+#: app/views/menu.html:284
+msgid "Code"
+msgstr ""
+
+#: app/views/menu.html:267
+msgid "Community forum"
+msgstr ""
+
+#: app/views/menu.html:179
+msgid "Datasheet"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:394
+msgid "Datasheet not defined"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:283
+msgid "Default toolchain not found. Toolchain will be downloaded. This operation requires Internet connection. Do you want to continue?"
+msgstr ""
+
+#: app/views/menu.html:241
+msgid "Disable"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:314
+msgid "Do you want to clear all?"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:327
+msgid "Do you want to remove the selected block?"
+msgstr ""
+
+#: app/views/menu.html:260
+msgid "Documentation"
+msgstr ""
+
+#: app/views/menu.html:234
+msgid "Drivers"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:411
+#: app/scripts/services/utils.service.js:474
+msgid "Drivers disabled"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:408
+#: app/scripts/services/utils.service.js:455
+msgid "Drivers enabled"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:230
+msgid "Duplicated FPGA I/O ports"
+msgstr ""
+
+#: app/views/menu.html:99
+msgid "Edit"
+msgstr ""
+
+#: app/views/menu.html:237
+msgid "Enable"
+msgstr ""
+
+#: app/views/menu.html:134
+msgid "English"
+msgstr ""
+
+#: app/scripts/services/graph.service.js:257
+#: app/scripts/services/graph.service.js:464
+#: app/scripts/services/graph.service.js:504
+msgid "Enter the block's label"
+msgstr ""
+
+#: app/scripts/services/graph.service.js:409
+msgid "Enter the block's ports"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:290
+msgid "Enter the project's image path"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:72
+msgid "Enter the project's title"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:298
+msgid "Enter the remote hostname user@host (experimental)"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:306
+msgid "Error: default toolchain not found in '{{dir}}'"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:161
+msgid "Error: {{error}}"
+msgstr ""
+
+#: app/views/menu.html:32
+msgid "Examples"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:189
+msgid "Execute remote {{label}} ..."
+msgstr ""
+
+#: app/views/menu.html:79
+msgid "Export"
+msgstr ""
+
+#: app/views/menu.html:75
+msgid "Export as block"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:438
+msgid "Extract default apio files..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:448
+msgid "Extract default apio packages..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:426
+msgid "Extract virtual env files..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:224
+#: app/scripts/services/tools.service.js:227
+msgid "FPGA I/O ports not defined"
+msgstr ""
+
+#: app/views/menu.html:23
+msgid "File"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:155
+msgid "File {{file}} does not exist"
+msgstr ""
+
+#: app/views/menu.html:158
+msgid "French"
+msgstr ""
+
+#: app/scripts/services/common.service.js:134
+msgid "GTKWave exported"
+msgstr ""
+
+#: app/views/menu.html:146
+msgid "Galician"
+msgstr ""
+
+#: app/views/menu.html:250
+msgid "Help"
+msgstr ""
+
+#: app/scripts/services/utils.service.js:445
+msgid "Homebrew is required"
+msgstr ""
+
+#: app/views/menu.html:119
+msgid "Image path"
+msgstr ""
+
+#: app/views/menu.html:72
+msgid "Import block"
+msgstr ""
+
+#: app/views/menu.html:285
+msgid "Info"
+msgstr ""
+
+#: app/views/menu.html:286
+msgid "Input"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:443
+msgid "Install default apio..."
+msgstr ""
+
+#: app/scripts/services/tools.service.js:492
+msgid "Installation completed"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:335
+#: app/scripts/services/tools.service.js:372
+msgid "Installing toolchain"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:408
+#: app/scripts/services/utils.service.js:448
+msgid "Internet connection required"
+msgstr ""
+
+#: app/scripts/services/graph.service.js:261
+msgid "Label updated"
+msgstr ""
+
+#: app/views/menu.html:130
+msgid "Language"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:431
+msgid "Make virtual env..."
+msgstr ""
+
+#: app/views/menu.html:26
+msgid "New project"
+msgstr ""
+
+#: app/scripts/services/common.service.js:31
+msgid "New project {{name}} created"
+msgstr ""
+
+#: app/views/menu.html:29
+msgid "Open project"
+msgstr ""
+
+#: app/views/menu.html:287
+msgid "Output"
+msgstr ""
+
+#: app/scripts/services/common.service.js:114
+msgid "PCF file exported"
+msgstr ""
+
+#: app/views/menu.html:116
+msgid "Preferences"
+msgstr ""
+
+#: app/scripts/services/common.service.js:51
+msgid "Project {{name}} loaded"
+msgstr ""
+
+#: app/scripts/services/common.service.js:63
+msgid "Project {{name}} saved"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:419
+msgid "Python 2.7 is required"
+msgstr ""
+
+#: app/views/project.html:2
+msgid "Read only"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:256
+msgid "Remote host {{name}} not connected"
+msgstr ""
+
+#: app/views/menu.html:124
+msgid "Remote hostname"
+msgstr ""
+
+#: app/views/menu.html:219
+msgid "Remove"
+msgstr ""
+
+#: app/views/menu.html:109
+msgid "Remove selected"
+msgstr ""
+
+#: app/views/menu.html:224
+msgid "Reset default"
+msgstr ""
+
+#: app/views/menu.html:102
+msgid "Reset view"
+msgstr ""
+
+#: app/views/menu.html:65
+msgid "Save"
+msgstr ""
+
+#: app/views/menu.html:68
+msgid "Save as"
+msgstr ""
+
+#: app/views/menu.html:263
+msgid "Source code"
+msgstr ""
+
+#: app/views/menu.html:140
+msgid "Spanish"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:178
+msgid "Synchronize remote files ..."
+msgstr ""
+
+#: app/views/menu.html:49
+msgid "Templates"
+msgstr ""
+
+#: app/views/menu.html:88
+msgid "Testbench"
+msgstr ""
+
+#: app/scripts/services/common.service.js:124
+msgid "Testbench exported"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:403
+msgid "The current FPGA I/O configuration will be lost. Do you want to change to {{name}} board?"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:117
+#: app/scripts/controllers/menu.js:94
+msgid "The current project will be removed. Do you want to continue loading the project?"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:311
+msgid "The toolchain will be removed. Do you want to continue?"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:299
+msgid "The toolchain will be restored to default. Do you want to continue?"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:291
+msgid "The toolchain will be updated. This operation requires Internet connection. Do you want to continue?"
+msgstr ""
+
+#: app/views/menu.html:210
+msgid "Toolchain"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:493
+msgid "Toolchain installed"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:497
+msgid "Toolchain not installed"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:79
+#: app/scripts/services/utils.service.js:486
+#: app/scripts/services/utils.service.js:502
+msgid "Toolchain not installed. Please, install the toolchain"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:315
+msgid "Toolchain removed"
+msgstr ""
+
+#: app/views/menu.html:197
+msgid "Tools"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:221
+msgid "Unknown board"
+msgstr ""
+
+#: app/views/menu.html:206
+msgid "Upload"
+msgstr ""
+
+#: app/views/menu.html:200
+msgid "Verify"
+msgstr ""
+
+#: app/scripts/services/common.service.js:104
+msgid "Verilog code exported"
+msgstr ""
+
+#: app/views/menu.html:256
+msgid "Version"
+msgstr ""
+
+#: app/views/menu.html:170
+msgid "View"
+msgstr ""
+
+#: app/views/menu.html:253
+msgid "View license"
+msgstr ""
+
+#: app/scripts/services/graph.service.js:561
+msgid "Wrong block format: {{type}}"
+msgstr ""
+
+#: app/scripts/services/common.service.js:54
+msgid "Wrong project format: {{name}}"
+msgstr ""
+
+#: app/scripts/services/tools.service.js:253
+msgid "Wrong remote hostname {{name}}"
+msgstr ""
+
+#. And
+#: app/resources/blocks/labels.js:34
+msgid "and"
+msgstr ""
+
+#. Bit
+#: app/resources/blocks/labels.js:4
+msgid "bit"
+msgstr ""
+
+#. Comb
+#: app/resources/blocks/labels.js:16
+msgid "comb"
+msgstr ""
+
+#. Config
+#: app/resources/blocks/labels.js:6
+msgid "config"
+msgstr ""
+
+#. Demux 1:2
+#: app/resources/blocks/labels.js:18
+msgid "demux_1_2"
+msgstr ""
+
+#. Demux 1:4
+#: app/resources/blocks/labels.js:20
+msgid "demux_1_4"
+msgstr ""
+
+#. Demux 1:8
+#: app/resources/blocks/labels.js:22
+msgid "demux_1_8"
+msgstr ""
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:50
+msgid "dff_ar"
+msgstr ""
+
+#. D flip-flop async
+#: app/resources/blocks/labels.js:52
+msgid "dff_sr"
+msgstr ""
+
+#. Build done
+#: app/scripts/services/tools.service.js:268
+msgid "done_build"
+msgstr ""
+
+#. Upload done
+#: app/scripts/services/tools.service.js:270
+msgid "done_upload"
+msgstr ""
+
+#. Verification done
+#: app/scripts/services/tools.service.js:266
+msgid "done_verify"
+msgstr ""
+
+#. Gate
+#: app/resources/blocks/labels.js:32
+msgid "gate"
+msgstr ""
+
+#. Hex 7 Segment CA
+#: app/resources/blocks/labels.js:26
+msgid "hex_7seg_ca"
+msgstr ""
+
+#. Hex 7 Segment CC
+#: app/resources/blocks/labels.js:24
+msgid "hex_7seg_cc"
+msgstr ""
+
+#. Logic
+#: app/resources/blocks/labels.js:14
+msgid "logic"
+msgstr ""
+
+#. Mux 2:1
+#: app/resources/blocks/labels.js:28
+msgid "mux_2_1"
+msgstr ""
+
+#. Mux 4:1
+#: app/resources/blocks/labels.js:30
+msgid "mux_4_1"
+msgstr ""
+
+#. Nand
+#: app/resources/blocks/labels.js:36
+msgid "nand"
+msgstr ""
+
+#. Nor
+#: app/resources/blocks/labels.js:38
+msgid "nor"
+msgstr ""
+
+#. Not
+#: app/resources/blocks/labels.js:40
+msgid "not"
+msgstr ""
+
+#. Or
+#: app/resources/blocks/labels.js:42
+msgid "or"
+msgstr ""
+
+#. Pull up
+#: app/resources/blocks/labels.js:8
+msgid "pull_up"
+msgstr ""
+
+#. Pull up inv
+#: app/resources/blocks/labels.js:10
+msgid "pull_up_inv"
+msgstr ""
+
+#. Sec
+#: app/resources/blocks/labels.js:48
+msgid "sec"
+msgstr ""
+
+#. Start building ...
+#: app/scripts/services/tools.service.js:45
+msgid "start_build"
+msgstr ""
+
+#. Start uploading ...
+#: app/scripts/services/tools.service.js:47
+msgid "start_upload"
+msgstr ""
+
+#. Start verification ...
+#: app/scripts/services/tools.service.js:43
+msgid "start_verify"
+msgstr ""
+
+#. T flip-flop async
+#: app/resources/blocks/labels.js:54
+msgid "tff_ar"
+msgstr ""
+
+#. T flip-flop
+#: app/resources/blocks/labels.js:56
+msgid "tff_sr"
+msgstr ""
+
+#. Tri-state
+#: app/resources/blocks/labels.js:12
+msgid "tri_state"
+msgstr ""
+
+#: app/scripts/controllers/menu.js:73
+msgid "untitled"
+msgstr ""
+
+#. Xnor
+#: app/resources/blocks/labels.js:44
+msgid "xnor"
+msgstr ""
+
+#. Xor
+#: app/resources/blocks/labels.js:46
+msgid "xor"
+msgstr ""
diff --git a/app/scripts/app.js b/app/scripts/app.js
index a748c4c7b..64234f1f6 100644
--- a/app/scripts/app.js
+++ b/app/scripts/app.js
@@ -3,10 +3,10 @@
angular
.module('icestudio', [
'ngRoute',
- 'pascalprecht.translate',
- 'ui.bootstrap'
- ]).config(['$routeProvider', '$translateProvider',
- function($routeProvider, $translateProvider) {
+ 'ui.bootstrap',
+ 'gettext'
+ ]).config(['$routeProvider',
+ function($routeProvider) {
$routeProvider
.when('/', {
@@ -16,17 +16,8 @@ angular
.otherwise({
redirectTo: '/'
});
- $translateProvider.useStaticFilesLoader({
- prefix: 'resources/locale/',
- suffix: '.json'
- });
-
- // Initial language
- $translateProvider.preferredLanguage('en');
- //$translateProvider.useSanitizeValueStrategy('escape');
}
])
- .run(function(nodeFs) {
- // console.log('Start');
+ .run(function() {
});
diff --git a/app/scripts/controllers/menu.js b/app/scripts/controllers/menu.js
index e03fae639..2e330bfe7 100644
--- a/app/scripts/controllers/menu.js
+++ b/app/scripts/controllers/menu.js
@@ -3,7 +3,7 @@
angular.module('icestudio')
.controller('MenuCtrl', function ($scope,
$timeout,
- $translate,
+ gettextCatalog,
common,
graph,
tools,
@@ -17,7 +17,9 @@ angular.module('icestudio')
// Manage language
profile.load(function() {
- $translate.use(profile.data.language);
+ var lang = profile.data.language;
+ gettextCatalog.setCurrentLanguage(lang);
+ gettextCatalog.loadRemote('resources/locale/' + lang + '/' + lang + '.json');
});
var win = gui.Window.get();
win.on('close', function() {
@@ -67,8 +69,8 @@ angular.module('icestudio')
// File
$scope.newProject = function() {
- alertify.prompt($translate.instant('enter_project_title'),
- $translate.instant('untitled'),
+ alertify.prompt(gettextCatalog.getString('Enter the project\'s title'),
+ gettextCatalog.getString('untitled'),
function(evt, name) {
if (name) {
common.newProject(name);
@@ -89,7 +91,7 @@ angular.module('icestudio')
$scope.workingdir = utils.dirname(file.path) + utils.sep;
if (!graph.isEmpty()) {
- alertify.confirm($translate.instant('load_project_confirmation'),
+ alertify.confirm(gettextCatalog.getString('The current project will be removed. Do you want to continue loading the project?'),
function() {
common.openProject(file.path);
$scope.currentProjectPath = file.path;
@@ -112,7 +114,7 @@ angular.module('icestudio')
$scope.openStoredProject = function(name, project) {
if (project) {
if (!graph.isEmpty()) {
- alertify.confirm($translate.instant('load_project_confirmation'),
+ alertify.confirm(gettextCatalog.getString('The current project will be removed. Do you want to continue loading the project?'),
function() {
common.loadProject(name, project);
$scope.currentProjectPath = '';
@@ -285,7 +287,7 @@ angular.module('icestudio')
$scope.setImagePath = function() {
var current = common.project.image;
- alertify.prompt($translate.instant('enter_project_image_path'), (current) ? current : '',
+ alertify.prompt(gettextCatalog.getString('Enter the project\'s image path'), (current) ? current : '',
function(evt, imagePath) {
common.setImagePath(imagePath);
});
@@ -293,7 +295,7 @@ angular.module('icestudio')
$scope.setRemoteHostname = function() {
var current = profile.data.remoteHostname;
- alertify.prompt($translate.instant('enter_remote_hostname'), (current) ? current : '',
+ alertify.prompt(gettextCatalog.getString('Enter the remote hostname user@host (experimental)'), (current) ? current : '',
function(evt, remoteHostname) {
profile.data.remoteHostname = remoteHostname;
});
@@ -302,13 +304,14 @@ angular.module('icestudio')
$scope.selectLanguage = function(language) {
if (profile.data.language != language) {
profile.data.language = language;
- $translate.use(language);
+ gettextCatalog.setCurrentLanguage(language);
+ gettextCatalog.loadRemote('resources/locale/' + language + '/' + language + '.json');
}
}
$scope.clearGraph = function() {
if (!graph.isEmpty()) {
- alertify.confirm($translate.instant('clear_all_confirmation'),
+ alertify.confirm(gettextCatalog.getString('Do you want to clear all?'),
function() {
common.clearProject();
});
@@ -321,7 +324,7 @@ angular.module('icestudio')
$scope.removeSelected = function() {
if (graph.hasSelection()) {
- alertify.confirm($translate.instant('remove_block_confirmation'),
+ alertify.confirm(gettextCatalog.getString('Do you want to remove the selected block?'),
function() {
common.removeSelected();
});
@@ -388,7 +391,7 @@ angular.module('icestudio')
gui.Shell.openExternal(boards.selectedBoard.info.datasheet);
}
else {
- alertify.error($translate.instant('datasheet_not_defined'));
+ alertify.error(gettextCatalog.getString('Datasheet not defined'));
}
}
@@ -397,17 +400,17 @@ angular.module('icestudio')
$scope.selectBoard = function(board) {
if (boards.selectedBoard.name != board.name) {
if (!graph.isEmpty()) {
- alertify.confirm($translate.instant('change_board_confirmation', { name: '' + board.info.label + '' }),
+ alertify.confirm(gettextCatalog.getString('The current FPGA I/O configuration will be lost. Do you want to change to {{name}} board?', { name: '' + board.info.label + '' }),
function() {
boards.selectBoard(board.name);
graph.resetIOChoices();
- alertify.success($translate.instant('board_selected', { name: '' + board.info.label + '' }));
+ alertify.success(gettextCatalog.getString('Board {{name}} selected', { name: '' + board.info.label + '' }));
});
}
else {
boards.selectBoard(board.name);
graph.resetIOChoices();
- alertify.success($translate.instant('board_selected', { name: '' + board.info.label + '' }));
+ alertify.success(gettextCatalog.getString('Board {{name}} selected', { name: '' + board.info.label + '' }));
}
}
}
diff --git a/app/scripts/services/common.service.js b/app/scripts/services/common.service.js
index c90db217c..37cf103b3 100644
--- a/app/scripts/services/common.service.js
+++ b/app/scripts/services/common.service.js
@@ -1,8 +1,8 @@
'use strict';
angular.module('icestudio')
- .service('common', ['$rootScope', '$translate', 'window', 'graph', 'boards', 'compiler', 'utils',
- function($rootScope, $translate, window, graph, boards, compiler, utils) {
+ .service('common', ['$rootScope', 'gettextCatalog', 'window', 'graph', 'boards', 'compiler', 'utils',
+ function($rootScope, gettextCatalog, window, graph, boards, compiler, utils) {
// Variables
@@ -28,7 +28,7 @@ angular.module('icestudio')
graph.clearAll();
graph.setState(this.project.state);
this.updateProjectName(name);
- alertify.success($translate.instant('project_created', { name: name }));
+ alertify.success(gettextCatalog.getString('New project {{name}} created', { name: name }));
};
this.openProject = function(filepath) {
@@ -48,10 +48,10 @@ angular.module('icestudio')
this.project = project;
boards.selectBoard(project.board);
if (graph.loadGraph(project)) {
- alertify.success($translate.instant('project_loaded', { name: name }));
+ alertify.success(gettextCatalog.getString('Project {{name}} loaded', { name: name }));
}
else {
- alertify.error($translate.instant('wrong_project_format', { name: name }));
+ alertify.error(gettextCatalog.getString('Wrong project format: {{name}}', { name: name }));
}
};
@@ -60,7 +60,7 @@ angular.module('icestudio')
this.updateProjectName(name);
this.refreshProject();
utils.saveFile(filepath, this.project, function() {
- alertify.success($translate.instant('project_saved', { name: name }));
+ alertify.success(gettextCatalog.getString('Project {{name}} saved', { name: name }));
}, true);
};
@@ -72,7 +72,7 @@ angular.module('icestudio')
var name = utils.basename(filepath);
graph.importBlock(name, block);
_this.project.deps[name] = block;
- alertify.success($translate.instant('block_imported', { name: name }));
+ alertify.success(gettextCatalog.getString('Block {{name}} imported', { name: name }));
}
};
})(this));
@@ -91,7 +91,7 @@ angular.module('icestudio')
}
}
utils.saveFile(filepath, block, function() {
- alertify.success($translate.instant('block_exported_as', { name: name }));
+ alertify.success(gettextCatalog.getString('Block exported as {{name}}', { name: name }));
}, true);
};
@@ -101,7 +101,7 @@ angular.module('icestudio')
// Generate verilog code from project
var verilog = compiler.generateVerilog(this.project);
utils.saveFile(filepath, verilog, function() {
- alertify.success($translate.instant('verilog_exported'));
+ alertify.success(gettextCatalog.getString('Verilog code exported'));
}, false);
};
@@ -111,7 +111,7 @@ angular.module('icestudio')
// Generate pcf code from project
var pcf = compiler.generatePCF(this.project);
utils.saveFile(filepath, pcf, function() {
- alertify.success($translate.instant('pcf_exported'));
+ alertify.success(gettextCatalog.getString('PCF file exported'));
}, false);
};
@@ -121,7 +121,7 @@ angular.module('icestudio')
// Generate testbench code from project
var testbench = compiler.generateTestbench(this.project);
utils.saveFile(filepath, testbench, function() {
- alertify.success($translate.instant('testbench_exported'));
+ alertify.success(gettextCatalog.getString('Testbench exported'));
}, false);
};
@@ -131,7 +131,7 @@ angular.module('icestudio')
// Generate gtkwave code from project
var gtkwave = compiler.generateGTKWave(this.project);
utils.saveFile(filepath, gtkwave, function() {
- alertify.success($translate.instant('gtkwave_exported'));
+ alertify.success(gettextCatalog.getString('GTKWave exported'));
}, false);
};
diff --git a/app/scripts/services/graph.service.js b/app/scripts/services/graph.service.js
index 10a2af712..f0f240966 100644
--- a/app/scripts/services/graph.service.js
+++ b/app/scripts/services/graph.service.js
@@ -1,8 +1,8 @@
'use strict';
angular.module('icestudio')
- .service('graph', ['$rootScope', '$translate', 'nodeFs', 'joint', 'boards', 'nodeSha1',
- function($rootScope, $translate, nodeFs, joint, boards, nodeSha1) {
+ .service('graph', ['$rootScope', 'gettextCatalog', 'nodeFs', 'joint', 'boards', 'nodeSha1',
+ function($rootScope, gettextCatalog, nodeFs, joint, boards, nodeSha1) {
// Variables
@@ -254,11 +254,11 @@ angular.module('icestudio')
if (data.blockType == 'basic.input' ||
data.blockType == 'basic.output') {
if (paper.options.enabled) {
- alertify.prompt($translate.instant('enter_block_label'), data.data.label,
+ alertify.prompt(gettextCatalog.getString('Enter the block\'s label'), data.data.label,
function(evt, label) {
data.data.label = label;
cellView.renderLabel();
- alertify.success($translate.instant('label_updated'));
+ alertify.success(gettextCatalog.getString('Label updated'));
});
}
}
@@ -406,7 +406,7 @@ angular.module('icestudio')
};
if (type == 'basic.code') {
- alertify.prompt($translate.instant('enter_block_ports'), 'a,b c',
+ alertify.prompt(gettextCatalog.getString('Enter the block\'s ports'), 'a,b c',
function(evt, ports) {
if (ports) {
blockInstance.data = {
@@ -461,7 +461,7 @@ angular.module('icestudio')
}
}
else if (type == 'basic.input') {
- alertify.prompt($translate.instant('enter_block_label'), 'i',
+ alertify.prompt(gettextCatalog.getString('Enter the block\'s label'), 'i',
function(evt, name) {
if (name) {
var names = name.split(' ');
@@ -501,7 +501,7 @@ angular.module('icestudio')
});
}
else if (type == 'basic.output') {
- alertify.prompt($translate.instant('enter_block_label'), 'o',
+ alertify.prompt(gettextCatalog.getString('Enter the block\'s label'), 'o',
function(evt, name) {
if (name) {
var names = name.split(' ');
@@ -558,7 +558,7 @@ angular.module('icestudio')
}
}
else {
- alertify.error($translate.instant('wrong_block_format', { type: type }));
+ alertify.error(gettextCatalog.getString('Wrong block format: {{type}}', { type: type }));
}
}
};
diff --git a/app/scripts/services/tools.service.js b/app/scripts/services/tools.service.js
index 00add871c..5a77b1388 100644
--- a/app/scripts/services/tools.service.js
+++ b/app/scripts/services/tools.service.js
@@ -1,8 +1,8 @@
'use strict';
angular.module('icestudio')
- .service('tools', ['$translate', 'profile', 'nodeFs', 'nodeFse', 'nodeOs', 'nodePath', 'nodeProcess', 'nodeChildProcess', 'nodeSSHexec', 'nodeRSync', 'common', 'boards', 'compiler', 'utils',
- function($translate, profile, nodeFs, nodeFse, nodeOs, nodePath, nodeProcess, nodeChildProcess, nodeSSHexec, nodeRSync, common, boards, compiler, utils) {
+ .service('tools', ['gettextCatalog', 'gettext', 'profile', 'nodeFs', 'nodeFse', 'nodeOs', 'nodePath', 'nodeProcess', 'nodeChildProcess', 'nodeSSHexec', 'nodeRSync', 'common', 'boards', 'compiler', 'utils',
+ function(gettextCatalog, gettext, profile, nodeFs, nodeFse, nodeOs, nodePath, nodeProcess, nodeChildProcess, nodeSSHexec, nodeRSync, common, boards, compiler, utils) {
var currentAlert = null;
var toolchain = { apio: '-', installed: false, disabled: false };
@@ -38,7 +38,15 @@ angular.module('icestudio')
if (code) {
if (toolchain.installed || toolchain.disabled) {
angular.element('#menu').addClass('disable-menu');
- currentAlert = alertify.notify($translate.instant('start_' + commands[0]), 'message', 100000);
+ // Annotate strings for translation
+ /// Start verification ...
+ gettext('start_verify');
+ /// Start building ...
+ gettext('start_build');
+ /// Start uploading ...
+ gettext('start_upload');
+ var message = 'start_' + commands[0];
+ currentAlert = alertify.notify(gettextCatalog.getString(message), 'message', 100000);
$('body').addClass('waiting');
nodeProcess.chdir(this.buildPath);
check = this.syncResources(code);
@@ -68,7 +76,7 @@ angular.module('icestudio')
}
}
else {
- alertify.notify($translate.instant('toolchain_not_installed'), 'error', 5);
+ alertify.notify(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 'error', 5);
}
}
}
@@ -144,13 +152,13 @@ angular.module('icestudio')
}
else {
// Error: file does not exist
- alertify.notify($translate.instant('file_does_not_exist', { file: file }), 'error', 3);
+ alertify.notify(gettextCatalog.getString('File {{file}} does not exist', { file: file }), 'error', 3);
ret = false;
break;
}
}
catch (e) {
- alertify.notify($translate.instant('generic_error', { error: e.toString() }), 'error', 3);
+ alertify.notify(gettextCatalog.getString('Error: {{error}}', { error: e.toString() }), 'error', 3);
ret = false;
break;
}
@@ -167,7 +175,7 @@ angular.module('icestudio')
var remoteHostname = profile.data.remoteHostname;
if (remoteHostname) {
- currentAlert.setContent($translate.instant('sync_remote_files'));
+ currentAlert.setContent(gettextCatalog.getString('Synchronize remote files ...'));
nodeRSync({
src: nodeProcess.cwd() + '/',
dest: remoteHostname + ':' + this.buildPath + '/',
@@ -178,7 +186,7 @@ angular.module('icestudio')
exclude: ['.sconsign.dblite', '*.out', '*.blif', '*.asc', '*.bin']
}, function (error, stdout, stderr, cmd) {
if (!error) {
- currentAlert.setContent($translate.instant('execute_remote', { label: label }));
+ currentAlert.setContent(gettextCatalog.getString('Execute remote {{label}} ...', { label: label }));
nodeSSHexec('cd ' + this.buildPath + '; ' + (['apio'].concat(commands)).join(' '), remoteHostname,
function (error, stdout, stderr) {
processExecute(label, callback, error, stdout, stderr);
@@ -207,19 +215,19 @@ angular.module('icestudio')
if (stdout) {
if (stdout.indexOf('[upload] Error') != -1 ||
stdout.indexOf('Error: board not detected') != -1) {
- alertify.notify($translate.instant('board_not_detected', { name: '' + boards.selectedBoard.info.label + '' }), 'error', 3);
+ alertify.notify(gettextCatalog.getString('Board {{name}} not detected', { name: '' + boards.selectedBoard.info.label + '' }), 'error', 3);
}
else if (stdout.indexOf('Error: unkown board') != -1) {
- alertify.notify($translate.instant('unknown_board'), 'error', 3);
+ alertify.notify(gettextCatalog.getString('Unknown board'), 'error', 3);
}
else if (stdout.indexOf('set_io: too few arguments') != -1) {
- alertify.notify($translate.instant('fpga_io_not_defined'), 'error', 3);
+ alertify.notify(gettextCatalog.getString('FPGA I/O ports not defined'), 'error', 3);
}
else if (stdout.indexOf('error: unknown pin') != -1) {
- alertify.notify($translate.instant('fpga_io_not_defined'), 'error', 3);
+ alertify.notify(gettextCatalog.getString('FPGA I/O ports not defined'), 'error', 3);
}
else if (stdout.indexOf('error: duplicate pin constraints') != -1) {
- alertify.notify($translate.instant('duplicated_fpga_io'), 'error', 3);
+ alertify.notify(gettextCatalog.getString('Duplicated FPGA I/O ports'), 'error', 3);
}
else {
var stdoutError = stdout.split('\n').filter(isError);
@@ -242,10 +250,10 @@ angular.module('icestudio')
else if (stderr) {
if (stderr.indexOf('Could not resolve hostname') != -1 ||
stderr.indexOf('Connection refused') != -1) {
- alertify.notify($translate.instant('wrong_remote_hostname', { name: profile.data.remoteHostname }), 'error', 3);
+ alertify.notify(gettextCatalog.getString('Wrong remote hostname {{name}}', { name: profile.data.remoteHostname }), 'error', 3);
}
else if (stderr.indexOf('No route to host') != -1) {
- alertify.notify($translate.instant('remote_host_not_connected', { name: profile.data.remoteHostname }), 'error', 3);
+ alertify.notify(gettextCatalog.getString('Remote host {{name}} not connected', { name: profile.data.remoteHostname }), 'error', 3);
}
else {
alertify.notify(stderr, 'error', 5);
@@ -253,7 +261,15 @@ angular.module('icestudio')
}
}
else {
- alertify.success($translate.instant('done_' + label));
+ // 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));
}
$('body').removeClass('waiting');
}
@@ -264,7 +280,7 @@ angular.module('icestudio')
installDefaultToolchain();
}
else {
- alertify.confirm('Default toolchain not found. Toolchain will be downloaded. This operation requires Internet connection. Do you want to continue?',
+ alertify.confirm(gettextCatalog.getString('Default toolchain not found. Toolchain will be downloaded. This operation requires Internet connection. Do you want to continue?'),
function() {
installOnlineToolchain();
});
@@ -272,7 +288,7 @@ angular.module('icestudio')
}
this.updateToolchain = function() {
- alertify.confirm('The toolchain will be updated. This operation requires Internet connection. Do you want to continue?',
+ alertify.confirm(gettextCatalog.getString('The toolchain will be updated. This operation requires Internet connection. Do you want to continue?'),
function() {
installOnlineToolchain();
});
@@ -280,23 +296,23 @@ angular.module('icestudio')
this.resetToolchain = function() {
if (utils.checkDefaultToolchain()) {
- alertify.confirm('The toolchain will be restored to default. Do you want to continue?',
+ alertify.confirm(gettextCatalog.getString('The toolchain will be restored to default. Do you want to continue?'),
function() {
utils.removeToolchain();
installDefaultToolchain();
});
}
else {
- alertify.alert('Error: default toolchain not found in \'' + utils.TOOLCHAIN_DIR + '\'');
+ alertify.alert(gettextCatalog.getString('Error: default toolchain not found in \'{{dir}}\'', { dir: utils.TOOLCHAIN_DIR}));
}
}
this.removeToolchain = function() {
- alertify.confirm($translate.instant('remove_toolchain_confirmation'),
+ alertify.confirm(gettextCatalog.getString('The toolchain will be removed. Do you want to continue?'),
function() {
utils.removeToolchain();
toolchain.installed = false;
- alertify.success($translate.instant('toolchain_removed'));
+ alertify.success(gettextCatalog.getString('Toolchain removed'));
});
}
@@ -316,7 +332,7 @@ angular.module('icestudio')
var content = [
'',
- '
' + $translate.instant('installing_toolchain') + '
',
+ '
' + gettextCatalog.getString('Installing toolchain') + '
',
' ',
'
',
'
',
- '
' + $translate.instant('installing_toolchain') + '
',
+ '
' + gettextCatalog.getString('Installing toolchain') + '
',
' ',
'
',
'
-1);
const DARWIN = Boolean(process.platform.indexOf('darwin') > -1);
@@ -405,13 +405,13 @@ angular.module('icestudio')
endLazyProcess();
if (!error) {
if (enable) {
- alertify.success($translate.instant('drivers_enabled'));
+ alertify.success(gettextCatalog.getString('Drivers enabled'));
}
else {
- alertify.warning($translate.instant('drivers_disabled'));
+ alertify.warning(gettextCatalog.getString('Drivers disabled'));
}
setTimeout(function() {
- alertify.notify($translate.instant('unplug_and_reconnect'), 'message', 5);
+ alertify.notify(gettextCatalog.getString('
Unplug and
reconnect the board'), 'message', 5);
}, 1000);
}
});
@@ -442,17 +442,17 @@ angular.module('icestudio')
if (error) {
if ((stderr.indexOf('brew: command not found') != -1) ||
(stderr.indexOf('brew: No such file or directory') != -1)) {
- alertify.notify($translate.instant('homebrew_required'), 'error', 5);
+ alertify.notify(gettextCatalog.getString('Homebrew is required'), 'error', 5);
}
else if (stderr.indexOf('Error: Failed to download') != -1) {
- alertify.notify($translate.instant('internet_connection_required'), 'error', 5);
+ alertify.notify(gettextCatalog.getString('Internet connection required'), 'error', 5);
}
else {
alertify.notify(stderr, 'error', 5);
}
}
else {
- alertify.success($translate.instant('drivers_enabled'));
+ alertify.success(gettextCatalog.getString('Drivers enabled'));
}
});
}
@@ -471,35 +471,35 @@ angular.module('icestudio')
// console.log(error, stdout, stderr);
endLazyProcess();
if (!error) {
- alertify.warning($translate.instant('drivers_disabled'));
+ alertify.warning(gettextCatalog.getString('Drivers disabled'));
}
});
}
function enableWindowsDrivers() {
- alertify.confirm($translate.instant('install_drivers_windows'), function() {
+ alertify.confirm(gettextCatalog.getString('
FTDI driver installation instructions
- Connect the FPGA board
- Replace the (Interface 0) driver of the board by libusbK
- Unplug and reconnect the board
'), function() {
beginLazyProcess();
nodeChildProcess.exec([APIO_CMD, 'drivers', '--enable'].join(' '), function(error, stdout, stderr) {
// console.log(error, stdout, stderr);
endLazyProcess();
if (stderr) {
- alertify.notify($translate.instant('toolchain_not_installed'), 'error', 5);
+ alertify.notify(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 'error', 5);
}
if (!error) {
- alertify.notify($translate.instant('unplug_and_reconnect'), 'message', 5);
+ alertify.notify(gettextCatalog.getString('
Unplug and
reconnect the board'), 'message', 5);
}
});
});
}
function disableWindowsDrivers() {
- alertify.confirm($translate.instant('uninstall_drivers_windows'), function() {
+ alertify.confirm(gettextCatalog.getString('
FTDI driver uninstallation instructions
- Find the FPGA USB Device
- Select the board interface and uninstall the driver
'), function() {
beginLazyProcess();
nodeChildProcess.exec([APIO_CMD, 'drivers', '--disable'].join(' '), function(error, stdout, stderr) {
// console.log(error, stdout, stderr);
endLazyProcess();
if (stderr) {
- alertify.notify($translate.instant('toolchain_not_installed'), 'error', 5);
+ alertify.notify(gettextCatalog.getString('Toolchain not installed. Please, install the toolchain'), 'error', 5);
}
});
});
diff --git a/app/views/menu.html b/app/views/menu.html
index f67671f1f..01004c0b0 100644
--- a/app/views/menu.html
+++ b/app/views/menu.html
@@ -20,16 +20,16 @@