diff --git a/web_translate_dialog/__init__.py b/web_translate_dialog/__init__.py
new file mode 100644
index 00000000..40a96afc
--- /dev/null
+++ b/web_translate_dialog/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
diff --git a/web_translate_dialog/__openerp__.py b/web_translate_dialog/__openerp__.py
new file mode 100644
index 00000000..27e2483a
--- /dev/null
+++ b/web_translate_dialog/__openerp__.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Author: Guewen Baconnier
+# Copyright 2012 Camptocamp SA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+{"name": "Web Translate Dialog",
+ "category": "Hidden",
+ "description": """
+Replace the standard translation view by an alternative one:
+
+ * Add a "Translate" button item in the "More" menu
+ * The translations are displayed in a dialog (much like the OpenERP
+ 6.1's one)
+ * Support HTML fields
+ * Autosize the textareas to the size of the content
+
+""",
+ "version": "1.0",
+ "depends": ['web'],
+ 'data': ['view/web_translate.xml'],
+ 'qweb': ["static/src/xml/base.xml"],
+ 'auto_install': False,
+ 'installable': True,
+ }
diff --git a/web_translate_dialog/i18n/es.po b/web_translate_dialog/i18n/es.po
new file mode 100644
index 00000000..d1af454b
--- /dev/null
+++ b/web_translate_dialog/i18n/es.po
@@ -0,0 +1,37 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-12-09 07:15+0000\n"
+"PO-Revision-Date: 2014-03-07 15:45+0000\n"
+"Last-Translator: Pedro Manuel Baeza \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-06-28 06:02+0000\n"
+"X-Generator: Launchpad (build 17077)\n"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:15
+#, python-format
+msgid "Translate"
+msgstr "Traducir"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:37
+#, python-format
+msgid "Translations"
+msgstr "Traducciones"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/xml/base.xml:7
+#, python-format
+msgid "Field"
+msgstr "Campo"
diff --git a/web_translate_dialog/i18n/fr.po b/web_translate_dialog/i18n/fr.po
new file mode 100644
index 00000000..57ea09a4
--- /dev/null
+++ b/web_translate_dialog/i18n/fr.po
@@ -0,0 +1,37 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-12-09 07:15+0000\n"
+"PO-Revision-Date: 2014-03-07 15:45+0000\n"
+"Last-Translator: Guewen Baconnier @ Camptocamp \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-06-28 06:02+0000\n"
+"X-Generator: Launchpad (build 17077)\n"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:15
+#, python-format
+msgid "Translate"
+msgstr "Traduire"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:37
+#, python-format
+msgid "Translations"
+msgstr "Traductions"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/xml/base.xml:7
+#, python-format
+msgid "Field"
+msgstr "Champ"
diff --git a/web_translate_dialog/i18n/nl.po b/web_translate_dialog/i18n/nl.po
new file mode 100644
index 00000000..90749f99
--- /dev/null
+++ b/web_translate_dialog/i18n/nl.po
@@ -0,0 +1,39 @@
+# Dutch translation for web-addons
+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
+# This file is distributed under the same license as the web-addons package.
+# FIRST AUTHOR , 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: web-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2013-12-09 07:15+0000\n"
+"PO-Revision-Date: 2014-03-10 10:09+0000\n"
+"Last-Translator: Erwin van der Ploeg (BAS Solutions) \n"
+"Language-Team: Dutch \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-06-28 06:02+0000\n"
+"X-Generator: Launchpad (build 17077)\n"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:15
+#, python-format
+msgid "Translate"
+msgstr "Vertalen"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:37
+#, python-format
+msgid "Translations"
+msgstr "Vertalingen"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/xml/base.xml:7
+#, python-format
+msgid "Field"
+msgstr "Veld"
diff --git a/web_translate_dialog/i18n/tr.po b/web_translate_dialog/i18n/tr.po
new file mode 100644
index 00000000..f57ec97f
--- /dev/null
+++ b/web_translate_dialog/i18n/tr.po
@@ -0,0 +1,39 @@
+# Turkish translation for web-addons
+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
+# This file is distributed under the same license as the web-addons package.
+# FIRST AUTHOR , 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: web-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2013-12-09 07:15+0000\n"
+"PO-Revision-Date: 2014-03-07 22:08+0000\n"
+"Last-Translator: Ediz Duman \n"
+"Language-Team: Turkish
\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2014-06-28 06:02+0000\n"
+"X-Generator: Launchpad (build 17077)\n"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:15
+#, python-format
+msgid "Translate"
+msgstr "Çeviri"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:37
+#, python-format
+msgid "Translations"
+msgstr "daha çevrilmedi"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/xml/base.xml:7
+#, python-format
+msgid "Field"
+msgstr "Alan"
diff --git a/web_translate_dialog/i18n/web_translate_dialog.pot b/web_translate_dialog/i18n/web_translate_dialog.pot
new file mode 100644
index 00000000..0a0e3d03
--- /dev/null
+++ b/web_translate_dialog/i18n/web_translate_dialog.pot
@@ -0,0 +1,36 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 7.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-12-09 07:15+0000\n"
+"PO-Revision-Date: 2013-12-09 07:15+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:15
+#, python-format
+msgid "Translate"
+msgstr ""
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/js/web_translate_dialog.js:37
+#, python-format
+msgid "Translations"
+msgstr ""
+
+#. module: web_translate_dialog
+#. openerp-web
+#: code:addons/web_translate_dialog/static/src/xml/base.xml:7
+#, python-format
+msgid "Field"
+msgstr ""
diff --git a/web_translate_dialog/static/src/css/base.css b/web_translate_dialog/static/src/css/base.css
new file mode 100644
index 00000000..8f884849
--- /dev/null
+++ b/web_translate_dialog/static/src/css/base.css
@@ -0,0 +1,6 @@
+.openerp .oe_translation_field {
+ width: 95%;
+}
+.openerp .oe_translation_field.touched {
+ border: 1px solid green !important;
+}
diff --git a/web_translate_dialog/static/src/js/web_translate_dialog.js b/web_translate_dialog/static/src/js/web_translate_dialog.js
new file mode 100644
index 00000000..89c284c1
--- /dev/null
+++ b/web_translate_dialog/static/src/js/web_translate_dialog.js
@@ -0,0 +1,209 @@
+openerp.web_translate_dialog = function (instance) {
+
+ "use strict";
+
+ var QWeb = instance.web.qweb,
+ _t = instance.web._t,
+ _lt = instance.web._lt;
+
+ instance.web.FormView.include({
+ load_form: function(data) {
+ var self = this;
+ this._super(data);
+ if (this.sidebar) {
+ this.sidebar.add_items('other', _.compact([
+ self.is_action_enabled('edit') && { label: _t('Translate'), callback: self.on_button_translate },
+ ]));
+ }
+ },
+ on_button_translate: function() {
+ var self = this;
+ $.when(this.has_been_loaded).then(function() {
+ self.open_translate_dialog(this);
+ });
+ },
+ });
+
+ instance.web.View.include({
+ open_translate_dialog: function() {
+ new instance.web_translate_dialog.TranslateDialog(this).open();
+ }
+ });
+
+ instance.web_translate_dialog.TranslateDialog = instance.web.Dialog.extend({
+ template: "TranslateDialog",
+ init: function(parent, options, content) {
+ this._super(parent,
+ {title: _t("Translations"),
+ width: '90%',
+ height: '80%'},
+ content);
+ this.view_language = this.session.user_context.lang;
+ this.view = parent;
+ this.view_type = parent.fields_view.type || '';
+ this.$view_form = null;
+ this.$sidebar_form = null;
+ this.translatable_fields_keys = _.map(this.view.translatable_fields || [], function(i) { return i.name;});
+ this.languages = null;
+ this.languages_loaded = $.Deferred();
+ (new instance.web.DataSetSearch(this,
+ 'res.lang',
+ this.view.dataset.get_context(),
+ [['translatable', '=', '1']]))
+ .read_slice(['code', 'name'], { sort: 'id' })
+ .then(this.on_languages_loaded);
+ },
+ on_languages_loaded: function(langs) {
+ this.languages = langs;
+ this.languages_loaded.resolve();
+ },
+ open: function() {
+ var self = this,
+ sup = this._super;
+ // the template needs the languages
+ $.when(this.languages_loaded).then(function() {
+ return sup.call(self);
+ });
+ },
+ start: function() {
+ var self = this;
+ this.$el.find('.oe_translation_field').change(function() {
+ $(this).toggleClass('touched', ($(this).val() != $(this).attr('data-value')));
+ });
+ this.$buttons.html(QWeb.render("TranslateDialog.buttons"));
+ this.$buttons.find(".oe_form_translate_dialog_save_button").click(function(){
+ self.on_button_save();
+ self.on_button_close();
+ });
+ this.$buttons.find(".oe_form_translate_dialog_cancel_button").click(function(){
+ self.on_button_close();
+ });
+ this.initialize_html_fields();
+
+ this.do_load_fields_values();
+ },
+ initialize_html_fields: function() {
+ this.$el.find('.oe_form_field_html textarea').each(function() {
+ var $textarea = $(this);
+ var width = 100; // forced to fixed size on initialization
+ // will be changed to percentage right after
+ // the creation
+ var height = 250;
+ $textarea.cleditor({
+ width: width, // width not including margins, borders or padding
+ height: height, // height not including margins, borders or padding
+ controls: // controls to add to the toolbar
+ "bold italic underline strikethrough " +
+ "| removeformat | bullets numbering | outdent " +
+ "indent | link unlink | source",
+ bodyStyle: // style to assign to document body contained within the editor
+ "margin:4px; color:#4c4c4c; font-size:13px; font-family:'Lucida Grande',Helvetica,Verdana,Arial,sans-serif; cursor:text"
+ });
+
+ var $cleditor = $textarea.cleditor()[0];
+ // Down to -- end, this is a workaround for the bug
+ // https://bugs.launchpad.net/openerp-web/+bug/1258463
+ // The editor is initially created with a fixed size so
+ // the buggy event is not bound to $(window), then we restore
+ // a percentage width and bind the "normal" event without the
+ // CHM's buggy change.
+ $cleditor.$main.width('95%');
+ $cleditor.options.width = '95%';
+ $(window).resize(function() {
+ //Forcefully blurred iframe contentWindow, chrome, IE, safari doesn't trigger blur on window resize and due to which text disappears
+ var contentWindow = $cleditor.$frame[0].contentWindow;
+ if(!$.browser.mozilla && contentWindow){
+ $(contentWindow).trigger('blur');
+ }
+ });
+ $cleditor.refresh();
+ // -- end
+
+ $cleditor.change(function() {
+ this.updateTextArea();
+ this.$area.toggleClass('touched',
+ (this.$area.val() != this.$area.attr('data-value')));
+ });
+ });
+ },
+ set_fields_values: function(lang, values) {
+ var self = this;
+ _.each(this.translatable_fields_keys, function(f) {
+ self.$el.find('.oe_translation_field[name="' + lang.code + '-' + f + '"]')
+ .val(values[f] || '')
+ .attr('data-value', values[f] || '');
+
+ var $tarea = self.$el.find('.oe_form_field_html .oe_translation_field[name="' + lang.code + '-' + f + '"]');
+ if ($tarea.length) {
+ $tarea.cleditor()[0].updateFrame();
+ }
+ });
+ var $textarea = this.$el.find('textarea.oe_translation_field');
+ $textarea.css({minHeight:'100px'});
+ $textarea.autosize();
+ $(window).resize(); // triggers the autosize
+ },
+ do_load_fields_values: function() {
+ var self = this,
+ deferred = [];
+
+ this.$el.find('.oe_translation_field').val('').removeClass('touched');
+ _.each(self.languages, function(lg) {
+ var deff = $.Deferred();
+ deferred.push(deff);
+ if (lg.code === self.view_language) {
+ var values = {};
+ _.each(self.translatable_fields_keys, function(field) {
+ values[field] = self.view.fields[field].get_value();
+ });
+ self.set_fields_values(lg, values);
+ deff.resolve();
+ } else {
+ self.view.dataset.call(
+ 'read',
+ [[self.view.datarecord.id],
+ self.translatable_fields_keys,
+ self.view.dataset.get_context({
+ 'lang': lg.code
+ })]).done(function (rows) {
+ self.set_fields_values(lg, rows[0]);
+ deff.resolve();
+ });
+ };
+ });
+ return deferred;
+ },
+ on_button_save: function() {
+ var translations = {},
+ self = this,
+ translation_mutex = new $.Mutex();
+ self.$el.find('.oe_translation_field.touched').each(function() {
+ var field = $(this).attr('name').split('-');
+ if (!translations[field[0]]) {
+ translations[field[0]] = {};
+ }
+ translations[field[0]][field[1]] = $(this).val();
+ });
+ _.each(translations, function(data, code) {
+ if (code === self.view_language) {
+ self.view.set_values(data);
+ }
+ translation_mutex.exec(function() {
+ return new instance.web.DataSet(self, self.view.dataset.model, self.view.dataset.get_context()).write(self.view.datarecord.id, data, { context : { 'lang': code }});
+ });
+ });
+ this.close();
+ },
+ on_button_close: function() {
+ this.close();
+ },
+
+ });
+
+ instance.web.form.AbstractField.include({
+ on_translate: function() {
+ // the image next to the fields opens the translate dialog
+ this.view.open_translate_dialog();
+ },
+ });
+};
diff --git a/web_translate_dialog/static/src/xml/base.xml b/web_translate_dialog/static/src/xml/base.xml
new file mode 100644
index 00000000..689586b5
--- /dev/null
+++ b/web_translate_dialog/static/src/xml/base.xml
@@ -0,0 +1,34 @@
+
+
+
+