diff options
| author | Christophe Simonis <chs@odoo.com> | 2019-09-20 17:33:22 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2019-09-20 17:34:45 +0200 |
| commit | 64e43808b79badb5869a8d73cc1cc3f3b3aa8e12 (patch) | |
| tree | 9a22d5f6c03073a4d10faedea8df23a5211e8b8f /addons/web_editor | |
| parent | 944891ced081cda3b8b3db5faf3b7ac23b6b4ce8 (diff) | |
| parent | 58a83d12228fbbd4e9dde542e133d264204ee0f3 (diff) | |
[MERGE] forward port branch saas-12.5 up to 58a83d12228
Diffstat (limited to 'addons/web_editor')
42 files changed, 6508 insertions, 4587 deletions
diff --git a/addons/web_editor/controllers/main.py b/addons/web_editor/controllers/main.py index bc053a743ba..5a7ca5483f7 100644 --- a/addons/web_editor/controllers/main.py +++ b/addons/web_editor/controllers/main.py @@ -97,7 +97,7 @@ class Web_Editor(http.Controller): li = htmlelem.find(".//li[@id='checklist-id-" + str(checklistId) + "']") - if not self._update_checklist_recursive(li, checked, children=True, ancestors=True): + if not li or not self._update_checklist_recursive(li, checked, children=True, ancestors=True): return value value = etree.tostring(htmlelem[0][0], encoding='utf-8', method='html')[5:-6] @@ -143,7 +143,7 @@ class Web_Editor(http.Controller): ul = ul.getparent() for child in ul.getchildren(): - if child.tag == 'li' and 'o_checked' not in child.get('class', ''): + if child.tag == 'li' and 'checklist-id' in child.get('id', '') and 'o_checked' not in child.get('class', ''): allSelected = False node = ul.getprevious() diff --git a/addons/web_editor/i18n/ar.po b/addons/web_editor/i18n/ar.po index f4c3bd70886..7b2ff456401 100644 --- a/addons/web_editor/i18n/ar.po +++ b/addons/web_editor/i18n/ar.po @@ -13,14 +13,15 @@ # Mohammed Ibrahim <m.ibrahim@mussder.com>, 2019 # Osama Ahmaro <osamaahmaro@gmail.com>, 2019 # Shaima Safar <shaima.safar@open-inside.com>, 2019 +# hoxhe Aits <hoxhe0@gmail.com>, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2019\n" +"Last-Translator: hoxhe Aits <hoxhe0@gmail.com>, 2019\n" "Language-Team: Arabic (https://www.transifex.com/odoo/teams/41243/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -147,11 +148,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "إضافة بلوكات" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -248,7 +244,6 @@ msgstr "تشغيل تلقائي" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "لون الخلفية" @@ -303,6 +298,11 @@ msgid "Block" msgstr "بلوك" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -345,6 +345,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -444,13 +449,6 @@ msgstr "لون مخصص" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "تخصيص" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -526,13 +524,6 @@ msgstr "سحب الصورة هنا" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "اسحب لتحركه" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "استنساخ الحاوية" @@ -956,11 +947,6 @@ msgid "Keyboard shortcuts" msgstr "اختصارات لوحة المفاتيح" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1125,6 +1111,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "خيارات" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1198,21 +1189,6 @@ msgid "Preview" msgstr "معاينة" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1291,8 +1267,8 @@ msgstr "حقل Qweb واحد لواحد" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" -msgstr "حقل Qweb نقدي" +msgid "Qweb Field Monetary" +msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_relative @@ -1537,13 +1513,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "اختيار الحاوية الأصل" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/cs.po b/addons/web_editor/i18n/cs.po index c085d473209..69452bab9c0 100644 --- a/addons/web_editor/i18n/cs.po +++ b/addons/web_editor/i18n/cs.po @@ -2,12 +2,21 @@ # This file contains the translation of the following modules: # * web_editor # +# Translators: +# Adam Kettner <cetnerix@gmail.com>, 2019 +# Jaroslav Helemik Nemec <nemec@helemik.cz>, 2019 +# Jan Horzinka <jan.horzinka@centrum.cz>, 2019 +# Martin Trigaux, 2019 +# trendspotter <j.podhorecky@volny.cz>, 2019 +# Michal Veselý <michal@veselyberanek.net>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" +"Last-Translator: Michal Veselý <michal@veselyberanek.net>, 2019\n" "Language-Team: Czech (https://www.transifex.com/odoo/teams/41243/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -34,7 +43,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/ace.xml:0 #, python-format msgid "×" -msgstr "" +msgstr "×" #. module: web_editor #. openerp-web @@ -50,21 +59,21 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "'Title tag' is shown as a tooltip when you hover the picture." -msgstr "" +msgstr "Při najetí kurzorem na obrázek se zobrazí \"Popisek\"." #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "(ALT Tag)" -msgstr "" +msgstr "(ALT Tag)" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "(TITLE Tag)" -msgstr "" +msgstr "(TITLE Tag)" #. module: web_editor #. openerp-web @@ -78,7 +87,7 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)" -msgstr "" +msgstr "(YouTube, Vimeo, Vine, Instagram, DailyMotion nebo Youku)" #. module: web_editor #: model_terms:ir.ui.view,arch_db:web_editor.snippets @@ -93,27 +102,29 @@ msgid "" "A server error occured. Please check you correctly signed in and that the " "file you are saving is correctly formatted." msgstr "" +"Došlo k chybě serveru. Zkontrolujte, zda jste správně přihlášeni a zda je " +"soubor, který ukládáte, správně naformátován." #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Accepts" -msgstr "" +msgstr "Přijmout" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Action" -msgstr "" +msgstr "Akce" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Add" -msgstr "" +msgstr "Přidat" #. module: web_editor #. openerp-web @@ -130,11 +141,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -155,21 +161,21 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Align center" -msgstr "" +msgstr "Na střed" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Align left" -msgstr "" +msgstr "Zarovnat vlevo" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Align right" -msgstr "" +msgstr "Zarovnat vpravo" #. module: web_editor #. openerp-web @@ -197,7 +203,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Aspect Ratio" -msgstr "" +msgstr "Poměr stran" #. module: web_editor #: model:ir.model,name:web_editor.model_web_editor_assets @@ -209,17 +215,17 @@ msgstr "" #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Assign a focal point that will always be visible" -msgstr "" +msgstr "Přiřadit ohnisko, které bude vždy viditelné" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_attachment msgid "Attachment" -msgstr "" +msgstr "Příloha" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_ir_attachment__local_url msgid "Attachment URL" -msgstr "" +msgstr "Adresa URL přílohy" #. module: web_editor #. openerp-web @@ -231,10 +237,9 @@ msgstr "" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" -msgstr "" +msgstr "Barva pozadí" #. module: web_editor #. openerp-web @@ -248,7 +253,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Background height" -msgstr "" +msgstr "Výška pozadí" #. module: web_editor #. openerp-web @@ -262,14 +267,14 @@ msgstr "" #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Background repeat" -msgstr "" +msgstr "Opakování pozadí" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Background size" -msgstr "" +msgstr "Velikost pozadí" #. module: web_editor #. openerp-web @@ -283,6 +288,11 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/snippets.editor.js:0 #, python-format msgid "Block" +msgstr "Blok" + +#. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" msgstr "" #. module: web_editor @@ -290,28 +300,28 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Bold" -msgstr "" +msgstr "Tučný" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/common/ace.js:0 #, python-format msgid "Careful !" -msgstr "" +msgstr "Opatrně!" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Center" -msgstr "" +msgstr "Střed" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/alt_dialog.js:0 #, python-format msgid "Change media description and tooltip" -msgstr "" +msgstr "Změnit popis médií a tooltip" #. module: web_editor #. openerp-web @@ -328,41 +338,46 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 #: code:addons/web_editor/static/src/xml/ace.xml:0 #, python-format msgid "Close" -msgstr "" +msgstr "Zavřít" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Code" -msgstr "" +msgstr "Kód" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Code View" -msgstr "" +msgstr "Zobrazit kód" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Color" -msgstr "" +msgstr "Barva" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/snippets.editor.js:0 #, python-format msgid "Column" -msgstr "" +msgstr "Sloupec" #. module: web_editor #. openerp-web @@ -370,14 +385,14 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg_colorpicker.xml:0 #, python-format msgid "Common colors" -msgstr "" +msgstr "Běžné barvy" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Contain" -msgstr "" +msgstr "Obsahuje" #. module: web_editor #. openerp-web @@ -391,17 +406,17 @@ msgstr "" #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Cover" -msgstr "" +msgstr "Obálka" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__create_uid msgid "Created by" -msgstr "" +msgstr "Vytvořeno od" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__create_date msgid "Created on" -msgstr "" +msgstr "Vytvořeno" #. module: web_editor #. openerp-web @@ -409,35 +424,28 @@ msgstr "" #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 #, python-format msgid "Crop Image" -msgstr "" +msgstr "Oříznout obraz" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Custom" -msgstr "" +msgstr "Vlastní" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Custom Color" -msgstr "" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "" +msgstr "Vlastní barva" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" -msgstr "" +msgstr "Dailymotion" #. module: web_editor #. openerp-web @@ -445,14 +453,14 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Default" -msgstr "" +msgstr "Výchozí" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Define if/how the background image will be repeated" -msgstr "" +msgstr "Definujte, zda / jak bude obrázek na pozadí opakován" #. module: web_editor #. openerp-web @@ -460,7 +468,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Description" -msgstr "" +msgstr "Popis" #. module: web_editor #. openerp-web @@ -469,48 +477,41 @@ msgstr "" #: code:addons/web_editor/static/src/js/wysiwyg/widgets/dialog.js:0 #, python-format msgid "Discard" -msgstr "" +msgstr "Zrušit" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_web_editor_assets__display_name #: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__display_name msgid "Display Name" -msgstr "" +msgstr "Zobrazované jméno" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Document" -msgstr "" +msgstr "Dokument" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Document Style" -msgstr "" +msgstr "Styl dokumentu" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Double-click to edit" -msgstr "" +msgstr "Poklepáním upravte" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Drag an image here" -msgstr "" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Drag to Move" -msgstr "" +msgstr "Přetáhněte obrázek zde" #. module: web_editor #. openerp-web @@ -525,7 +526,7 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Edit" -msgstr "" +msgstr "Upravit" #. module: web_editor #. openerp-web @@ -539,7 +540,7 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "File / Image" -msgstr "" +msgstr "Soubor / obrázek" #. module: web_editor #. openerp-web @@ -547,35 +548,35 @@ msgstr "" #: code:addons/web_editor/static/src/xml/ace.xml:0 #, python-format msgid "Filter" -msgstr "" +msgstr "Filtr" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Flat" -msgstr "" +msgstr "Paušál" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Flip Horizontal" -msgstr "" +msgstr "Počet nepřečtených zpráv" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Flip Vertical" -msgstr "" +msgstr "Převrátit svisle" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Float Left" -msgstr "" +msgstr "Zarovnat doleva" #. module: web_editor #. openerp-web @@ -589,56 +590,56 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Float Right" -msgstr "" +msgstr "Zarovnat vpravo" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Font Color" -msgstr "" +msgstr "Barva písma" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Font Family" -msgstr "" +msgstr "Rodina písma" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Font Size" -msgstr "" +msgstr "Velikost písma" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/ace.xml:0 #, python-format msgid "Format" -msgstr "" +msgstr "Formát" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 #, python-format msgid "Free" -msgstr "" +msgstr "Volný" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Full Screen" -msgstr "" +msgstr "Celoobrazovkový režim" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/backend.xml:0 #, python-format msgid "Fullscreen" -msgstr "" +msgstr "Celá obrazovka" #. module: web_editor #. openerp-web @@ -650,84 +651,84 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_http msgid "HTTP Routing" -msgstr "" +msgstr "HTTP Routing" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Header 1" -msgstr "" +msgstr "Nadpis 1" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Header 2" -msgstr "" +msgstr "Nadpis 2" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Header 3" -msgstr "" +msgstr "Nadpis 3" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Header 4" -msgstr "" +msgstr "Nadpis 4" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Header 5" -msgstr "" +msgstr "Nadpis 5" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Header 6" -msgstr "" +msgstr "Nadpis 6" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Height" -msgstr "" +msgstr "Výška" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Help" -msgstr "" +msgstr "Pomoc" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Hide Dailymotion logo" -msgstr "" +msgstr "Skrýt logo Dailymotion" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Hide Youtube logo" -msgstr "" +msgstr "Skrýt Youtube logo" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Hide fullscreen button" -msgstr "" +msgstr "Skrýt tlačítko na celou obrazovku" #. module: web_editor #. openerp-web @@ -748,20 +749,20 @@ msgstr "" #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Horizontal" -msgstr "" +msgstr "Horizontální" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/backend/field_html.js:0 #, python-format msgid "Html" -msgstr "" +msgstr "Html" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_web_editor_assets__id #: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__id msgid "ID" -msgstr "" +msgstr "ID" #. module: web_editor #. openerp-web @@ -771,6 +772,8 @@ msgid "" "If you discard the current edition, all unsaved changes will be lost. You " "can cancel to return to the edition mode." msgstr "" +"Pokud zrušíte aktuální vydání, všechny neuložené změny budou ztraceny. " +"Můžete se vrátit do režimu vydání." #. module: web_editor #. openerp-web @@ -789,6 +792,8 @@ msgid "" "If you reset this file, all your customizations will be lost as it will be " "reverted to the default file." msgstr "" +"Pokud tento soubor resetujete, všechna přizpůsobení budou ztracena, protože " +"budou vrácena na výchozí soubor." #. module: web_editor #. openerp-web @@ -804,7 +809,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Image" -msgstr "" +msgstr "Obrázek" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_ir_attachment__image_height @@ -828,7 +833,7 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Image URL" -msgstr "" +msgstr "URL obrázku" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_ir_attachment__image_width @@ -847,56 +852,56 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Indent" -msgstr "" +msgstr "Odrážka" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Insert Horizontal Rule" -msgstr "" +msgstr "vložit vodorovné měřítko" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Insert Image" -msgstr "" +msgstr "Vložit obraz" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Insert Link" -msgstr "" +msgstr "Vložit odkaz" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Insert Video" -msgstr "" +msgstr "Vložit video" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Instagram" -msgstr "" +msgstr "Instagram" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/snippets.editor.js:0 #, python-format msgid "Install" -msgstr "" +msgstr "Instalovat" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Italic" -msgstr "" +msgstr "Kurzíva" #. module: web_editor #. openerp-web @@ -924,19 +929,14 @@ msgstr "" #: code:addons/web_editor/static/src/js/wysiwyg/widgets/image_optimize_dialog.js:0 #, python-format msgid "Keep Original" -msgstr "" +msgstr "Ponechat originál" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Keyboard shortcuts" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" +msgstr "Klávesové zkratky" #. module: web_editor #. openerp-web @@ -944,44 +944,44 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Large" -msgstr "" +msgstr "Velký" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_web_editor_assets____last_update #: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub____last_update msgid "Last Modified on" -msgstr "" +msgstr "Naposled změněno" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__write_uid msgid "Last Updated by" -msgstr "" +msgstr "Naposledy upraveno od" #. module: web_editor #: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__write_date msgid "Last Updated on" -msgstr "" +msgstr "Naposled upraveno" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Line Height" -msgstr "" +msgstr "Výška řádku" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Link" -msgstr "" +msgstr "Odkaz" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Link Label" -msgstr "" +msgstr "Visačka odkazu" #. module: web_editor #. openerp-web @@ -1002,7 +1002,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Loop" -msgstr "" +msgstr "Smyčka" #. module: web_editor #. openerp-web @@ -1010,7 +1010,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Medium" -msgstr "" +msgstr "Střední" #. module: web_editor #. openerp-web @@ -1018,7 +1018,7 @@ msgstr "" #: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__name #, python-format msgid "Name" -msgstr "" +msgstr "Název" #. module: web_editor #. openerp-web @@ -1039,7 +1039,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "No repeat" -msgstr "" +msgstr "Neopakovat" #. module: web_editor #. openerp-web @@ -1048,21 +1048,21 @@ msgstr "" #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "None" -msgstr "" +msgstr "Nic" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Normal" -msgstr "" +msgstr "Normální" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/snippets.options.js:0 #, python-format msgid "Ok" -msgstr "" +msgstr "Ok" #. module: web_editor #. openerp-web @@ -1091,7 +1091,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Open in new window" -msgstr "" +msgstr "Otevřít v novém okně" #. module: web_editor #. openerp-web @@ -1103,6 +1103,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Možnosti" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1121,21 +1126,21 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Outdent" -msgstr "" +msgstr "Outdent" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Outline" -msgstr "" +msgstr "Obrys" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Outline-Rounded" -msgstr "" +msgstr "Zaoblený obrys" #. module: web_editor #. openerp-web @@ -1149,7 +1154,7 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Paragraph" -msgstr "" +msgstr "Odstavec" #. module: web_editor #. openerp-web @@ -1163,7 +1168,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Pictogram" -msgstr "" +msgstr "Piktogram" #. module: web_editor #. openerp-web @@ -1173,29 +1178,14 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Preview" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" +msgstr "Náhled" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Quality" -msgstr "" +msgstr "Jakost" #. module: web_editor #. openerp-web @@ -1215,7 +1205,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb msgid "Qweb" -msgstr "" +msgstr "Qweb" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field @@ -1269,7 +1259,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1297,14 +1287,14 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.js:0 #, python-format msgid "Readonly field" -msgstr "" +msgstr "Pole jen pro čtení" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Redo" -msgstr "" +msgstr "znovu" #. module: web_editor #. openerp-web @@ -1325,35 +1315,35 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Remove" -msgstr "" +msgstr "Odebrat" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Remove Block" -msgstr "" +msgstr "Odstranit blok" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Remove Font Style" -msgstr "" +msgstr "Odstranit styl písma" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Remove Image" -msgstr "" +msgstr "Odebrat obrázek" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Repeat" -msgstr "" +msgstr "Opakovat" #. module: web_editor #. openerp-web @@ -1367,21 +1357,21 @@ msgstr "" #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Repeat x" -msgstr "" +msgstr "Opakovat x" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Repeat y" -msgstr "" +msgstr "Opakovat y" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/ace.xml:0 #, python-format msgid "Reset" -msgstr "" +msgstr "Resetovat" #. module: web_editor #. openerp-web @@ -1417,7 +1407,7 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Resize Half" -msgstr "" +msgstr "Změna velikosti poloviny" #. module: web_editor #. openerp-web @@ -1445,21 +1435,21 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Rotate Right" -msgstr "" +msgstr "Otočit doprava" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Rounded" -msgstr "" +msgstr "Zaoblené" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/ace.xml:0 #, python-format msgid "SCSS (CSS)" -msgstr "" +msgstr "SCSS (CSS)" #. module: web_editor #. openerp-web @@ -1475,7 +1465,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/ace.xml:0 #, python-format msgid "Save" -msgstr "" +msgstr "Uložit" #. module: web_editor #. openerp-web @@ -1483,14 +1473,14 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Search" -msgstr "" +msgstr "Hledání" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Search Contact" -msgstr "" +msgstr "Hledat kontakt" #. module: web_editor #. openerp-web @@ -1515,38 +1505,31 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" -msgstr "" +msgstr "Vybrat media" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Select from files" -msgstr "" +msgstr "Vybrat ze souborů" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/common/ace.js:0 #, python-format msgid "Server error" -msgstr "" +msgstr "Chyba serveru" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Set the starting position of the background image." -msgstr "" +msgstr "Nastavit výchozí polohu obrázku na pozadí." #. module: web_editor #. openerp-web @@ -1562,7 +1545,7 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Shadow" -msgstr "" +msgstr "Stín" #. module: web_editor #. openerp-web @@ -1570,7 +1553,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Size" -msgstr "" +msgstr "Velikost" #. module: web_editor #. openerp-web @@ -1579,21 +1562,21 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Small" -msgstr "" +msgstr "Malý" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Spin" -msgstr "" +msgstr "Rotace" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Strikethrough" -msgstr "" +msgstr "Přeškrtnutý" #. module: web_editor #. openerp-web @@ -1608,42 +1591,42 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Subscript" -msgstr "" +msgstr "Index" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Superscript" -msgstr "" +msgstr "Horní index" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Table" -msgstr "" +msgstr "Tabulka" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/common/ace.js:0 #, python-format msgid "Template ID: %s" -msgstr "" +msgstr "ID šablony: %s" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Text formatting" -msgstr "" +msgstr "Formátování textu" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Text to display" -msgstr "" +msgstr "Text k zobrazení" #. module: web_editor #. openerp-web @@ -1684,13 +1667,15 @@ msgid "" "The image could not be deleted because it is used in the\n" " following pages or views:" msgstr "" +"Snímek nelze smazat, protože se používá na následujících stránkách nebo " +"pohledech:" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #, python-format msgid "The provided url does not reference any supported video" -msgstr "" +msgstr "Zadaná adresa URL neodkazuje na žádné podporované video" #. module: web_editor #. openerp-web @@ -1712,7 +1697,7 @@ msgstr "" #: code:addons/web_editor/static/src/js/editor/editor.js:0 #, python-format msgid "This document is not saved!" -msgstr "" +msgstr "Tento dokument není uložen!" #. module: web_editor #. openerp-web @@ -1733,7 +1718,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "This image is an external image" -msgstr "" +msgstr "Tento obrázek je externí obrázek" #. module: web_editor #. openerp-web @@ -1747,40 +1732,40 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "This type of image is not supported for cropping." -msgstr "" +msgstr "Tento typ obrazu není pro oříznutí podporován." #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "To what URL should this link go?" -msgstr "" +msgstr "Kam by mělo toto URL odkazovat?" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Tooltip" -msgstr "" +msgstr "Kontextová nápověda" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/backend.xml:0 #, python-format msgid "Translate" -msgstr "" +msgstr "přeložit" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_translation msgid "Translation" -msgstr "" +msgstr "Překlad" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Transparent" -msgstr "" +msgstr "Průhledný" #. module: web_editor #. openerp-web @@ -1794,42 +1779,42 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "URL or Email" -msgstr "" +msgstr "URL nebo e-mail" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Underline" -msgstr "" +msgstr "Podtržení" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Undo" -msgstr "" +msgstr "vrátit" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/common/ace.js:0 #, python-format msgid "Unexpected " -msgstr "" +msgstr "Neočekávané" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Unlink" -msgstr "" +msgstr "Odpojit" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Unordered list" -msgstr "" +msgstr "Neseřazený seznam" #. module: web_editor #. openerp-web @@ -1843,14 +1828,14 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Upload an image" -msgstr "" +msgstr "Nahrát obrázek" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "Vertical" -msgstr "" +msgstr "Vertikální" #. module: web_editor #. openerp-web @@ -1858,21 +1843,21 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Video" -msgstr "" +msgstr "Video" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Video Link" -msgstr "" +msgstr "Video odkaz" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Video URL?" -msgstr "" +msgstr "Video URL?" #. module: web_editor #. openerp-web @@ -1891,7 +1876,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_ui_view msgid "View" -msgstr "" +msgstr "Pohled" #. module: web_editor #. openerp-web @@ -1905,14 +1890,14 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Vimeo" -msgstr "" +msgstr "Vimeo" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Vine.co" -msgstr "" +msgstr "Vine.co" #. module: web_editor #: model:ir.model,name:web_editor.model_web_editor_converter_test_sub @@ -1929,7 +1914,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Width" -msgstr "" +msgstr "Šířka" #. module: web_editor #. openerp-web @@ -1937,14 +1922,14 @@ msgstr "" #: code:addons/web_editor/static/src/xml/ace.xml:0 #, python-format msgid "XML (HTML)" -msgstr "" +msgstr "XML (HTML)" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format msgid "Xl" -msgstr "" +msgstr "Xl" #. module: web_editor #. openerp-web @@ -1981,35 +1966,35 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Youku" -msgstr "" +msgstr "Youku" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Youtube" -msgstr "" +msgstr "Youtube" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Zoom In" -msgstr "" +msgstr "Přiblížit" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Zoom Out" -msgstr "" +msgstr "Oddálit" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "and" -msgstr "" +msgstr "and" #. module: web_editor #. openerp-web @@ -2019,14 +2004,14 @@ msgstr "" #: code:addons/web_editor/static/src/xml/editor.xml:0 #, python-format msgid "auto" -msgstr "" +msgstr "automaticky" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "https://www.odoo.com/logo.png" -msgstr "" +msgstr "https://www.odoo.com/logo.png" #. module: web_editor #. openerp-web @@ -2041,11 +2026,11 @@ msgstr "" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "px" -msgstr "" +msgstr "px" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "videos" -msgstr "" +msgstr "videa" diff --git a/addons/web_editor/i18n/de.po b/addons/web_editor/i18n/de.po index 499bd4bfd4c..c02251a4539 100644 --- a/addons/web_editor/i18n/de.po +++ b/addons/web_editor/i18n/de.po @@ -9,25 +9,25 @@ # Jasper Torlitz <inactive+jtorlitz@transifex.com>, 2019 # darenkster <inactive+darenkster@transifex.com>, 2019 # Marco Tarsia <marco.y.tarsia@gmail.com>, 2019 -# Leon Grill <leg@odoo.com>, 2019 # e2f <projects@e2f.com>, 2019 # Ralf Hilgenstock <rh@dialoge.info>, 2019 # Martin Trigaux, 2019 # Wolfgang Taferner, 2019 -# Ermin Trevisan <trevi@twanda.com>, 2019 # Henry Mineehen <info@mineehen.de>, 2019 # Katharina Moritz <kmo@e2f.com>, 2019 # dd5cd5bab88c61e9dedf84f5ea59b147, 2019 # Jan Meyer, 2019 # Chris Egal <sodaswed@web.de>, 2019 +# Ermin Trevisan <trevi@twanda.com>, 2019 +# Leon Grill <leg@odoo.com>, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Chris Egal <sodaswed@web.de>, 2019\n" +"Last-Translator: Leon Grill <leg@odoo.com>, 2019\n" "Language-Team: German (https://www.transifex.com/odoo/teams/41243/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -158,11 +158,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Baustein hinzufügen" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -259,7 +254,6 @@ msgstr "Automatisch abspielen" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Hintergrundfarbe" @@ -314,6 +308,11 @@ msgid "Block" msgstr "Blockieren" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "Bausteine" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -356,6 +355,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -455,13 +459,6 @@ msgstr "Freiwählbare Farbe" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Anpassen" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -537,13 +534,6 @@ msgstr "Bild hierhin ziehen" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Zum verschieben ziehen" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Duplizieren Sie Inhaltsblöcke" @@ -969,11 +959,6 @@ msgid "Keyboard shortcuts" msgstr "Tastaturkürzel" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1138,6 +1123,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Optionen" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1211,21 +1201,6 @@ msgid "Preview" msgstr "Vorschau" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1304,7 +1279,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1550,13 +1525,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Übergeordneten Behälter auswählen" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/es.po b/addons/web_editor/i18n/es.po index 4ebd229bacd..b0b93bf911c 100644 --- a/addons/web_editor/i18n/es.po +++ b/addons/web_editor/i18n/es.po @@ -11,8 +11,6 @@ # Katherine Zaoral <katherine.zaoral@gmail.com>, 2019 # 966ff43e6966712895a590e7320ca288, 2019 # e2f <projects@e2f.com>, 2019 -# Martin Trigaux, 2019 -# Pedro M. Baeza <pedro.baeza@gmail.com>, 2019 # David Arnold <blaggacao@users.noreply.github.com>, 2019 # Antonio Trueba, 2019 # Inigo Zuluaga <inigo_zuluaga@yahoo.es>, 2019 @@ -21,14 +19,17 @@ # Nicolás Broggi <rnbroggi@gmail.com>, 2019 # Jon Perez <jop@odoo.com>, 2019 # Efrem Jimenez <efj@odoo.com>, 2019 +# Jesse Garza <jga@odoo.com>, 2019 +# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2019 +# Martin Trigaux, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Efrem Jimenez <efj@odoo.com>, 2019\n" +"Last-Translator: Martin Trigaux, 2019\n" "Language-Team: Spanish (https://www.transifex.com/odoo/teams/41243/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -151,11 +152,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Añadir bloques" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -252,7 +248,6 @@ msgstr "Reproducción automática" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Color de Fondo" @@ -307,6 +302,11 @@ msgid "Block" msgstr "Bloquear" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "Bloques" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -349,6 +349,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -448,13 +453,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Personalizar" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -530,13 +528,6 @@ msgstr "Arrastre aquí una imagen" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Arrastrar para mover" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Duplicar contenedor" @@ -959,11 +950,6 @@ msgid "Keyboard shortcuts" msgstr "Atajos de teclado" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1128,6 +1114,11 @@ msgid "Optimize" msgstr "Optimizar" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Opciones" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1201,21 +1192,6 @@ msgid "Preview" msgstr "Previsualizar" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1294,7 +1270,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1540,13 +1516,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Seleccione el contenedor padre" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" @@ -1865,7 +1834,7 @@ msgstr "Lista sin ordenar" #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Upload a document" -msgstr "" +msgstr "Cargar un documento" #. module: web_editor #. openerp-web diff --git a/addons/web_editor/i18n/fr.po b/addons/web_editor/i18n/fr.po index 5e1bdba6ed1..73d878251de 100644 --- a/addons/web_editor/i18n/fr.po +++ b/addons/web_editor/i18n/fr.po @@ -12,7 +12,6 @@ # William Olhasque <william.olhasque@scopea.fr>, 2019 # e2f <projects@e2f.com>, 2019 # bb76cd9ac0cb7e20167a14728edb858b, 2019 -# Martin Trigaux, 2019 # Fabien Pinckaers <fp@openerp.com>, 2019 # Frédéric LIETART <stuff@tifred.fr>, 2019 # Fabrice Henrion, 2019 @@ -23,16 +22,17 @@ # Melanie Bernard <mbe@odoo.com>, 2019 # Shark McGnark <peculiarcheese@gmail.com>, 2019 # Fred Gilson <fgi@odoo.com>, 2019 -# Eloïse Stilmant <est@odoo.com>, 2019 # Cécile Collart <cco@odoo.com>, 2019 +# Martin Trigaux, 2019 +# Eloïse Stilmant <est@odoo.com>, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Cécile Collart <cco@odoo.com>, 2019\n" +"Last-Translator: Eloïse Stilmant <est@odoo.com>, 2019\n" "Language-Team: French (https://www.transifex.com/odoo/teams/41243/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -157,11 +157,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Ajouter des blocs" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -258,7 +253,6 @@ msgstr "Lecture automatique" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Couleur de fond" @@ -313,6 +307,11 @@ msgid "Block" msgstr "Bloquer" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "Blocs" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -355,6 +354,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -454,13 +458,6 @@ msgstr "Couleur personnalisée" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Personnaliser" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -536,13 +533,6 @@ msgstr "Glisser une image ici" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Tirer pour déplacer" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Cloner le conteneur" @@ -965,11 +955,6 @@ msgid "Keyboard shortcuts" msgstr "Raccourcis clavier" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1134,6 +1119,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Options" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1207,21 +1197,6 @@ msgid "Preview" msgstr "Aperçu" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1256,7 +1231,7 @@ msgstr "Champ Qweb" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_contact msgid "Qweb Field Contact" -msgstr "" +msgstr "Champ Qweb de Contact" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_date @@ -1271,7 +1246,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_duration msgid "Qweb Field Duration" -msgstr "" +msgstr "Champ Qweb de durée" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_float @@ -1281,12 +1256,12 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_html msgid "Qweb Field HTML" -msgstr "" +msgstr "Champ Qweb HTML" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_image msgid "Qweb Field Image" -msgstr "" +msgstr "Champ Qweb image" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_integer @@ -1296,12 +1271,12 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_many2one msgid "Qweb Field Many to One" -msgstr "" +msgstr "Champ Qweb Many to One" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" -msgstr "" +msgid "Qweb Field Monetary" +msgstr "Champ monétaire Qweb " #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_relative @@ -1311,17 +1286,17 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_selection msgid "Qweb Field Selection" -msgstr "" +msgstr "Champ Qweb de sélection" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_text msgid "Qweb Field Text" -msgstr "" +msgstr "Champ Qweb de texte" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_qweb msgid "Qweb Field qweb" -msgstr "" +msgstr "Champ Qweb qweb" #. module: web_editor #. openerp-web @@ -1546,13 +1521,6 @@ msgstr "Chercher une image" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Sélectionner le conteneur parent" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/hr.po b/addons/web_editor/i18n/hr.po index 765d2e58a24..4788d7d26f7 100644 --- a/addons/web_editor/i18n/hr.po +++ b/addons/web_editor/i18n/hr.po @@ -5,21 +5,21 @@ # Translators: # Mario Jureša <mario.juresa@uvid.hr>, 2019 # Martin Trigaux, 2019 -# Bole <bole@dajmi5.com>, 2019 # Vladimir Olujić <olujic.vladimir@storm.hr>, 2019 # Đurđica Žarković <durdica.zarkovic@storm.hr>, 2019 # Ivica Dimjašević <ivica.dimjasevic@storm.hr>, 2019 # Karolina Tonković <karolina.tonkovic@storm.hr>, 2019 # Marko Carević <marko.carevic@live.com>, 2019 # Tina Milas, 2019 +# Bole <bole@dajmi5.com>, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Tina Milas, 2019\n" +"Last-Translator: Bole <bole@dajmi5.com>, 2019\n" "Language-Team: Croatian (https://www.transifex.com/odoo/teams/41243/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -142,11 +142,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Dodaj blokove" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -243,7 +238,6 @@ msgstr "Autopokretanje" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Boja pozadine" @@ -298,6 +292,11 @@ msgid "Block" msgstr "Blokiraj" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -340,6 +339,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -439,13 +443,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Prilagodi" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -521,13 +518,6 @@ msgstr "Ovdje povucite sliku" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Povuci za pomicanje" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Dupliciraj sadržaj" @@ -948,11 +938,6 @@ msgid "Keyboard shortcuts" msgstr "Prečaci tipkovnice" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1117,6 +1102,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Opcije" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1190,21 +1180,6 @@ msgid "Preview" msgstr "Pregled" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1283,7 +1258,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1529,13 +1504,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/hu.po b/addons/web_editor/i18n/hu.po index 30be4940001..9fa565cb8ea 100644 --- a/addons/web_editor/i18n/hu.po +++ b/addons/web_editor/i18n/hu.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" "Last-Translator: Ákos Nagy <akos.nagy@oregional.hu>, 2019\n" "Language-Team: Hungarian (https://www.transifex.com/odoo/teams/41243/hu/)\n" @@ -137,11 +137,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -238,7 +233,6 @@ msgstr "Automatikus lejátszás" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Háttér szín" @@ -293,6 +287,11 @@ msgid "Block" msgstr "Blokkolás" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -335,6 +334,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -434,13 +438,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Testreszabás" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -516,13 +513,6 @@ msgstr "Mozgasson egy képet ide" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Fogja meg a mozgatáshoz" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Konténer duplikálása" @@ -941,11 +931,6 @@ msgid "Keyboard shortcuts" msgstr "Billentyűzet gyorsbillentyű" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1110,6 +1095,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Beállítások" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1183,21 +1173,6 @@ msgid "Preview" msgstr "Előnézet" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1276,7 +1251,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1522,13 +1497,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/it.po b/addons/web_editor/i18n/it.po index 98d91131ec6..b2a813b9043 100644 --- a/addons/web_editor/i18n/it.po +++ b/addons/web_editor/i18n/it.po @@ -14,14 +14,15 @@ # Niccolò Lubello <nlubello@gmail.com>, 2019 # Léonie Bouchat <lbo@odoo.com>, 2019 # Sergio Zanchetta <primes2h@gmail.com>, 2019 +# Manuela Feliciani <mfeliciani@alice.it>, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Sergio Zanchetta <primes2h@gmail.com>, 2019\n" +"Last-Translator: Manuela Feliciani <mfeliciani@alice.it>, 2019\n" "Language-Team: Italian (https://www.transifex.com/odoo/teams/41243/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -150,11 +151,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Aggiunta blocchi" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -251,7 +247,6 @@ msgstr "Riproduzione automatica" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Colore sfondo" @@ -306,6 +301,11 @@ msgid "Block" msgstr "Blocco" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -348,6 +348,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -447,13 +452,6 @@ msgstr "Colore personalizzato" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Personalizza" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -529,13 +527,6 @@ msgstr "Trascina qui un'immagine" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Trascina per spostare" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Duplica contenitore" @@ -958,11 +949,6 @@ msgid "Keyboard shortcuts" msgstr "Scorciatoie da tastiera" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1127,6 +1113,11 @@ msgid "Optimize" msgstr "Ottimizza" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Opzioni" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1200,21 +1191,6 @@ msgid "Preview" msgstr "Anteprima" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1293,8 +1269,8 @@ msgstr "Campo qweb molti a uno" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" -msgstr "Campo qweb monetario" +msgid "Qweb Field Monetary" +msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_relative @@ -1539,13 +1515,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Seleziona contenitore padre" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/lb.po b/addons/web_editor/i18n/lb.po new file mode 100644 index 00000000000..25a765fdc30 --- /dev/null +++ b/addons/web_editor/i18n/lb.po @@ -0,0 +1,2019 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_editor +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~12.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" +"PO-Revision-Date: 2019-08-26 09:15+0000\n" +"Language-Team: Luxembourgish (https://www.transifex.com/odoo/teams/41243/lb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: lb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/image_optimize_dialog.js:0 +#, python-format +msgid "%d (Original)" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/image_optimize_dialog.js:0 +#, python-format +msgid "%d (Suggested)" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "×" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "" +"'Alt tag' specifies an alternate text for an image, if the image cannot be " +"displayed (slow connection, missing image, screen reader ...)." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "'Title tag' is shown as a tooltip when you hover the picture." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "(ALT Tag)" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "(TITLE Tag)" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "(URL or Embed)" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)" +msgstr "" + +#. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "<i class=\"fa fa-th-large\"/> First Panel" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "" +"A server error occured. Please check you correctly signed in and that the " +"file you are saving is correctly formatted." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Accepts" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Action" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 +#, python-format +msgid "Add" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 +#, python-format +msgid "Add as document" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 +#, python-format +msgid "Add as image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Add document" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Add image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Align center" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Align left" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Align right" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "All SCSS Files" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "All images have been loaded" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 +#, python-format +msgid "Are you sure you want to delete this file ?" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Aspect Ratio" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_web_editor_assets +msgid "Assets Utils" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Assign a focal point that will always be visible" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_attachment +msgid "Attachment" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_ir_attachment__local_url +msgid "Attachment URL" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Autoplay" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Background Color" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/snippets.options.js:0 +#, python-format +msgid "Background Image Sizing" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Background height" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Background position" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Background repeat" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Background size" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Background width" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/snippets.editor.js:0 +#, python-format +msgid "Block" +msgstr "" + +#. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Bold" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "Careful !" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Center" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/alt_dialog.js:0 +#, python-format +msgid "Change media description and tooltip" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Changing the quality is not supported for images of type" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/summernote.js:0 +#, python-format +msgid "Checklist" +msgstr "" + +#. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Code" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Code View" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Color" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/snippets.editor.js:0 +#, python-format +msgid "Column" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg_colorpicker.xml:0 +#, python-format +msgid "Common colors" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Contain" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Copy-paste your URL or embed code here" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Cover" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__create_uid +msgid "Created by" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__create_date +msgid "Created on" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 +#, python-format +msgid "Crop Image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Custom" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Custom Color" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Dailymotion" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Default" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Define if/how the background image will be repeated" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Description" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/snippets.options.js:0 +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/dialog.js:0 +#, python-format +msgid "Discard" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_web_editor_assets__display_name +#: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__display_name +msgid "Display Name" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Document Style" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Double-click to edit" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Drag an image here" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/snippets.xml:0 +#, python-format +msgid "Duplicate Container" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "Expected " +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "File / Image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "Filter" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Flat" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Flip Horizontal" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Flip Vertical" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Float Left" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Float None" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Float Right" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Font Color" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Font Family" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Font Size" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "Format" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 +#, python-format +msgid "Free" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Full Screen" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/backend.xml:0 +#, python-format +msgid "Fullscreen" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Give a relevant name to your file to optimize search engine results." +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_http +msgid "HTTP Routing" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Header 1" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Header 2" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Header 3" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Header 4" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Header 5" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Header 6" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Height" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Help" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Hide Dailymotion logo" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Hide Youtube logo" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Hide fullscreen button" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Hide player controls" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Hide sharing button" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Horizontal" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/backend/field_html.js:0 +#, python-format +msgid "Html" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_web_editor_assets__id +#: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__id +msgid "ID" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/editor.js:0 +#, python-format +msgid "" +"If you discard the current edition, all unsaved changes will be lost. You " +"can cancel to return to the edition mode." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "" +"If you edit and save this file, you will never receive updates from Odoo " +"anymore unless you reset your customizations." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "" +"If you reset this file, all your customizations will be lost as it will be " +"reverted to the default file." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "" +"If you want to crop it, please first download it from the original source " +"and upload it in Odoo." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Image" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_ir_attachment__image_height +msgid "Image Height" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Image Preview" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_ir_attachment__image_src +msgid "Image Src" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Image URL" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_ir_attachment__image_width +msgid "Image Width" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/image_optimize_dialog.js:0 +#, python-format +msgid "Improve your Image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Indent" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Insert Horizontal Rule" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Insert Image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Insert Link" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Insert Video" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Instagram" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/snippets.editor.js:0 +#, python-format +msgid "Install" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Italic" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "JS" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "JS file: %s" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Justify full" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/image_optimize_dialog.js:0 +#, python-format +msgid "Keep Original" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Keyboard shortcuts" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Large" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_web_editor_assets____last_update +#: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub____last_update +msgid "Last Modified on" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: web_editor +#: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__write_date +msgid "Last Updated on" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Line Height" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Link" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Link Label" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/link_dialog.js:0 +#, python-format +msgid "Link to" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Load more..." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Loop" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Medium" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#: model:ir.model.fields,field_description:web_editor.field_web_editor_converter_test_sub__name +#, python-format +msgid "Name" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "No documents found." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "No images found." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "No repeat" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/snippets.xml:0 +#, python-format +msgid "None" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Normal" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/snippets.options.js:0 +#, python-format +msgid "Ok" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "Only Custom SCSS Files" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "Only Page SCSS Files" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "Only Views" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Open in new window" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/image_optimize_dialog.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Optimize" +msgstr "" + +#. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Or choose a preset:" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Ordered list" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Outdent" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Outline" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Outline-Rounded" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Padding" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Paragraph" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Paragraph formatting" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Pictogram" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Preview" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Quality" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Quick Upload" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Quote" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb +msgid "Qweb" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field +msgid "Qweb Field" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_contact +msgid "Qweb Field Contact" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_date +msgid "Qweb Field Date" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_datetime +msgid "Qweb Field Datetime" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_duration +msgid "Qweb Field Duration" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_float +msgid "Qweb Field Float" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_html +msgid "Qweb Field HTML" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_image +msgid "Qweb Field Image" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_integer +msgid "Qweb Field Integer" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_many2one +msgid "Qweb Field Many to One" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_monetary +msgid "Qweb Field Monetary" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_relative +msgid "Qweb Field Relative" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_selection +msgid "Qweb Field Selection" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_text +msgid "Qweb Field Text" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_qweb_field_qweb +msgid "Qweb Field qweb" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.js:0 +#, python-format +msgid "Readonly field" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Redo" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Reduce the quality as much as possible to increase performance." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Reduce the size as much as possible to increase performance." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Remove" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/snippets.xml:0 +#, python-format +msgid "Remove Block" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Remove Font Style" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Remove Image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Repeat" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Repeat both" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Repeat x" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Repeat y" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "Reset" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Reset Image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Reset to default" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "Reseting views is not supported yet" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Resize Full" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Resize Half" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Resize Quarter" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Resizing is not supported for images of type" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Rotate Left" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Rotate Right" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Rounded" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "SCSS (CSS)" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "SCSS file: %s" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/dialog.js:0 +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "Save" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/snippets.xml:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/snippets.xml:0 +#, python-format +msgid "Search Contact" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Search a document" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Search a pictogram" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Search an image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 +#, python-format +msgid "Select a Media" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Select from files" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "Server error" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Set the starting position of the background image." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "" +"Sets the width and height of the background image in percent of the parent " +"element." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Shadow" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Size" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Small" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Spin" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Strikethrough" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Style" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Subscript" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Superscript" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Table" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "Template ID: %s" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Text formatting" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Text to display" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "" +"The URL contains an image. The file will be added in the image section." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "" +"The URL does not contain any image. The file will be added in the document " +"section." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "The URL does not seem to work." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "The URL seems valid." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "" +"The image could not be deleted because it is used in the\n" +" following pages or views:" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 +#, python-format +msgid "The provided url does not reference any supported video" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 +#, python-format +msgid "The provided url is not valid" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg_colorpicker.xml:0 +#, python-format +msgid "Theme colors" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/editor.js:0 +#, python-format +msgid "This document is not saved!" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "This file is a public view attachment." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "This file is attached to the current record." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "This image is an external image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "This reduces the quality to increase performance." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "This type of image is not supported for cropping." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "To what URL should this link go?" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Tooltip" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/backend.xml:0 +#, python-format +msgid "Translate" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_translation +msgid "Translation" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Transparent" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg_colorpicker.xml:0 +#, python-format +msgid "Transparent colors" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "URL or Email" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Underline" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Undo" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/common/ace.js:0 +#, python-format +msgid "Unexpected " +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Unlink" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Unordered list" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Upload a document" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Upload an image" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "Vertical" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Video" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Video Link" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Video URL?" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Video code" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Videos are muted when autoplay is enabled" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_ir_ui_view +msgid "View" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "Views and Assets bundles" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Vimeo" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Vine.co" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_web_editor_converter_test_sub +msgid "Web Editor Converter Subtest" +msgstr "" + +#. module: web_editor +#: model:ir.model,name:web_editor.model_web_editor_converter_test +msgid "Web Editor Converter Test" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Width" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#: code:addons/web_editor/static/src/xml/ace.xml:0 +#, python-format +msgid "XML (HTML)" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 +#, python-format +msgid "Xl" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "" +"You can upload documents with the button located in the top left of the " +"screen." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "" +"You can upload images with the button located in the top left of the screen." +msgstr "" + +#. module: web_editor +#: code:addons/web_editor/controllers/main.py:0 +#, python-format +msgid "" +"You cannot change the quality, the width or the name of an URL attachment." +msgstr "" + +#. module: web_editor +#: code:addons/web_editor/controllers/main.py:0 +#, python-format +msgid "You need to specify either data or url to create an attachment." +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Youku" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Youtube" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Zoom In" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "Zoom Out" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "and" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#: code:addons/web_editor/static/src/xml/editor.xml:0 +#, python-format +msgid "auto" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "https://www.odoo.com/logo.png" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "https://www.odoo.com/mydocument" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "px" +msgstr "" + +#. module: web_editor +#. openerp-web +#: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 +#, python-format +msgid "videos" +msgstr "" diff --git a/addons/web_editor/i18n/lt.po b/addons/web_editor/i18n/lt.po index dd05e6aa446..ae4be330a7c 100644 --- a/addons/web_editor/i18n/lt.po +++ b/addons/web_editor/i18n/lt.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" "Last-Translator: Linas Versada <linaskrisiukenas@gmail.com>, 2019\n" "Language-Team: Lithuanian (https://www.transifex.com/odoo/teams/41243/lt/)\n" @@ -147,11 +147,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Pridėti blokus" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -248,7 +243,6 @@ msgstr "Automatinis paleidimas" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Fono spalva" @@ -303,6 +297,11 @@ msgid "Block" msgstr "Blokuoti" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -345,6 +344,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -444,13 +448,6 @@ msgstr "Pasirinktinė spalva" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Pritaikyti" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -526,13 +523,6 @@ msgstr "Tempkite paveikslėlį čia" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Perkelkite tempdami" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Kopijuoti konteinerį" @@ -957,11 +947,6 @@ msgid "Keyboard shortcuts" msgstr "Klaviatūros spartieji klavišai" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1126,6 +1111,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Pasirinkimai" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1199,21 +1189,6 @@ msgid "Preview" msgstr "Peržiūra" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1292,7 +1267,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1538,13 +1513,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Pasirinkite tėvinį konteinerį" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/mn.po b/addons/web_editor/i18n/mn.po index 2df211bb0fc..338c9f14bf2 100644 --- a/addons/web_editor/i18n/mn.po +++ b/addons/web_editor/i18n/mn.po @@ -7,16 +7,16 @@ # Onii Onii <onii0223@yahoo.com>, 2019 # nurbakhit nurka <nurbakhit@bumanit.mn>, 2019 # Baskhuu Lodoikhuu <baskhuujacara@gmail.com>, 2019 -# Martin Trigaux, 2019 # Otgonbayar.A <gobi.mn@gmail.com>, 2019 +# Martin Trigaux, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Otgonbayar.A <gobi.mn@gmail.com>, 2019\n" +"Last-Translator: Martin Trigaux, 2019\n" "Language-Team: Mongolian (https://www.transifex.com/odoo/teams/41243/mn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -139,11 +139,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Блок нэмэх" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -240,7 +235,6 @@ msgstr "Автомат тоглох" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Дэвсгэр өнгө" @@ -295,6 +289,11 @@ msgid "Block" msgstr "Блок" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -337,6 +336,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -436,13 +440,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Өөриймшүүлэх" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -518,13 +515,6 @@ msgstr "Зураг ийш нь чирнэ үү" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Зөөхдөө чирнэ" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Агуулагчийг хувилах" @@ -945,11 +935,6 @@ msgid "Keyboard shortcuts" msgstr "Гарын товчлол" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1114,6 +1099,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Сонголтууд" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1187,21 +1177,6 @@ msgid "Preview" msgstr "Урьдчилан харах" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1280,7 +1255,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1526,13 +1501,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Эцэг агуулагчийг сонгох" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/nb.po b/addons/web_editor/i18n/nb.po index 0866673376a..1ba07a098fa 100644 --- a/addons/web_editor/i18n/nb.po +++ b/addons/web_editor/i18n/nb.po @@ -4,17 +4,17 @@ # # Translators: # Aleksander, 2019 -# Martin Trigaux, 2019 # Jorunn D. Newth, 2019 # Marius Stedjan <marius@stedjan.com>, 2019 +# Martin Trigaux, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Marius Stedjan <marius@stedjan.com>, 2019\n" +"Last-Translator: Martin Trigaux, 2019\n" "Language-Team: Norwegian Bokmål (https://www.transifex.com/odoo/teams/41243/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -141,11 +141,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Legg til blokker" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -242,7 +237,6 @@ msgstr "Automatisk avspilling" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Bakgrunnsfarge" @@ -297,6 +291,11 @@ msgid "Block" msgstr "Blokker" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -339,6 +338,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -438,13 +442,6 @@ msgstr "Tilpasset farge" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Tilpass" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -520,13 +517,6 @@ msgstr "Dra et bilde hit" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Dra for å flytte" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Dupliser beholder" @@ -951,11 +941,6 @@ msgid "Keyboard shortcuts" msgstr "Tastesnarveier" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1120,6 +1105,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Valg" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1193,21 +1183,6 @@ msgid "Preview" msgstr "Forhåndsvisning" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1286,8 +1261,8 @@ msgstr "Qweb-felt Mange til én" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" -msgstr "Qweb-felt Valuta" +msgid "Qweb Field Monetary" +msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_relative @@ -1532,13 +1507,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Velg overordnet beholder" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/nl.po b/addons/web_editor/i18n/nl.po index 2538286dc6c..de8dd59005b 100644 --- a/addons/web_editor/i18n/nl.po +++ b/addons/web_editor/i18n/nl.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" "Last-Translator: Yenthe Van Ginneken <yenthespam@gmail.com>, 2019\n" "Language-Team: Dutch (https://www.transifex.com/odoo/teams/41243/nl/)\n" @@ -145,11 +145,6 @@ msgid "Add as image" msgstr "Voeg als afbeelding toe" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Voeg blokken toe" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -246,7 +241,6 @@ msgstr "Automatisch afspelen" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Achtergrondkleur" @@ -301,6 +295,11 @@ msgid "Block" msgstr "Blok" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "Blokken" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -345,6 +344,11 @@ msgid "Checklist" msgstr "Checklijst" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -444,13 +448,6 @@ msgstr "Aangepaste kleur" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Wijzigen" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -526,13 +523,6 @@ msgstr "Sleep een afbeelding naar hier" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Sleep om te verplaatsen" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Dupliceer container" @@ -959,11 +949,6 @@ msgid "Keyboard shortcuts" msgstr "Toetsenbord sneltoetsen" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1128,6 +1113,11 @@ msgid "Optimize" msgstr "Optimaliseren" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Opties" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1201,21 +1191,6 @@ msgid "Preview" msgstr "Voorbeeld" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1294,8 +1269,8 @@ msgstr "Qweb veld many to one" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" -msgstr "Qweb veld monetair" +msgid "Qweb Field Monetary" +msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_relative @@ -1540,13 +1515,6 @@ msgstr "Zoek een afbeelding" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Selecteer bovenliggende container" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/pl.po b/addons/web_editor/i18n/pl.po index 94388626bf2..9e17eeafb0c 100644 --- a/addons/web_editor/i18n/pl.po +++ b/addons/web_editor/i18n/pl.po @@ -4,7 +4,6 @@ # # Translators: # Grzegorz Grzelak <grzegorz.grzelak@openglobe.pl>, 2019 -# Judyta Kaźmierczak <judyta.kazmierczak@openglobe.pl>, 2019 # Tomasz Leppich <t.leppich@gmail.com>, 2019 # Mariusz, 2019 # Paweł Michoń <michon.pawel@wp.pl>, 2019 @@ -21,14 +20,15 @@ # Andrzej Donczew <a.donczew@hadron.eu.com>, 2019 # Radosław Biegalski <radoslaw.biegalski@openglobe.pl>, 2019 # Paweł Wodyński <pw@myodoo.pl>, 2019 +# Judyta Kaźmierczak <judyta.kazmierczak@openglobe.pl>, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Paweł Wodyński <pw@myodoo.pl>, 2019\n" +"Last-Translator: Judyta Kaźmierczak <judyta.kazmierczak@openglobe.pl>, 2019\n" "Language-Team: Polish (https://www.transifex.com/odoo/teams/41243/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -151,11 +151,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Dodaj bloki" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -252,7 +247,6 @@ msgstr "Autoplay" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Kolor tła" @@ -307,6 +301,11 @@ msgid "Block" msgstr "Blokuj" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -349,6 +348,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -448,13 +452,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Dostosuj" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -530,13 +527,6 @@ msgstr "Przeciągnij obraz tutaj " #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Przeciągnij, żeby przesunąć" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Zduplikuj pojemnik" @@ -959,11 +949,6 @@ msgid "Keyboard shortcuts" msgstr "Skróty klawiszowe " #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1128,6 +1113,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Opcje" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1201,21 +1191,6 @@ msgid "Preview" msgstr "Podgląd" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1294,7 +1269,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1540,13 +1515,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Wybierz kontener nadrzędny" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/pt_BR.po b/addons/web_editor/i18n/pt_BR.po index a71d4a66716..8ee124ec47f 100644 --- a/addons/web_editor/i18n/pt_BR.po +++ b/addons/web_editor/i18n/pt_BR.po @@ -5,11 +5,9 @@ # Translators: # Rafael H L Moretti <rafael.moretti@gmail.com>, 2019 # danimaribeiro <danimaribeiro@gmail.com>, 2019 -# Rui Andrada <shingonoide@gmail.com>, 2019 # Emanuel Martins <emanuel.breno@gmail.com>, 2019 # Luiz Carlos de Lima <luiz.carlos@akretion.com.br>, 2019 # Caio Leonardo Mendes de Sousa <caleozao@gmail.com>, 2019 -# falexandresilva <falexandresilva@gmail.com>, 2019 # Yannick Belot <yannickbh@gmail.com>, 2019 # André Augusto Firmino Cordeiro <a.cordeito@gmail.com>, 2019 # Silmar <pinheirosilmar@gmail.com>, 2019 @@ -18,17 +16,17 @@ # Martin Trigaux, 2019 # Marcel Savegnago <marcel.savegnago@gmail.com>, 2019 # Mateus Lopes <mateus1@gmail.com>, 2019 -# Thiago MACÊDO <thiago95macedo@gmail.com>, 2019 # grazziano <gra.negocia@gmail.com>, 2019 # Thiago Menezes <thg.mnzs@gmail.com>, 2019 +# falexandresilva <falexandresilva@gmail.com>, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Thiago Menezes <thg.mnzs@gmail.com>, 2019\n" +"Last-Translator: falexandresilva <falexandresilva@gmail.com>, 2019\n" "Language-Team: Portuguese (Brazil) (https://www.transifex.com/odoo/teams/41243/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -151,11 +149,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Adicionar blocos" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -252,7 +245,6 @@ msgstr "Reprodução Automática" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Cor de Fundo" @@ -307,6 +299,11 @@ msgid "Block" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -349,6 +346,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -448,13 +450,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Personalize" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -530,13 +525,6 @@ msgstr "" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Arraste para mover" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Duplicar container" @@ -955,11 +943,6 @@ msgid "Keyboard shortcuts" msgstr "" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1124,6 +1107,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Opções" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1197,21 +1185,6 @@ msgid "Preview" msgstr "Visualizar" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1290,7 +1263,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1536,13 +1509,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/ru.po b/addons/web_editor/i18n/ru.po index 2d19f8a14ab..7f646f9c2cd 100644 --- a/addons/web_editor/i18n/ru.po +++ b/addons/web_editor/i18n/ru.po @@ -8,18 +8,18 @@ # Denis Trepalin <zekarious@gmail.com>, 2019 # Vasiliy Korobatov <korobatov@gmail.com>, 2019 # Oleg Kuryan <oleg@ventor.tech>, 2019 -# Martin Trigaux, 2019 # Collex100, 2019 # Amaro Vita <vita.amaro@gmail.com>, 2019 # Viktor Pogrebniak <vp@aifil.ru>, 2019 +# Martin Trigaux, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Viktor Pogrebniak <vp@aifil.ru>, 2019\n" +"Last-Translator: Martin Trigaux, 2019\n" "Language-Team: Russian (https://www.transifex.com/odoo/teams/41243/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -142,11 +142,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Добавить блоки" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -243,7 +238,6 @@ msgstr "Автозапуск" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Цвет фона" @@ -298,6 +292,11 @@ msgid "Block" msgstr "Блокировка" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -340,6 +339,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -439,13 +443,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Настройка" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -521,13 +518,6 @@ msgstr "Перетащите сюда картинку" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Нажмите и удерживайте, чтобы переместить" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Дублировать элемент" @@ -948,11 +938,6 @@ msgid "Keyboard shortcuts" msgstr "Горячие клавиши" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1117,6 +1102,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Параметры" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1190,21 +1180,6 @@ msgid "Preview" msgstr "Просмотр" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1283,7 +1258,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1529,13 +1504,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Выберите родительский контейнер" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/tr.po b/addons/web_editor/i18n/tr.po index a7c9f95c644..3a5cca6a69b 100644 --- a/addons/web_editor/i18n/tr.po +++ b/addons/web_editor/i18n/tr.po @@ -16,18 +16,18 @@ # Ediz Duman <neps1192@gmail.com>, 2019 # Martin Trigaux, 2019 # Levent Karakaş <levent@mektup.at>, 2019 -# Murat Kaplan <muratk@projetgrup.com>, 2019 # Ertuğrul Güreş <ertugrulg@projetgrup.com>, 2019 # Umur Akın <umura@projetgrup.com>, 2019 # ANIL TAN SAĞIR <anils@projetgrup.com>, 2019 +# Murat Kaplan <muratk@projetgrup.com>, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: ANIL TAN SAĞIR <anils@projetgrup.com>, 2019\n" +"Last-Translator: Murat Kaplan <muratk@projetgrup.com>, 2019\n" "Language-Team: Turkish (https://www.transifex.com/odoo/teams/41243/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -150,11 +150,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Reklam Engelleyici" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -251,7 +246,6 @@ msgstr "Otomatik oynat" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Arkaplan Rengi" @@ -306,6 +300,11 @@ msgid "Block" msgstr "Engelle" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -348,6 +347,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -447,13 +451,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Özelleştirme" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -529,13 +526,6 @@ msgstr "Buraya bir fotoğraf sürükleyin" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Sürükle & Bırak Bir Banner" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Konteyneri Çoğalt" @@ -958,11 +948,6 @@ msgid "Keyboard shortcuts" msgstr "Klavye kısa yolları" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1127,6 +1112,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Seçenekler" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1200,21 +1190,6 @@ msgid "Preview" msgstr "Önizle" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1293,7 +1268,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1539,13 +1514,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Üst Kapsayıcı Seç" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/uk.po b/addons/web_editor/i18n/uk.po index d75e7eb8b3e..8b5814742c7 100644 --- a/addons/web_editor/i18n/uk.po +++ b/addons/web_editor/i18n/uk.po @@ -5,18 +5,18 @@ # Translators: # Zoriana Zaiats, 2019 # zhanna shewchuk <zhanna_shewchuk@rambler.ru>, 2019 -# Martin Trigaux, 2019 # Bohdan Lisnenko, 2019 # ТАрас <tratatuta@i.ua>, 2019 # Alina Lisnenko <alinasemeniuk1@gmail.com>, 2019 +# Martin Trigaux, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Alina Lisnenko <alinasemeniuk1@gmail.com>, 2019\n" +"Last-Translator: Martin Trigaux, 2019\n" "Language-Team: Ukrainian (https://www.transifex.com/odoo/teams/41243/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -145,11 +145,6 @@ msgid "Add as image" msgstr "Додати як зображення" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Додати блоки" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -246,7 +241,6 @@ msgstr "Автопрогравання" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Фоновий колір" @@ -301,6 +295,11 @@ msgid "Block" msgstr "Блокувати" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -343,6 +342,11 @@ msgid "Checklist" msgstr "Список" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -442,13 +446,6 @@ msgstr "Спеціальний колір" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Налаштувати" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -524,13 +521,6 @@ msgstr "Перетягніть картинку сюди" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Перетягніть, щоб перемістити" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Дублювати контейнер" @@ -959,11 +949,6 @@ msgid "Keyboard shortcuts" msgstr "Скорочення клавіатури" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1128,6 +1113,11 @@ msgid "Optimize" msgstr "Оптимізувати" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Опції" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1201,21 +1191,6 @@ msgid "Preview" msgstr "Попередній перегляд" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1294,8 +1269,8 @@ msgstr "Поле Qweb Many to One" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" -msgstr "Поле Qweb Monerary" +msgid "Qweb Field Monetary" +msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_relative @@ -1540,13 +1515,6 @@ msgstr "Пошук зображення" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Оберіть батьківський контейнер" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/vi.po b/addons/web_editor/i18n/vi.po index 46000f999d3..f8de9538d1f 100644 --- a/addons/web_editor/i18n/vi.po +++ b/addons/web_editor/i18n/vi.po @@ -9,19 +9,19 @@ # Minh Nguyen <ndminh210994@gmail.com>, 2019 # Martin Trigaux, 2019 # fanha99 <fanha99@hotmail.com>, 2019 -# Nancy Momoland <thanhnguyen.icsc@gmail.com>, 2019 # Duy BQ <duybq86@gmail.com>, 2019 # Chinh Chinh <trinhttp@trobz.com>, 2019 # Dung Nguyen Thi <dungnt@trobz.com>, 2019 # Dao Nguyen <trucdao.uel@gmail.com>, 2019 +# Nancy Momoland <thanhnguyen.icsc@gmail.com>, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: Dao Nguyen <trucdao.uel@gmail.com>, 2019\n" +"Last-Translator: Nancy Momoland <thanhnguyen.icsc@gmail.com>, 2019\n" "Language-Team: Vietnamese (https://www.transifex.com/odoo/teams/41243/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -144,11 +144,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "Thêm Khối" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -245,7 +240,6 @@ msgstr "Chơi tự động" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "Màu nền" @@ -300,6 +294,11 @@ msgid "Block" msgstr "Chặn Sản xuất" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -342,6 +341,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -441,13 +445,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "Tuỳ chỉnh" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -523,13 +520,6 @@ msgstr "Kéo một hình vào đây" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "Rê để di chuyển" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "Nhân bản Khung chứa" @@ -950,11 +940,6 @@ msgid "Keyboard shortcuts" msgstr "Phím tắt Bàn phím" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1119,6 +1104,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "Tùy chọn" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1192,21 +1182,6 @@ msgid "Preview" msgstr "Xem trước" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1285,7 +1260,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" +msgid "Qweb Field Monetary" msgstr "" #. module: web_editor @@ -1531,13 +1506,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "Chọn Khung chứa" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/zh_CN.po b/addons/web_editor/i18n/zh_CN.po index 425dbfb3d0a..a5c62d6db50 100644 --- a/addons/web_editor/i18n/zh_CN.po +++ b/addons/web_editor/i18n/zh_CN.po @@ -7,7 +7,6 @@ # Gary Wei <Gary.wei@elico-corp.com>, 2019 # ChinaMaker <liuct@chinamaker.net>, 2019 # John An <johnxan@163.com>, 2019 -# Martin Trigaux, 2019 # Jeffery CHEN <jeffery9@gmail.com>, 2019 # liAnGjiA <liangjia@qq.com>, 2019 # v2exerer <9010446@qq.com>, 2019 @@ -22,14 +21,15 @@ # Lisa Zhang <lzh@odoo.com>, 2019 # snow wang <147156565@qq.com>, 2019 # inspur qiuguodong <qiuguodong@inspur.com>, 2019 +# Martin Trigaux, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: inspur qiuguodong <qiuguodong@inspur.com>, 2019\n" +"Last-Translator: Martin Trigaux, 2019\n" "Language-Team: Chinese (China) (https://www.transifex.com/odoo/teams/41243/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -152,11 +152,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "添加区块" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -253,7 +248,6 @@ msgstr "自动播放" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "背景颜色" @@ -308,6 +302,11 @@ msgid "Block" msgstr "阻塞" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -350,6 +349,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -449,13 +453,6 @@ msgstr "自定义颜色" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "定制" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -531,13 +528,6 @@ msgstr "这里拖进来一张图像" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "拖动" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "复制的容器" @@ -956,11 +946,6 @@ msgid "Keyboard shortcuts" msgstr "键盘快捷键" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1125,6 +1110,11 @@ msgid "Optimize" msgstr "优化" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "选项" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1198,21 +1188,6 @@ msgid "Preview" msgstr "预览" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1291,8 +1266,8 @@ msgstr "Qweb多对一字段" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" -msgstr "Qweb金钱字段" +msgid "Qweb Field Monetary" +msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_relative @@ -1537,13 +1512,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "选择父容器" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/i18n/zh_TW.po b/addons/web_editor/i18n/zh_TW.po index 680e66cbe51..e72a6d9f16f 100644 --- a/addons/web_editor/i18n/zh_TW.po +++ b/addons/web_editor/i18n/zh_TW.po @@ -4,17 +4,17 @@ # # Translators: # Bill Hsu <hcm86@icloud.com>, 2019 -# Martin Trigaux, 2019 # Andy Cheng <andy.cheng@richsoda.com>, 2019 # 敬雲 林 <chingyun@yuanchih-consult.com>, 2019 +# Martin Trigaux, 2019 # msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~12.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-26 08:17+0000\n" +"POT-Creation-Date: 2019-09-13 11:28+0000\n" "PO-Revision-Date: 2019-08-26 09:15+0000\n" -"Last-Translator: 敬雲 林 <chingyun@yuanchih-consult.com>, 2019\n" +"Last-Translator: Martin Trigaux, 2019\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/odoo/teams/41243/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -137,11 +137,6 @@ msgid "Add as image" msgstr "" #. module: web_editor -#: model_terms:ir.ui.view,arch_db:web_editor.snippets -msgid "Add blocks" -msgstr "添加區塊" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -238,7 +233,6 @@ msgstr "自動播放" #. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 -#: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format msgid "Background Color" msgstr "背景顏色" @@ -293,6 +287,11 @@ msgid "Block" msgstr "阻塞" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Blocks" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #, python-format @@ -335,6 +334,11 @@ msgid "Checklist" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Click in the page to customize" +msgstr "" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js:0 @@ -434,13 +438,6 @@ msgstr "自定義顏色" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Customize" -msgstr "自訂" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format msgid "Dailymotion" @@ -516,13 +513,6 @@ msgstr "這裡拖進來一張圖像" #. openerp-web #: code:addons/web_editor/static/src/xml/snippets.xml:0 #, python-format -msgid "Drag to Move" -msgstr "拖動" - -#. module: web_editor -#. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format msgid "Duplicate Container" msgstr "複製的容器" @@ -941,11 +931,6 @@ msgid "Keyboard shortcuts" msgstr "鍵盤快捷鍵" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__d -msgid "La réponse D" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/js/editor/rte.summernote.js:0 #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 @@ -1110,6 +1095,11 @@ msgid "Optimize" msgstr "" #. module: web_editor +#: model_terms:ir.ui.view,arch_db:web_editor.snippets +msgid "Options" +msgstr "選項" + +#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1183,21 +1173,6 @@ msgid "Preview" msgstr "預覽" #. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__c -msgid "Qu'est-ce qu'il fout ce maudit pancake, tabernacle ?" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__a -msgid "Qu'il n'est pas arrivé à Toronto" -msgstr "" - -#. module: web_editor -#: model:ir.model.fields.selection,name:web_editor.selection__web_editor_converter_test__selection_str__b -msgid "Qu'il était supposé arriver à Toronto" -msgstr "" - -#. module: web_editor #. openerp-web #: code:addons/web_editor/static/src/xml/wysiwyg.xml:0 #, python-format @@ -1276,8 +1251,8 @@ msgstr "Qweb多對一字段" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_monetary -msgid "Qweb Field Monerary" -msgstr "Qweb貨幣字段" +msgid "Qweb Field Monetary" +msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_relative @@ -1522,13 +1497,6 @@ msgstr "" #. module: web_editor #. openerp-web -#: code:addons/web_editor/static/src/xml/snippets.xml:0 -#, python-format -msgid "Select Parent Container" -msgstr "選擇父容器" - -#. module: web_editor -#. openerp-web #: code:addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js:0 #, python-format msgid "Select a Media" diff --git a/addons/web_editor/static/lib/cropper/js/cropper.js b/addons/web_editor/static/lib/cropper/js/cropper.js deleted file mode 100644 index 2db396e253b..00000000000 --- a/addons/web_editor/static/lib/cropper/js/cropper.js +++ /dev/null @@ -1,3288 +0,0 @@ -/*! - * Cropper v3.1.4 - * https://github.com/fengyuanchen/cropper - * - * Copyright (c) 2014-2018 Chen Fengyuan - * Released under the MIT license - * - * Date: 2018-01-13T09:37:52.890Z - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) : - typeof define === 'function' && define.amd ? define(['jquery'], factory) : - (factory(global.jQuery)); -}(this, (function ($) { 'use strict'; - -$ = $ && $.hasOwnProperty('default') ? $['default'] : $; - -var WINDOW = typeof window !== 'undefined' ? window : {}; -var NAMESPACE = 'cropper'; - -// Actions -var ACTION_ALL = 'all'; -var ACTION_CROP = 'crop'; -var ACTION_MOVE = 'move'; -var ACTION_ZOOM = 'zoom'; -var ACTION_EAST = 'e'; -var ACTION_WEST = 'w'; -var ACTION_SOUTH = 's'; -var ACTION_NORTH = 'n'; -var ACTION_NORTH_EAST = 'ne'; -var ACTION_NORTH_WEST = 'nw'; -var ACTION_SOUTH_EAST = 'se'; -var ACTION_SOUTH_WEST = 'sw'; - -// Classes -var CLASS_CROP = NAMESPACE + '-crop'; -var CLASS_DISABLED = NAMESPACE + '-disabled'; -var CLASS_HIDDEN = NAMESPACE + '-hidden'; -var CLASS_HIDE = NAMESPACE + '-hide'; -var CLASS_INVISIBLE = NAMESPACE + '-invisible'; -var CLASS_MODAL = NAMESPACE + '-modal'; -var CLASS_MOVE = NAMESPACE + '-move'; - -// Data keys -var DATA_ACTION = 'action'; -var DATA_PREVIEW = 'preview'; - -// Drag modes -var DRAG_MODE_CROP = 'crop'; -var DRAG_MODE_MOVE = 'move'; -var DRAG_MODE_NONE = 'none'; - -// Events -var EVENT_CROP = 'crop'; -var EVENT_CROP_END = 'cropend'; -var EVENT_CROP_MOVE = 'cropmove'; -var EVENT_CROP_START = 'cropstart'; -var EVENT_DBLCLICK = 'dblclick'; -var EVENT_ERROR = 'error'; -var EVENT_LOAD = 'load'; -var EVENT_POINTER_DOWN = WINDOW.PointerEvent ? 'pointerdown' : 'touchstart mousedown'; -var EVENT_POINTER_MOVE = WINDOW.PointerEvent ? 'pointermove' : 'touchmove mousemove'; -var EVENT_POINTER_UP = WINDOW.PointerEvent ? 'pointerup pointercancel' : 'touchend touchcancel mouseup'; -var EVENT_READY = 'ready'; -var EVENT_RESIZE = 'resize'; -var EVENT_WHEEL = 'wheel mousewheel DOMMouseScroll'; -var EVENT_ZOOM = 'zoom'; - -// RegExps -var REGEXP_ACTIONS = /^(e|w|s|n|se|sw|ne|nw|all|crop|move|zoom)$/; -var REGEXP_DATA_URL = /^data:/; -var REGEXP_DATA_URL_JPEG = /^data:image\/jpeg;base64,/; -var REGEXP_TAG_NAME = /^(img|canvas)$/i; - -var DEFAULTS = { - // Define the view mode of the cropper - viewMode: 0, // 0, 1, 2, 3 - - // Define the dragging mode of the cropper - dragMode: DRAG_MODE_CROP, // 'crop', 'move' or 'none' - - // Define the aspect ratio of the crop box - aspectRatio: NaN, - - // An object with the previous cropping result data - data: null, - - // A selector for adding extra containers to preview - preview: '', - - // Re-render the cropper when resize the window - responsive: true, - - // Restore the cropped area after resize the window - restore: true, - - // Check if the current image is a cross-origin image - checkCrossOrigin: true, - - // Check the current image's Exif Orientation information - checkOrientation: true, - - // Show the black modal - modal: true, - - // Show the dashed lines for guiding - guides: true, - - // Show the center indicator for guiding - center: true, - - // Show the white modal to highlight the crop box - highlight: true, - - // Show the grid background - background: true, - - // Enable to crop the image automatically when initialize - autoCrop: true, - - // Define the percentage of automatic cropping area when initializes - autoCropArea: 0.8, - - // Enable to move the image - movable: true, - - // Enable to rotate the image - rotatable: true, - - // Enable to scale the image - scalable: true, - - // Enable to zoom the image - zoomable: true, - - // Enable to zoom the image by dragging touch - zoomOnTouch: true, - - // Enable to zoom the image by wheeling mouse - zoomOnWheel: true, - - // Define zoom ratio when zoom the image by wheeling mouse - wheelZoomRatio: 0.1, - - // Enable to move the crop box - cropBoxMovable: true, - - // Enable to resize the crop box - cropBoxResizable: true, - - // Toggle drag mode between "crop" and "move" when click twice on the cropper - toggleDragModeOnDblclick: true, - - // Size limitation - minCanvasWidth: 0, - minCanvasHeight: 0, - minCropBoxWidth: 0, - minCropBoxHeight: 0, - minContainerWidth: 200, - minContainerHeight: 100, - - // Shortcuts of events - ready: null, - cropstart: null, - cropmove: null, - cropend: null, - crop: null, - zoom: null -}; - -var TEMPLATE = '<div class="cropper-container">' + '<div class="cropper-wrap-box">' + '<div class="cropper-canvas"></div>' + '</div>' + '<div class="cropper-drag-box"></div>' + '<div class="cropper-crop-box">' + '<span class="cropper-view-box"></span>' + '<span class="cropper-dashed dashed-h"></span>' + '<span class="cropper-dashed dashed-v"></span>' + '<span class="cropper-center"></span>' + '<span class="cropper-face"></span>' + '<span class="cropper-line line-e" data-action="e"></span>' + '<span class="cropper-line line-n" data-action="n"></span>' + '<span class="cropper-line line-w" data-action="w"></span>' + '<span class="cropper-line line-s" data-action="s"></span>' + '<span class="cropper-point point-e" data-action="e"></span>' + '<span class="cropper-point point-n" data-action="n"></span>' + '<span class="cropper-point point-w" data-action="w"></span>' + '<span class="cropper-point point-s" data-action="s"></span>' + '<span class="cropper-point point-ne" data-action="ne"></span>' + '<span class="cropper-point point-nw" data-action="nw"></span>' + '<span class="cropper-point point-sw" data-action="sw"></span>' + '<span class="cropper-point point-se" data-action="se"></span>' + '</div>' + '</div>'; - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -var toConsumableArray = function (arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - - return arr2; - } else { - return Array.from(arr); - } -}; - -/** - * Check if the given value is a string. - * @param {*} value - The value to check. - * @returns {boolean} Returns `true` if the given value is a string, else `false`. - */ -function isString(value) { - return typeof value === 'string'; -} - -/** - * Check if the given value is not a number. - */ -var isNaN = Number.isNaN || WINDOW.isNaN; - -/** - * Check if the given value is a number. - * @param {*} value - The value to check. - * @returns {boolean} Returns `true` if the given value is a number, else `false`. - */ -function isNumber(value) { - return typeof value === 'number' && !isNaN(value); -} - -/** - * Check if the given value is undefined. - * @param {*} value - The value to check. - * @returns {boolean} Returns `true` if the given value is undefined, else `false`. - */ -function isUndefined(value) { - return typeof value === 'undefined'; -} - -/** - * Takes a function and returns a new one that will always have a particular context. - * Custom proxy to avoid jQuery's guid. - * @param {Function} fn - The target function. - * @param {Object} context - The new context for the function. - * @returns {Function} The new function. - */ -function proxy(fn, context) { - for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { - args[_key - 2] = arguments[_key]; - } - - return function () { - for (var _len2 = arguments.length, args2 = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args2[_key2] = arguments[_key2]; - } - - return fn.apply(context, args.concat(args2)); - }; -} - -/** - * Get the own enumerable properties of a given object. - * @param {Object} obj - The target object. - * @returns {Array} All the own enumerable properties of the given object. - */ -var objectKeys = Object.keys || function objectKeys(obj) { - var keys = []; - - $.each(obj, function (key) { - keys.push(key); - }); - - return keys; -}; - -var REGEXP_DECIMALS = /\.\d*(?:0|9){12}\d*$/i; - -/** - * Normalize decimal number. - * Check out {@link http://0.30000000000000004.com/ } - * @param {number} value - The value to normalize. - * @param {number} [times=100000000000] - The times for normalizing. - * @returns {number} Returns the normalized number. - */ -function normalizeDecimalNumber(value) { - var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000; - - return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value; -} - -var location = WINDOW.location; - -var REGEXP_ORIGINS = /^(https?:)\/\/([^:/?#]+):?(\d*)/i; - -/** - * Check if the given URL is a cross origin URL. - * @param {string} url - The target URL. - * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`. - */ -function isCrossOriginURL(url) { - var parts = url.match(REGEXP_ORIGINS); - - return parts && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port); -} - -/** - * Add timestamp to the given URL. - * @param {string} url - The target URL. - * @returns {string} The result URL. - */ -function addTimestamp(url) { - var timestamp = 'timestamp=' + new Date().getTime(); - - return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp; -} - -/** - * Get transform values base on the given object. - * @param {Object} obj - The target object. - * @returns {string} A string contains transform values. - */ -function getTransformValues(_ref) { - var rotate = _ref.rotate, - scaleX = _ref.scaleX, - scaleY = _ref.scaleY, - translateX = _ref.translateX, - translateY = _ref.translateY; - - var values = []; - - if (isNumber(translateX) && translateX !== 0) { - values.push('translateX(' + translateX + 'px)'); - } - - if (isNumber(translateY) && translateY !== 0) { - values.push('translateY(' + translateY + 'px)'); - } - - // Rotate should come first before scale to match orientation transform - if (isNumber(rotate) && rotate !== 0) { - values.push('rotate(' + rotate + 'deg)'); - } - - if (isNumber(scaleX) && scaleX !== 1) { - values.push('scaleX(' + scaleX + ')'); - } - - if (isNumber(scaleY) && scaleY !== 1) { - values.push('scaleY(' + scaleY + ')'); - } - - return values.length ? values.join(' ') : 'none'; -} - -var navigator = WINDOW.navigator; - -var IS_SAFARI_OR_UIWEBVIEW = navigator && /(Macintosh|iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent); - -/** - * Get an image's natural sizes. - * @param {string} image - The target image. - * @param {Function} callback - The callback function. - */ -function getImageNaturalSizes(image, callback) { - // Modern browsers (except Safari) - if (image.naturalWidth && !IS_SAFARI_OR_UIWEBVIEW) { - callback(image.naturalWidth, image.naturalHeight); - return; - } - - var newImage = document.createElement('img'); - - newImage.onload = function () { - callback(newImage.width, newImage.height); - }; - - newImage.src = image.src; -} - -/** - * Get the max ratio of a group of pointers. - * @param {string} pointers - The target pointers. - * @returns {number} The result ratio. - */ -function getMaxZoomRatio(pointers) { - var pointers2 = $.extend({}, pointers); - var ratios = []; - - $.each(pointers, function (pointerId, pointer) { - delete pointers2[pointerId]; - - $.each(pointers2, function (pointerId2, pointer2) { - var x1 = Math.abs(pointer.startX - pointer2.startX); - var y1 = Math.abs(pointer.startY - pointer2.startY); - var x2 = Math.abs(pointer.endX - pointer2.endX); - var y2 = Math.abs(pointer.endY - pointer2.endY); - var z1 = Math.sqrt(x1 * x1 + y1 * y1); - var z2 = Math.sqrt(x2 * x2 + y2 * y2); - var ratio = (z2 - z1) / z1; - - ratios.push(ratio); - }); - }); - - ratios.sort(function (a, b) { - return Math.abs(a) < Math.abs(b); - }); - - return ratios[0]; -} - -/** - * Get a pointer from an event object. - * @param {Object} event - The target event object. - * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not. - * @returns {Object} The result pointer contains start and/or end point coordinates. - */ -function getPointer(_ref2, endOnly) { - var pageX = _ref2.pageX, - pageY = _ref2.pageY; - - var end = { - endX: pageX, - endY: pageY - }; - - if (endOnly) { - return end; - } - - return $.extend({ - startX: pageX, - startY: pageY - }, end); -} - -/** - * Get the center point coordinate of a group of pointers. - * @param {Object} pointers - The target pointers. - * @returns {Object} The center point coordinate. - */ -function getPointersCenter(pointers) { - var pageX = 0; - var pageY = 0; - var count = 0; - - $.each(pointers, function (pointerId, _ref3) { - var startX = _ref3.startX, - startY = _ref3.startY; - - pageX += startX; - pageY += startY; - count += 1; - }); - - pageX /= count; - pageY /= count; - - return { - pageX: pageX, - pageY: pageY - }; -} - -/** - * Check if the given value is a finite number. - */ -var isFinite = Number.isFinite || WINDOW.isFinite; - -/** - * Get the max sizes in a rectangle under the given aspect ratio. - * @param {Object} data - The original sizes. - * @returns {Object} The result sizes. - */ -function getContainSizes(_ref4) { - var aspectRatio = _ref4.aspectRatio, - height = _ref4.height, - width = _ref4.width; - - var isValidNumber = function isValidNumber(value) { - return isFinite(value) && value > 0; - }; - - if (isValidNumber(width) && isValidNumber(height)) { - if (height * aspectRatio > width) { - height = width / aspectRatio; - } else { - width = height * aspectRatio; - } - } else if (isValidNumber(width)) { - height = width / aspectRatio; - } else if (isValidNumber(height)) { - width = height * aspectRatio; - } - - return { - width: width, - height: height - }; -} - -/** - * Get the new sizes of a rectangle after rotated. - * @param {Object} data - The original sizes. - * @returns {Object} The result sizes. - */ -function getRotatedSizes(_ref5) { - var width = _ref5.width, - height = _ref5.height, - degree = _ref5.degree; - - degree = Math.abs(degree) % 180; - - if (degree === 90) { - return { - width: height, - height: width - }; - } - - var arc = degree % 90 * Math.PI / 180; - var sinArc = Math.sin(arc); - var cosArc = Math.cos(arc); - var newWidth = width * cosArc + height * sinArc; - var newHeight = width * sinArc + height * cosArc; - - return degree > 90 ? { - width: newHeight, - height: newWidth - } : { - width: newWidth, - height: newHeight - }; -} - -/** - * Get a canvas which drew the given image. - * @param {HTMLImageElement} image - The image for drawing. - * @param {Object} imageData - The image data. - * @param {Object} canvasData - The canvas data. - * @param {Object} options - The options. - * @returns {HTMLCanvasElement} The result canvas. - */ -function getSourceCanvas(image, _ref6, _ref7, _ref8) { - var imageNaturalWidth = _ref6.naturalWidth, - imageNaturalHeight = _ref6.naturalHeight, - _ref6$rotate = _ref6.rotate, - rotate = _ref6$rotate === undefined ? 0 : _ref6$rotate, - _ref6$scaleX = _ref6.scaleX, - scaleX = _ref6$scaleX === undefined ? 1 : _ref6$scaleX, - _ref6$scaleY = _ref6.scaleY, - scaleY = _ref6$scaleY === undefined ? 1 : _ref6$scaleY; - var aspectRatio = _ref7.aspectRatio, - naturalWidth = _ref7.naturalWidth, - naturalHeight = _ref7.naturalHeight; - var _ref8$fillColor = _ref8.fillColor, - fillColor = _ref8$fillColor === undefined ? 'transparent' : _ref8$fillColor, - _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled, - imageSmoothingEnabled = _ref8$imageSmoothingE === undefined ? true : _ref8$imageSmoothingE, - _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality, - imageSmoothingQuality = _ref8$imageSmoothingQ === undefined ? 'low' : _ref8$imageSmoothingQ, - _ref8$maxWidth = _ref8.maxWidth, - maxWidth = _ref8$maxWidth === undefined ? Infinity : _ref8$maxWidth, - _ref8$maxHeight = _ref8.maxHeight, - maxHeight = _ref8$maxHeight === undefined ? Infinity : _ref8$maxHeight, - _ref8$minWidth = _ref8.minWidth, - minWidth = _ref8$minWidth === undefined ? 0 : _ref8$minWidth, - _ref8$minHeight = _ref8.minHeight, - minHeight = _ref8$minHeight === undefined ? 0 : _ref8$minHeight; - - var maxSizes = getContainSizes({ - aspectRatio: aspectRatio, - width: maxWidth, - height: maxHeight - }); - var minSizes = getContainSizes({ - aspectRatio: aspectRatio, - width: minWidth, - height: minHeight - }); - var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth)); - var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight)); - var canvas = document.createElement('canvas'); - var context = canvas.getContext('2d'); - var params = [-imageNaturalWidth / 2, -imageNaturalHeight / 2, imageNaturalWidth, imageNaturalHeight]; - - canvas.width = normalizeDecimalNumber(width); - canvas.height = normalizeDecimalNumber(height); - context.fillStyle = fillColor; - context.fillRect(0, 0, width, height); - context.save(); - context.translate(width / 2, height / 2); - context.rotate(rotate * Math.PI / 180); - context.scale(scaleX, scaleY); - context.imageSmoothingEnabled = !!imageSmoothingEnabled; - context.imageSmoothingQuality = imageSmoothingQuality; - context.drawImage.apply(context, [image].concat(toConsumableArray($.map(params, function (param) { - return Math.floor(normalizeDecimalNumber(param)); - })))); - context.restore(); - return canvas; -} - -var fromCharCode = String.fromCharCode; - -/** - * Get string from char code in data view. - * @param {DataView} dataView - The data view for read. - * @param {number} start - The start index. - * @param {number} length - The read length. - * @returns {string} The read result. - */ - -function getStringFromCharCode(dataView, start, length) { - var str = ''; - var i = void 0; - - length += start; - - for (i = start; i < length; i += 1) { - str += fromCharCode(dataView.getUint8(i)); - } - - return str; -} - -var REGEXP_DATA_URL_HEAD = /^data:.*,/; - -/** - * Transform Data URL to array buffer. - * @param {string} dataURL - The Data URL to transform. - * @returns {ArrayBuffer} The result array buffer. - */ -function dataURLToArrayBuffer(dataURL) { - var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, ''); - var binary = atob(base64); - var arrayBuffer = new ArrayBuffer(binary.length); - var uint8 = new Uint8Array(arrayBuffer); - - $.each(uint8, function (i) { - uint8[i] = binary.charCodeAt(i); - }); - - return arrayBuffer; -} - -/** - * Transform array buffer to Data URL. - * @param {ArrayBuffer} arrayBuffer - The array buffer to transform. - * @param {string} mimeType - The mime type of the Data URL. - * @returns {string} The result Data URL. - */ -function arrayBufferToDataURL(arrayBuffer, mimeType) { - var uint8 = new Uint8Array(arrayBuffer); - var data = ''; - - // TypedArray.prototype.forEach is not supported in some browsers. - $.each(uint8, function (i, value) { - data += fromCharCode(value); - }); - - return 'data:' + mimeType + ';base64,' + btoa(data); -} - -/** - * Get orientation value from given array buffer. - * @param {ArrayBuffer} arrayBuffer - The array buffer to read. - * @returns {number} The read orientation value. - */ -function getOrientation(arrayBuffer) { - var dataView = new DataView(arrayBuffer); - var orientation = void 0; - var littleEndian = void 0; - var app1Start = void 0; - var ifdStart = void 0; - - // Only handle JPEG image (start by 0xFFD8) - if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) { - var length = dataView.byteLength; - var offset = 2; - - while (offset < length) { - if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) { - app1Start = offset; - break; - } - - offset += 1; - } - } - - if (app1Start) { - var exifIDCode = app1Start + 4; - var tiffOffset = app1Start + 10; - - if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') { - var endianness = dataView.getUint16(tiffOffset); - - littleEndian = endianness === 0x4949; - - if (littleEndian || endianness === 0x4D4D /* bigEndian */) { - if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) { - var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian); - - if (firstIFDOffset >= 0x00000008) { - ifdStart = tiffOffset + firstIFDOffset; - } - } - } - } - } - - if (ifdStart) { - var _length = dataView.getUint16(ifdStart, littleEndian); - var _offset = void 0; - var i = void 0; - - for (i = 0; i < _length; i += 1) { - _offset = ifdStart + i * 12 + 2; - - if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) { - // 8 is the offset of the current tag's value - _offset += 8; - - // Get the original orientation value - orientation = dataView.getUint16(_offset, littleEndian); - - // Override the orientation with its default value - dataView.setUint16(_offset, 1, littleEndian); - break; - } - } - } - - return orientation; -} - -/** - * Parse Exif Orientation value. - * @param {number} orientation - The orientation to parse. - * @returns {Object} The parsed result. - */ -function parseOrientation(orientation) { - var rotate = 0; - var scaleX = 1; - var scaleY = 1; - - switch (orientation) { - // Flip horizontal - case 2: - scaleX = -1; - break; - - // Rotate left 180° - case 3: - rotate = -180; - break; - - // Flip vertical - case 4: - scaleY = -1; - break; - - // Flip vertical and rotate right 90° - case 5: - rotate = 90; - scaleY = -1; - break; - - // Rotate right 90° - case 6: - rotate = 90; - break; - - // Flip horizontal and rotate right 90° - case 7: - rotate = 90; - scaleX = -1; - break; - - // Rotate left 90° - case 8: - rotate = -90; - break; - - default: - } - - return { - rotate: rotate, - scaleX: scaleX, - scaleY: scaleY - }; -} - -var render = { - render: function render() { - this.initContainer(); - this.initCanvas(); - this.initCropBox(); - this.renderCanvas(); - - if (this.cropped) { - this.renderCropBox(); - } - }, - initContainer: function initContainer() { - var $element = this.$element, - options = this.options, - $container = this.$container, - $cropper = this.$cropper; - - - $cropper.addClass(CLASS_HIDDEN); - $element.removeClass(CLASS_HIDDEN); - - $cropper.css(this.container = { - width: Math.max($container.width(), Number(options.minContainerWidth) || 200), - height: Math.max($container.height(), Number(options.minContainerHeight) || 100) - }); - - $element.addClass(CLASS_HIDDEN); - $cropper.removeClass(CLASS_HIDDEN); - }, - - - // Canvas (image wrapper) - initCanvas: function initCanvas() { - var container = this.container, - image = this.image; - var viewMode = this.options.viewMode; - - var rotated = Math.abs(image.rotate) % 180 === 90; - var naturalWidth = rotated ? image.naturalHeight : image.naturalWidth; - var naturalHeight = rotated ? image.naturalWidth : image.naturalHeight; - var aspectRatio = naturalWidth / naturalHeight; - var canvasWidth = container.width; - var canvasHeight = container.height; - - if (container.height * aspectRatio > container.width) { - if (viewMode === 3) { - canvasWidth = container.height * aspectRatio; - } else { - canvasHeight = container.width / aspectRatio; - } - } else if (viewMode === 3) { - canvasHeight = container.width / aspectRatio; - } else { - canvasWidth = container.height * aspectRatio; - } - - var canvas = { - aspectRatio: aspectRatio, - naturalWidth: naturalWidth, - naturalHeight: naturalHeight, - width: canvasWidth, - height: canvasHeight - }; - - canvas.left = (container.width - canvasWidth) / 2; - canvas.top = (container.height - canvasHeight) / 2; - canvas.oldLeft = canvas.left; - canvas.oldTop = canvas.top; - - this.canvas = canvas; - this.limited = viewMode === 1 || viewMode === 2; - this.limitCanvas(true, true); - this.initialImage = $.extend({}, image); - this.initialCanvas = $.extend({}, canvas); - }, - limitCanvas: function limitCanvas(isSizeLimited, isPositionLimited) { - var options = this.options, - container = this.container, - canvas = this.canvas, - cropBox = this.cropBox; - var viewMode = options.viewMode; - var aspectRatio = canvas.aspectRatio; - - var cropped = this.cropped && cropBox; - - if (isSizeLimited) { - var minCanvasWidth = Number(options.minCanvasWidth) || 0; - var minCanvasHeight = Number(options.minCanvasHeight) || 0; - - if (viewMode > 0) { - if (viewMode > 1) { - minCanvasWidth = Math.max(minCanvasWidth, container.width); - minCanvasHeight = Math.max(minCanvasHeight, container.height); - - if (viewMode === 3) { - if (minCanvasHeight * aspectRatio > minCanvasWidth) { - minCanvasWidth = minCanvasHeight * aspectRatio; - } else { - minCanvasHeight = minCanvasWidth / aspectRatio; - } - } - } else if (minCanvasWidth) { - minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBox.width : 0); - } else if (minCanvasHeight) { - minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBox.height : 0); - } else if (cropped) { - minCanvasWidth = cropBox.width; - minCanvasHeight = cropBox.height; - - if (minCanvasHeight * aspectRatio > minCanvasWidth) { - minCanvasWidth = minCanvasHeight * aspectRatio; - } else { - minCanvasHeight = minCanvasWidth / aspectRatio; - } - } - } - - var _getContainSizes = getContainSizes({ - aspectRatio: aspectRatio, - width: minCanvasWidth, - height: minCanvasHeight - }); - - minCanvasWidth = _getContainSizes.width; - minCanvasHeight = _getContainSizes.height; - - - canvas.minWidth = minCanvasWidth; - canvas.minHeight = minCanvasHeight; - canvas.maxWidth = Infinity; - canvas.maxHeight = Infinity; - } - - if (isPositionLimited) { - if (viewMode > 0) { - var newCanvasLeft = container.width - canvas.width; - var newCanvasTop = container.height - canvas.height; - - canvas.minLeft = Math.min(0, newCanvasLeft); - canvas.minTop = Math.min(0, newCanvasTop); - canvas.maxLeft = Math.max(0, newCanvasLeft); - canvas.maxTop = Math.max(0, newCanvasTop); - - if (cropped && this.limited) { - canvas.minLeft = Math.min(cropBox.left, cropBox.left + cropBox.width - canvas.width); - canvas.minTop = Math.min(cropBox.top, cropBox.top + cropBox.height - canvas.height); - canvas.maxLeft = cropBox.left; - canvas.maxTop = cropBox.top; - - if (viewMode === 2) { - if (canvas.width >= container.width) { - canvas.minLeft = Math.min(0, newCanvasLeft); - canvas.maxLeft = Math.max(0, newCanvasLeft); - } - - if (canvas.height >= container.height) { - canvas.minTop = Math.min(0, newCanvasTop); - canvas.maxTop = Math.max(0, newCanvasTop); - } - } - } - } else { - canvas.minLeft = -canvas.width; - canvas.minTop = -canvas.height; - canvas.maxLeft = container.width; - canvas.maxTop = container.height; - } - } - }, - renderCanvas: function renderCanvas(changed, transformed) { - var canvas = this.canvas, - image = this.image; - - - if (transformed) { - var _getRotatedSizes = getRotatedSizes({ - width: image.naturalWidth * Math.abs(image.scaleX || 1), - height: image.naturalHeight * Math.abs(image.scaleY || 1), - degree: image.rotate || 0 - }), - naturalWidth = _getRotatedSizes.width, - naturalHeight = _getRotatedSizes.height; - - var width = canvas.width * (naturalWidth / canvas.naturalWidth); - var height = canvas.height * (naturalHeight / canvas.naturalHeight); - - canvas.left -= (width - canvas.width) / 2; - canvas.top -= (height - canvas.height) / 2; - canvas.width = width; - canvas.height = height; - canvas.aspectRatio = naturalWidth / naturalHeight; - canvas.naturalWidth = naturalWidth; - canvas.naturalHeight = naturalHeight; - this.limitCanvas(true, false); - } - - if (canvas.width > canvas.maxWidth || canvas.width < canvas.minWidth) { - canvas.left = canvas.oldLeft; - } - - if (canvas.height > canvas.maxHeight || canvas.height < canvas.minHeight) { - canvas.top = canvas.oldTop; - } - - canvas.width = Math.min(Math.max(canvas.width, canvas.minWidth), canvas.maxWidth); - canvas.height = Math.min(Math.max(canvas.height, canvas.minHeight), canvas.maxHeight); - - this.limitCanvas(false, true); - - canvas.left = Math.min(Math.max(canvas.left, canvas.minLeft), canvas.maxLeft); - canvas.top = Math.min(Math.max(canvas.top, canvas.minTop), canvas.maxTop); - canvas.oldLeft = canvas.left; - canvas.oldTop = canvas.top; - - this.$canvas.css({ - width: canvas.width, - height: canvas.height, - transform: getTransformValues({ - translateX: canvas.left, - translateY: canvas.top - }) - }); - - this.renderImage(changed); - - if (this.cropped && this.limited) { - this.limitCropBox(true, true); - } - }, - renderImage: function renderImage(changed) { - var canvas = this.canvas, - image = this.image; - - var width = image.naturalWidth * (canvas.width / canvas.naturalWidth); - var height = image.naturalHeight * (canvas.height / canvas.naturalHeight); - - $.extend(image, { - width: width, - height: height, - left: (canvas.width - width) / 2, - top: (canvas.height - height) / 2 - }); - - this.$clone.css({ - width: image.width, - height: image.height, - transform: getTransformValues($.extend({ - translateX: image.left, - translateY: image.top - }, image)) - }); - - if (changed) { - this.output(); - } - }, - initCropBox: function initCropBox() { - var options = this.options, - canvas = this.canvas; - var aspectRatio = options.aspectRatio; - - var autoCropArea = Number(options.autoCropArea) || 0.8; - var cropBox = { - width: canvas.width, - height: canvas.height - }; - - if (aspectRatio) { - if (canvas.height * aspectRatio > canvas.width) { - cropBox.height = cropBox.width / aspectRatio; - } else { - cropBox.width = cropBox.height * aspectRatio; - } - } - - this.cropBox = cropBox; - this.limitCropBox(true, true); - - // Initialize auto crop area - cropBox.width = Math.min(Math.max(cropBox.width, cropBox.minWidth), cropBox.maxWidth); - cropBox.height = Math.min(Math.max(cropBox.height, cropBox.minHeight), cropBox.maxHeight); - - // The width of auto crop area must large than "minWidth", and the height too. (#164) - cropBox.width = Math.max(cropBox.minWidth, cropBox.width * autoCropArea); - cropBox.height = Math.max(cropBox.minHeight, cropBox.height * autoCropArea); - cropBox.left = canvas.left + (canvas.width - cropBox.width) / 2; - cropBox.top = canvas.top + (canvas.height - cropBox.height) / 2; - cropBox.oldLeft = cropBox.left; - cropBox.oldTop = cropBox.top; - - this.initialCropBox = $.extend({}, cropBox); - }, - limitCropBox: function limitCropBox(isSizeLimited, isPositionLimited) { - var options = this.options, - container = this.container, - canvas = this.canvas, - cropBox = this.cropBox, - limited = this.limited; - var aspectRatio = options.aspectRatio; - - - if (isSizeLimited) { - var minCropBoxWidth = Number(options.minCropBoxWidth) || 0; - var minCropBoxHeight = Number(options.minCropBoxHeight) || 0; - var maxCropBoxWidth = Math.min(container.width, limited ? canvas.width : container.width); - var maxCropBoxHeight = Math.min(container.height, limited ? canvas.height : container.height); - - // The min/maxCropBoxWidth/Height must be less than container's width/Height - minCropBoxWidth = Math.min(minCropBoxWidth, container.width); - minCropBoxHeight = Math.min(minCropBoxHeight, container.height); - - if (aspectRatio) { - if (minCropBoxWidth && minCropBoxHeight) { - if (minCropBoxHeight * aspectRatio > minCropBoxWidth) { - minCropBoxHeight = minCropBoxWidth / aspectRatio; - } else { - minCropBoxWidth = minCropBoxHeight * aspectRatio; - } - } else if (minCropBoxWidth) { - minCropBoxHeight = minCropBoxWidth / aspectRatio; - } else if (minCropBoxHeight) { - minCropBoxWidth = minCropBoxHeight * aspectRatio; - } - - if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) { - maxCropBoxHeight = maxCropBoxWidth / aspectRatio; - } else { - maxCropBoxWidth = maxCropBoxHeight * aspectRatio; - } - } - - // The minWidth/Height must be less than maxWidth/Height - cropBox.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth); - cropBox.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight); - cropBox.maxWidth = maxCropBoxWidth; - cropBox.maxHeight = maxCropBoxHeight; - } - - if (isPositionLimited) { - if (limited) { - cropBox.minLeft = Math.max(0, canvas.left); - cropBox.minTop = Math.max(0, canvas.top); - cropBox.maxLeft = Math.min(container.width, canvas.left + canvas.width) - cropBox.width; - cropBox.maxTop = Math.min(container.height, canvas.top + canvas.height) - cropBox.height; - } else { - cropBox.minLeft = 0; - cropBox.minTop = 0; - cropBox.maxLeft = container.width - cropBox.width; - cropBox.maxTop = container.height - cropBox.height; - } - } - }, - renderCropBox: function renderCropBox() { - var options = this.options, - container = this.container, - cropBox = this.cropBox; - - - if (cropBox.width > cropBox.maxWidth || cropBox.width < cropBox.minWidth) { - cropBox.left = cropBox.oldLeft; - } - - if (cropBox.height > cropBox.maxHeight || cropBox.height < cropBox.minHeight) { - cropBox.top = cropBox.oldTop; - } - - cropBox.width = Math.min(Math.max(cropBox.width, cropBox.minWidth), cropBox.maxWidth); - cropBox.height = Math.min(Math.max(cropBox.height, cropBox.minHeight), cropBox.maxHeight); - - this.limitCropBox(false, true); - - cropBox.left = Math.min(Math.max(cropBox.left, cropBox.minLeft), cropBox.maxLeft); - cropBox.top = Math.min(Math.max(cropBox.top, cropBox.minTop), cropBox.maxTop); - cropBox.oldLeft = cropBox.left; - cropBox.oldTop = cropBox.top; - - if (options.movable && options.cropBoxMovable) { - // Turn to move the canvas when the crop box is equal to the container - this.$face.data(DATA_ACTION, cropBox.width >= container.width && cropBox.height >= container.height ? ACTION_MOVE : ACTION_ALL); - } - - this.$cropBox.css({ - width: cropBox.width, - height: cropBox.height, - transform: getTransformValues({ - translateX: cropBox.left, - translateY: cropBox.top - }) - }); - - if (this.cropped && this.limited) { - this.limitCanvas(true, true); - } - - if (!this.disabled) { - this.output(); - } - }, - output: function output() { - this.preview(); - - if (this.completed) { - this.trigger(EVENT_CROP, this.getData()); - } - } -}; - -var preview = { - initPreview: function initPreview() { - var crossOrigin = this.crossOrigin; - - var url = crossOrigin ? this.crossOriginUrl : this.url; - var image = document.createElement('img'); - - if (crossOrigin) { - image.crossOrigin = crossOrigin; - } - - image.src = url; - - var $clone2 = $(image); - - this.$preview = $(this.options.preview); - this.$clone2 = $clone2; - this.$viewBox.html($clone2); - this.$preview.each(function (i, element) { - var $element = $(element); - var img = document.createElement('img'); - - // Save the original size for recover - $element.data(DATA_PREVIEW, { - width: $element.width(), - height: $element.height(), - html: $element.html() - }); - - if (crossOrigin) { - img.crossOrigin = crossOrigin; - } - - img.src = url; - - /** - * Override img element styles - * Add `display:block` to avoid margin top issue - * Add `height:auto` to override `height` attribute on IE8 - * (Occur only when margin-top <= -height) - */ - img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;"'; - - $element.html(img); - }); - }, - resetPreview: function resetPreview() { - this.$preview.each(function (i, element) { - var $element = $(element); - var data = $element.data(DATA_PREVIEW); - - $element.css({ - width: data.width, - height: data.height - }).html(data.html).removeData(DATA_PREVIEW); - }); - }, - preview: function preview() { - var image = this.image, - canvas = this.canvas, - cropBox = this.cropBox; - var cropBoxWidth = cropBox.width, - cropBoxHeight = cropBox.height; - var width = image.width, - height = image.height; - - var left = cropBox.left - canvas.left - image.left; - var top = cropBox.top - canvas.top - image.top; - - if (!this.cropped || this.disabled) { - return; - } - - this.$clone2.css({ - width: width, - height: height, - transform: getTransformValues($.extend({ - translateX: -left, - translateY: -top - }, image)) - }); - - this.$preview.each(function (i, element) { - var $element = $(element); - var data = $element.data(DATA_PREVIEW); - var originalWidth = data.width; - var originalHeight = data.height; - var newWidth = originalWidth; - var newHeight = originalHeight; - var ratio = 1; - - if (cropBoxWidth) { - ratio = originalWidth / cropBoxWidth; - newHeight = cropBoxHeight * ratio; - } - - if (cropBoxHeight && newHeight > originalHeight) { - ratio = originalHeight / cropBoxHeight; - newWidth = cropBoxWidth * ratio; - newHeight = originalHeight; - } - - $element.css({ - width: newWidth, - height: newHeight - }).find('img').css({ - width: width * ratio, - height: height * ratio, - transform: getTransformValues($.extend({ - translateX: -left * ratio, - translateY: -top * ratio - }, image)) - }); - }); - } -}; - -var events = { - bind: function bind() { - var $element = this.$element, - options = this.options, - $cropper = this.$cropper; - - - if ($.isFunction(options.cropstart)) { - $element.on(EVENT_CROP_START, options.cropstart); - } - - if ($.isFunction(options.cropmove)) { - $element.on(EVENT_CROP_MOVE, options.cropmove); - } - - if ($.isFunction(options.cropend)) { - $element.on(EVENT_CROP_END, options.cropend); - } - - if ($.isFunction(options.crop)) { - $element.on(EVENT_CROP, options.crop); - } - - if ($.isFunction(options.zoom)) { - $element.on(EVENT_ZOOM, options.zoom); - } - - $cropper.on(EVENT_POINTER_DOWN, proxy(this.cropStart, this)); - - if (options.zoomable && options.zoomOnWheel) { - $cropper.on(EVENT_WHEEL, proxy(this.wheel, this)); - } - - if (options.toggleDragModeOnDblclick) { - $cropper.on(EVENT_DBLCLICK, proxy(this.dblclick, this)); - } - - $(this.element.ownerDocument).on(EVENT_POINTER_MOVE, this.onCropMove = proxy(this.cropMove, this)).on(EVENT_POINTER_UP, this.onCropEnd = proxy(this.cropEnd, this)); - - if (options.responsive) { - $(window).on(EVENT_RESIZE, this.onResize = proxy(this.resize, this)); - } - }, - unbind: function unbind() { - var $element = this.$element, - options = this.options, - $cropper = this.$cropper; - - - if ($.isFunction(options.cropstart)) { - $element.off(EVENT_CROP_START, options.cropstart); - } - - if ($.isFunction(options.cropmove)) { - $element.off(EVENT_CROP_MOVE, options.cropmove); - } - - if ($.isFunction(options.cropend)) { - $element.off(EVENT_CROP_END, options.cropend); - } - - if ($.isFunction(options.crop)) { - $element.off(EVENT_CROP, options.crop); - } - - if ($.isFunction(options.zoom)) { - $element.off(EVENT_ZOOM, options.zoom); - } - - $cropper.off(EVENT_POINTER_DOWN, this.cropStart); - - if (options.zoomable && options.zoomOnWheel) { - $cropper.off(EVENT_WHEEL, this.wheel); - } - - if (options.toggleDragModeOnDblclick) { - $cropper.off(EVENT_DBLCLICK, this.dblclick); - } - - $(this.element.ownerDocument).off(EVENT_POINTER_MOVE, this.onCropMove).off(EVENT_POINTER_UP, this.onCropEnd); - - if (options.responsive) { - $(window).off(EVENT_RESIZE, this.onResize); - } - } -}; - -var handlers = { - resize: function resize() { - var options = this.options, - $container = this.$container, - container = this.container; - - var minContainerWidth = Number(options.minContainerWidth) || 200; - var minContainerHeight = Number(options.minContainerHeight) || 100; - - if (this.disabled || container.width <= minContainerWidth || container.height <= minContainerHeight) { - return; - } - - var ratio = $container.width() / container.width; - - // Resize when width changed or height changed - if (ratio !== 1 || $container.height() !== container.height) { - var canvasData = void 0; - var cropBoxData = void 0; - - if (options.restore) { - canvasData = this.getCanvasData(); - cropBoxData = this.getCropBoxData(); - } - - this.render(); - - if (options.restore) { - this.setCanvasData($.each(canvasData, function (i, n) { - canvasData[i] = n * ratio; - })); - this.setCropBoxData($.each(cropBoxData, function (i, n) { - cropBoxData[i] = n * ratio; - })); - } - } - }, - dblclick: function dblclick() { - if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) { - return; - } - - this.setDragMode(this.$dragBox.hasClass(CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP); - }, - wheel: function wheel(event) { - var _this = this; - - var e = event.originalEvent || event; - var ratio = Number(this.options.wheelZoomRatio) || 0.1; - - if (this.disabled) { - return; - } - - event.preventDefault(); - - // Limit wheel speed to prevent zoom too fast - if (this.wheeling) { - return; - } - - this.wheeling = true; - - setTimeout(function () { - _this.wheeling = false; - }, 50); - - var delta = 1; - - if (e.deltaY) { - delta = e.deltaY > 0 ? 1 : -1; - } else if (e.wheelDelta) { - delta = -e.wheelDelta / 120; - } else if (e.detail) { - delta = e.detail > 0 ? 1 : -1; - } - - this.zoom(-delta * ratio, event); - }, - cropStart: function cropStart(e) { - if (this.disabled) { - return; - } - - var options = this.options, - pointers = this.pointers; - var originalEvent = e.originalEvent; - - var action = void 0; - - if (originalEvent && originalEvent.changedTouches) { - // Handle touch event - $.each(originalEvent.changedTouches, function (i, touch) { - pointers[touch.identifier] = getPointer(touch); - }); - } else { - // Handle mouse event and pointer event - pointers[originalEvent && originalEvent.pointerId || 0] = getPointer(originalEvent || e); - } - - if (objectKeys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) { - action = ACTION_ZOOM; - } else { - action = $(e.target).data(DATA_ACTION); - } - - if (!REGEXP_ACTIONS.test(action)) { - return; - } - - if (this.trigger(EVENT_CROP_START, { - originalEvent: originalEvent, - action: action - }).isDefaultPrevented()) { - return; - } - - e.preventDefault(); - - this.action = action; - this.cropping = false; - - if (action === ACTION_CROP) { - this.cropping = true; - this.$dragBox.addClass(CLASS_MODAL); - } - }, - cropMove: function cropMove(e) { - var action = this.action; - - - if (this.disabled || !action) { - return; - } - - var pointers = this.pointers; - var originalEvent = e.originalEvent; - - - e.preventDefault(); - - if (this.trigger(EVENT_CROP_MOVE, { - originalEvent: originalEvent, - action: action - }).isDefaultPrevented()) { - return; - } - - if (originalEvent && originalEvent.changedTouches) { - $.each(originalEvent.changedTouches, function (i, touch) { - $.extend(pointers[touch.identifier], getPointer(touch, true)); - }); - } else { - $.extend(pointers[originalEvent && originalEvent.pointerId || 0], getPointer(originalEvent || e, true)); - } - - this.change(e); - }, - cropEnd: function cropEnd(e) { - if (this.disabled) { - return; - } - - var action = this.action; - var pointers = this.pointers; - var originalEvent = e.originalEvent; - - - if (originalEvent && originalEvent.changedTouches) { - $.each(originalEvent.changedTouches, function (i, touch) { - delete pointers[touch.identifier]; - }); - } else { - delete pointers[originalEvent && originalEvent.pointerId || 0]; - } - - if (!action) { - return; - } - - e.preventDefault(); - - if (!objectKeys(pointers).length) { - this.action = ''; - } - - if (this.cropping) { - this.cropping = false; - this.$dragBox.toggleClass(CLASS_MODAL, this.cropped && this.options.modal); - } - - this.trigger(EVENT_CROP_END, { - originalEvent: originalEvent, - action: action - }); - } -}; - -var change = { - change: function change(e) { - var options = this.options, - pointers = this.pointers, - container = this.container, - canvas = this.canvas, - cropBox = this.cropBox; - var action = this.action; - var aspectRatio = options.aspectRatio; - var left = cropBox.left, - top = cropBox.top, - width = cropBox.width, - height = cropBox.height; - - var right = left + width; - var bottom = top + height; - var minLeft = 0; - var minTop = 0; - var maxWidth = container.width; - var maxHeight = container.height; - var renderable = true; - var offset = void 0; - - // Locking aspect ratio in "free mode" by holding shift key (#259) - if (!aspectRatio && e.shiftKey) { - aspectRatio = width && height ? width / height : 1; - } - - if (this.limited) { - minLeft = cropBox.minLeft; - minTop = cropBox.minTop; - - maxWidth = minLeft + Math.min(container.width, canvas.width, canvas.left + canvas.width); - maxHeight = minTop + Math.min(container.height, canvas.height, canvas.top + canvas.height); - } - - var pointer = pointers[objectKeys(pointers)[0]]; - var range = { - x: pointer.endX - pointer.startX, - y: pointer.endY - pointer.startY - }; - var check = function check(side) { - switch (side) { - case ACTION_EAST: - if (right + range.x > maxWidth) { - range.x = maxWidth - right; - } - - break; - - case ACTION_WEST: - if (left + range.x < minLeft) { - range.x = minLeft - left; - } - - break; - - case ACTION_NORTH: - if (top + range.y < minTop) { - range.y = minTop - top; - } - - break; - - case ACTION_SOUTH: - if (bottom + range.y > maxHeight) { - range.y = maxHeight - bottom; - } - - break; - - default: - } - }; - - switch (action) { - // Move crop box - case ACTION_ALL: - left += range.x; - top += range.y; - break; - - // Resize crop box - case ACTION_EAST: - if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) { - renderable = false; - break; - } - - check(ACTION_EAST); - width += range.x; - - if (aspectRatio) { - height = width / aspectRatio; - top -= range.x / aspectRatio / 2; - } - - if (width < 0) { - action = ACTION_WEST; - width = 0; - } - - break; - - case ACTION_NORTH: - if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) { - renderable = false; - break; - } - - check(ACTION_NORTH); - height -= range.y; - top += range.y; - - if (aspectRatio) { - width = height * aspectRatio; - left += range.y * aspectRatio / 2; - } - - if (height < 0) { - action = ACTION_SOUTH; - height = 0; - } - - break; - - case ACTION_WEST: - if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) { - renderable = false; - break; - } - - check(ACTION_WEST); - width -= range.x; - left += range.x; - - if (aspectRatio) { - height = width / aspectRatio; - top += range.x / aspectRatio / 2; - } - - if (width < 0) { - action = ACTION_EAST; - width = 0; - } - - break; - - case ACTION_SOUTH: - if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) { - renderable = false; - break; - } - - check(ACTION_SOUTH); - height += range.y; - - if (aspectRatio) { - width = height * aspectRatio; - left -= range.y * aspectRatio / 2; - } - - if (height < 0) { - action = ACTION_NORTH; - height = 0; - } - - break; - - case ACTION_NORTH_EAST: - if (aspectRatio) { - if (range.y <= 0 && (top <= minTop || right >= maxWidth)) { - renderable = false; - break; - } - - check(ACTION_NORTH); - height -= range.y; - top += range.y; - width = height * aspectRatio; - } else { - check(ACTION_NORTH); - check(ACTION_EAST); - - if (range.x >= 0) { - if (right < maxWidth) { - width += range.x; - } else if (range.y <= 0 && top <= minTop) { - renderable = false; - } - } else { - width += range.x; - } - - if (range.y <= 0) { - if (top > minTop) { - height -= range.y; - top += range.y; - } - } else { - height -= range.y; - top += range.y; - } - } - - if (width < 0 && height < 0) { - action = ACTION_SOUTH_WEST; - height = 0; - width = 0; - } else if (width < 0) { - action = ACTION_NORTH_WEST; - width = 0; - } else if (height < 0) { - action = ACTION_SOUTH_EAST; - height = 0; - } - - break; - - case ACTION_NORTH_WEST: - if (aspectRatio) { - if (range.y <= 0 && (top <= minTop || left <= minLeft)) { - renderable = false; - break; - } - - check(ACTION_NORTH); - height -= range.y; - top += range.y; - width = height * aspectRatio; - left += range.y * aspectRatio; - } else { - check(ACTION_NORTH); - check(ACTION_WEST); - - if (range.x <= 0) { - if (left > minLeft) { - width -= range.x; - left += range.x; - } else if (range.y <= 0 && top <= minTop) { - renderable = false; - } - } else { - width -= range.x; - left += range.x; - } - - if (range.y <= 0) { - if (top > minTop) { - height -= range.y; - top += range.y; - } - } else { - height -= range.y; - top += range.y; - } - } - - if (width < 0 && height < 0) { - action = ACTION_SOUTH_EAST; - height = 0; - width = 0; - } else if (width < 0) { - action = ACTION_NORTH_EAST; - width = 0; - } else if (height < 0) { - action = ACTION_SOUTH_WEST; - height = 0; - } - - break; - - case ACTION_SOUTH_WEST: - if (aspectRatio) { - if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) { - renderable = false; - break; - } - - check(ACTION_WEST); - width -= range.x; - left += range.x; - height = width / aspectRatio; - } else { - check(ACTION_SOUTH); - check(ACTION_WEST); - - if (range.x <= 0) { - if (left > minLeft) { - width -= range.x; - left += range.x; - } else if (range.y >= 0 && bottom >= maxHeight) { - renderable = false; - } - } else { - width -= range.x; - left += range.x; - } - - if (range.y >= 0) { - if (bottom < maxHeight) { - height += range.y; - } - } else { - height += range.y; - } - } - - if (width < 0 && height < 0) { - action = ACTION_NORTH_EAST; - height = 0; - width = 0; - } else if (width < 0) { - action = ACTION_SOUTH_EAST; - width = 0; - } else if (height < 0) { - action = ACTION_NORTH_WEST; - height = 0; - } - - break; - - case ACTION_SOUTH_EAST: - if (aspectRatio) { - if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) { - renderable = false; - break; - } - - check(ACTION_EAST); - width += range.x; - height = width / aspectRatio; - } else { - check(ACTION_SOUTH); - check(ACTION_EAST); - - if (range.x >= 0) { - if (right < maxWidth) { - width += range.x; - } else if (range.y >= 0 && bottom >= maxHeight) { - renderable = false; - } - } else { - width += range.x; - } - - if (range.y >= 0) { - if (bottom < maxHeight) { - height += range.y; - } - } else { - height += range.y; - } - } - - if (width < 0 && height < 0) { - action = ACTION_NORTH_WEST; - height = 0; - width = 0; - } else if (width < 0) { - action = ACTION_SOUTH_WEST; - width = 0; - } else if (height < 0) { - action = ACTION_NORTH_EAST; - height = 0; - } - - break; - - // Move canvas - case ACTION_MOVE: - this.move(range.x, range.y); - renderable = false; - break; - - // Zoom canvas - case ACTION_ZOOM: - this.zoom(getMaxZoomRatio(pointers), e.originalEvent); - renderable = false; - break; - - // Create crop box - case ACTION_CROP: - if (!range.x || !range.y) { - renderable = false; - break; - } - - offset = this.$cropper.offset(); - left = pointer.startX - offset.left; - top = pointer.startY - offset.top; - width = cropBox.minWidth; - height = cropBox.minHeight; - - if (range.x > 0) { - action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST; - } else if (range.x < 0) { - left -= width; - action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST; - } - - if (range.y < 0) { - top -= height; - } - - // Show the crop box if is hidden - if (!this.cropped) { - this.$cropBox.removeClass(CLASS_HIDDEN); - this.cropped = true; - - if (this.limited) { - this.limitCropBox(true, true); - } - } - - break; - - default: - } - - if (renderable) { - cropBox.width = width; - cropBox.height = height; - cropBox.left = left; - cropBox.top = top; - this.action = action; - this.renderCropBox(); - } - - // Override - $.each(pointers, function (i, p) { - p.startX = p.endX; - p.startY = p.endY; - }); - } -}; - -var methods = { - // Show the crop box manually - crop: function crop() { - if (!this.ready || this.disabled) { - return; - } - - if (!this.cropped) { - this.cropped = true; - this.limitCropBox(true, true); - - if (this.options.modal) { - this.$dragBox.addClass(CLASS_MODAL); - } - - this.$cropBox.removeClass(CLASS_HIDDEN); - } - - this.setCropBoxData(this.initialCropBox); - }, - - - // Reset the image and crop box to their initial states - reset: function reset() { - if (!this.ready || this.disabled) { - return; - } - - this.image = $.extend({}, this.initialImage); - this.canvas = $.extend({}, this.initialCanvas); - this.cropBox = $.extend({}, this.initialCropBox); - this.renderCanvas(); - - if (this.cropped) { - this.renderCropBox(); - } - }, - - - // Clear the crop box - clear: function clear() { - if (!this.cropped || this.disabled) { - return; - } - - $.extend(this.cropBox, { - left: 0, - top: 0, - width: 0, - height: 0 - }); - - this.cropped = false; - this.renderCropBox(); - this.limitCanvas(true, true); - - // Render canvas after crop box rendered - this.renderCanvas(); - this.$dragBox.removeClass(CLASS_MODAL); - this.$cropBox.addClass(CLASS_HIDDEN); - }, - - - /** - * Replace the image's src and rebuild the cropper - * @param {string} url - The new URL. - * @param {boolean} [onlyColorChanged] - Indicate if the new image only changed color. - */ - replace: function replace(url, onlyColorChanged) { - if (!this.disabled && url) { - if (this.isImg) { - this.$element.attr('src', url); - } - - if (onlyColorChanged) { - this.url = url; - this.$clone.attr('src', url); - - if (this.ready) { - this.$preview.find('img').add(this.$clone2).attr('src', url); - } - } else { - if (this.isImg) { - this.replaced = true; - } - - // Clear previous data - this.options.data = null; - this.load(url); - } - } - }, - - - // Enable (unfreeze) the cropper - enable: function enable() { - if (this.ready) { - this.disabled = false; - this.$cropper.removeClass(CLASS_DISABLED); - } - }, - - - // Disable (freeze) the cropper - disable: function disable() { - if (this.ready) { - this.disabled = true; - this.$cropper.addClass(CLASS_DISABLED); - } - }, - - - // Destroy the cropper and remove the instance from the image - destroy: function destroy() { - var $element = this.$element; - - - if (this.loaded) { - if (this.isImg && this.replaced) { - $element.attr('src', this.originalUrl); - } - - this.unbuild(); - $element.removeClass(CLASS_HIDDEN); - } else if (this.isImg) { - $element.off(EVENT_LOAD, this.start); - } else if (this.$clone) { - this.$clone.remove(); - } - - $element.removeData(NAMESPACE); - }, - - - /** - * Move the canvas with relative offsets - * @param {number} offsetX - The relative offset distance on the x-axis. - * @param {number} offsetY - The relative offset distance on the y-axis. - */ - move: function move(offsetX, offsetY) { - var _canvas = this.canvas, - left = _canvas.left, - top = _canvas.top; - - - this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY)); - }, - - - /** - * Move the canvas to an absolute point - * @param {number} x - The x-axis coordinate. - * @param {number} [y=x] - The y-axis coordinate. - */ - moveTo: function moveTo(x, y) { - var canvas = this.canvas; - - var changed = false; - - // If "y" is not present, its default value is "x" - if (isUndefined(y)) { - y = x; - } - - x = Number(x); - y = Number(y); - - if (this.ready && !this.disabled && this.options.movable) { - if (isNumber(x)) { - canvas.left = x; - changed = true; - } - - if (isNumber(y)) { - canvas.top = y; - changed = true; - } - - if (changed) { - this.renderCanvas(true); - } - } - }, - - - /** - * Zoom the canvas with a relative ratio - * @param {Number} ratio - The target ratio. - * @param {Event} _event - The related event if any. - */ - zoom: function zoom(ratio, _event) { - var canvas = this.canvas; - - - ratio = Number(ratio); - - if (ratio < 0) { - ratio = 1 / (1 - ratio); - } else { - ratio = 1 + ratio; - } - - this.zoomTo(canvas.width * ratio / canvas.naturalWidth, _event); - }, - - - /** - * Zoom the canvas to an absolute ratio - * @param {number} ratio - The target ratio. - * @param {Event} _event - The related event if any. - */ - zoomTo: function zoomTo(ratio, _event) { - var options = this.options, - pointers = this.pointers, - canvas = this.canvas; - var width = canvas.width, - height = canvas.height, - naturalWidth = canvas.naturalWidth, - naturalHeight = canvas.naturalHeight; - - - ratio = Number(ratio); - - if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) { - var newWidth = naturalWidth * ratio; - var newHeight = naturalHeight * ratio; - var originalEvent = void 0; - - if (_event) { - originalEvent = _event.originalEvent; - } - - if (this.trigger(EVENT_ZOOM, { - originalEvent: originalEvent, - oldRatio: width / naturalWidth, - ratio: newWidth / naturalWidth - }).isDefaultPrevented()) { - return; - } - - if (originalEvent) { - var offset = this.$cropper.offset(); - var center = pointers && objectKeys(pointers).length ? getPointersCenter(pointers) : { - pageX: _event.pageX || originalEvent.pageX || 0, - pageY: _event.pageY || originalEvent.pageY || 0 - }; - - // Zoom from the triggering point of the event - canvas.left -= (newWidth - width) * ((center.pageX - offset.left - canvas.left) / width); - canvas.top -= (newHeight - height) * ((center.pageY - offset.top - canvas.top) / height); - } else { - // Zoom from the center of the canvas - canvas.left -= (newWidth - width) / 2; - canvas.top -= (newHeight - height) / 2; - } - - canvas.width = newWidth; - canvas.height = newHeight; - this.renderCanvas(true); - } - }, - - - /** - * Rotate the canvas with a relative degree - * @param {number} degree - The rotate degree. - */ - rotate: function rotate(degree) { - this.rotateTo((this.image.rotate || 0) + Number(degree)); - }, - - - /** - * Rotate the canvas to an absolute degree - * @param {number} degree - The rotate degree. - */ - rotateTo: function rotateTo(degree) { - degree = Number(degree); - - if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) { - this.image.rotate = degree % 360; - this.renderCanvas(true, true); - } - }, - - - /** - * Scale the image on the x-axis. - * @param {number} scaleX - The scale ratio on the x-axis. - */ - scaleX: function scaleX(_scaleX) { - var scaleY = this.image.scaleY; - - - this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1); - }, - - - /** - * Scale the image on the y-axis. - * @param {number} scaleY - The scale ratio on the y-axis. - */ - scaleY: function scaleY(_scaleY) { - var scaleX = this.image.scaleX; - - - this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY); - }, - - - /** - * Scale the image - * @param {number} scaleX - The scale ratio on the x-axis. - * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis. - */ - scale: function scale(scaleX) { - var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX; - var image = this.image; - - var transformed = false; - - scaleX = Number(scaleX); - scaleY = Number(scaleY); - - if (this.ready && !this.disabled && this.options.scalable) { - if (isNumber(scaleX)) { - image.scaleX = scaleX; - transformed = true; - } - - if (isNumber(scaleY)) { - image.scaleY = scaleY; - transformed = true; - } - - if (transformed) { - this.renderCanvas(true, true); - } - } - }, - - - /** - * Get the cropped area position and size data (base on the original image) - * @param {boolean} [rounded=false] - Indicate if round the data values or not. - * @returns {Object} The result cropped data. - */ - getData: function getData() { - var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - var options = this.options, - image = this.image, - canvas = this.canvas, - cropBox = this.cropBox; - - var data = void 0; - - if (this.ready && this.cropped) { - data = { - x: cropBox.left - canvas.left, - y: cropBox.top - canvas.top, - width: cropBox.width, - height: cropBox.height - }; - - var ratio = image.width / image.naturalWidth; - - $.each(data, function (i, n) { - n /= ratio; - data[i] = rounded ? Math.round(n) : n; - }); - } else { - data = { - x: 0, - y: 0, - width: 0, - height: 0 - }; - } - - if (options.rotatable) { - data.rotate = image.rotate || 0; - } - - if (options.scalable) { - data.scaleX = image.scaleX || 1; - data.scaleY = image.scaleY || 1; - } - - return data; - }, - - - /** - * Set the cropped area position and size with new data - * @param {Object} data - The new data. - */ - setData: function setData(data) { - var options = this.options, - image = this.image, - canvas = this.canvas; - - var cropBoxData = {}; - - if ($.isFunction(data)) { - data = data.call(this.element); - } - - if (this.ready && !this.disabled && $.isPlainObject(data)) { - var transformed = false; - - if (options.rotatable) { - if (isNumber(data.rotate) && data.rotate !== image.rotate) { - image.rotate = data.rotate; - transformed = true; - } - } - - if (options.scalable) { - if (isNumber(data.scaleX) && data.scaleX !== image.scaleX) { - image.scaleX = data.scaleX; - transformed = true; - } - - if (isNumber(data.scaleY) && data.scaleY !== image.scaleY) { - image.scaleY = data.scaleY; - transformed = true; - } - } - - if (transformed) { - this.renderCanvas(true, true); - } - - var ratio = image.width / image.naturalWidth; - - if (isNumber(data.x)) { - cropBoxData.left = data.x * ratio + canvas.left; - } - - if (isNumber(data.y)) { - cropBoxData.top = data.y * ratio + canvas.top; - } - - if (isNumber(data.width)) { - cropBoxData.width = data.width * ratio; - } - - if (isNumber(data.height)) { - cropBoxData.height = data.height * ratio; - } - - this.setCropBoxData(cropBoxData); - } - }, - - - /** - * Get the container size data. - * @returns {Object} The result container data. - */ - getContainerData: function getContainerData() { - return this.ready ? $.extend({}, this.container) : {}; - }, - - - /** - * Get the image position and size data. - * @returns {Object} The result image data. - */ - getImageData: function getImageData() { - return this.loaded ? $.extend({}, this.image) : {}; - }, - - - /** - * Get the canvas position and size data. - * @returns {Object} The result canvas data. - */ - getCanvasData: function getCanvasData() { - var canvas = this.canvas; - - var data = {}; - - if (this.ready) { - $.each(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (i, n) { - data[n] = canvas[n]; - }); - } - - return data; - }, - - - /** - * Set the canvas position and size with new data. - * @param {Object} data - The new canvas data. - */ - setCanvasData: function setCanvasData(data) { - var canvas = this.canvas; - var aspectRatio = canvas.aspectRatio; - - - if ($.isFunction(data)) { - data = data.call(this.$element); - } - - if (this.ready && !this.disabled && $.isPlainObject(data)) { - if (isNumber(data.left)) { - canvas.left = data.left; - } - - if (isNumber(data.top)) { - canvas.top = data.top; - } - - if (isNumber(data.width)) { - canvas.width = data.width; - canvas.height = data.width / aspectRatio; - } else if (isNumber(data.height)) { - canvas.height = data.height; - canvas.width = data.height * aspectRatio; - } - - this.renderCanvas(true); - } - }, - - - /** - * Get the crop box position and size data. - * @returns {Object} The result crop box data. - */ - getCropBoxData: function getCropBoxData() { - var cropBox = this.cropBox; - - - return this.ready && this.cropped ? { - left: cropBox.left, - top: cropBox.top, - width: cropBox.width, - height: cropBox.height - } : {}; - }, - - - /** - * Set the crop box position and size with new data. - * @param {Object} data - The new crop box data. - */ - setCropBoxData: function setCropBoxData(data) { - var cropBox = this.cropBox; - var aspectRatio = this.options.aspectRatio; - - var widthChanged = void 0; - var heightChanged = void 0; - - if ($.isFunction(data)) { - data = data.call(this.$element); - } - - if (this.ready && this.cropped && !this.disabled && $.isPlainObject(data)) { - if (isNumber(data.left)) { - cropBox.left = data.left; - } - - if (isNumber(data.top)) { - cropBox.top = data.top; - } - - if (isNumber(data.width) && data.width !== cropBox.width) { - widthChanged = true; - cropBox.width = data.width; - } - - if (isNumber(data.height) && data.height !== cropBox.height) { - heightChanged = true; - cropBox.height = data.height; - } - - if (aspectRatio) { - if (widthChanged) { - cropBox.height = cropBox.width / aspectRatio; - } else if (heightChanged) { - cropBox.width = cropBox.height * aspectRatio; - } - } - - this.renderCropBox(); - } - }, - - - /** - * Get a canvas drawn the cropped image. - * @param {Object} [options={}] - The config options. - * @returns {HTMLCanvasElement} - The result canvas. - */ - getCroppedCanvas: function getCroppedCanvas() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - - if (!this.ready || !window.HTMLCanvasElement) { - return null; - } - - var canvasData = this.canvas; - - var source = getSourceCanvas(this.$clone[0], this.image, canvasData, options); - - // Returns the source canvas if it is not cropped. - if (!this.cropped) { - return source; - } - - var _getData = this.getData(), - x = _getData.x, - y = _getData.y, - initialWidth = _getData.width, - initialHeight = _getData.height; - - var aspectRatio = initialWidth / initialHeight; - var maxSizes = getContainSizes({ - aspectRatio: aspectRatio, - width: options.maxWidth || Infinity, - height: options.maxHeight || Infinity - }); - var minSizes = getContainSizes({ - aspectRatio: aspectRatio, - width: options.minWidth || 0, - height: options.minHeight || 0 - }); - - var _getContainSizes = getContainSizes({ - aspectRatio: aspectRatio, - width: options.width || initialWidth, - height: options.height || initialHeight - }), - width = _getContainSizes.width, - height = _getContainSizes.height; - - width = Math.min(maxSizes.width, Math.max(minSizes.width, width)); - height = Math.min(maxSizes.height, Math.max(minSizes.height, height)); - - var canvas = document.createElement('canvas'); - var context = canvas.getContext('2d'); - - canvas.width = normalizeDecimalNumber(width); - canvas.height = normalizeDecimalNumber(height); - context.fillStyle = options.fillColor || 'transparent'; - context.fillRect(0, 0, width, height); - - var _options$imageSmoothi = options.imageSmoothingEnabled, - imageSmoothingEnabled = _options$imageSmoothi === undefined ? true : _options$imageSmoothi, - imageSmoothingQuality = options.imageSmoothingQuality; - - - context.imageSmoothingEnabled = imageSmoothingEnabled; - - if (imageSmoothingQuality) { - context.imageSmoothingQuality = imageSmoothingQuality; - } - - // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage - var sourceWidth = source.width; - var sourceHeight = source.height; - - // Source canvas parameters - var srcX = x; - var srcY = y; - var srcWidth = void 0; - var srcHeight = void 0; - - // Destination canvas parameters - var dstX = void 0; - var dstY = void 0; - var dstWidth = void 0; - var dstHeight = void 0; - - if (srcX <= -initialWidth || srcX > sourceWidth) { - srcX = 0; - srcWidth = 0; - dstX = 0; - dstWidth = 0; - } else if (srcX <= 0) { - dstX = -srcX; - srcX = 0; - srcWidth = Math.min(sourceWidth, initialWidth + srcX); - dstWidth = srcWidth; - } else if (srcX <= sourceWidth) { - dstX = 0; - srcWidth = Math.min(initialWidth, sourceWidth - srcX); - dstWidth = srcWidth; - } - - if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) { - srcY = 0; - srcHeight = 0; - dstY = 0; - dstHeight = 0; - } else if (srcY <= 0) { - dstY = -srcY; - srcY = 0; - srcHeight = Math.min(sourceHeight, initialHeight + srcY); - dstHeight = srcHeight; - } else if (srcY <= sourceHeight) { - dstY = 0; - srcHeight = Math.min(initialHeight, sourceHeight - srcY); - dstHeight = srcHeight; - } - - // All the numerical parameters should be integer for `drawImage` - // https://github.com/fengyuanchen/cropper/issues/476 - var params = [srcX, srcY, srcWidth, srcHeight]; - - // Avoid "IndexSizeError" - if (dstWidth > 0 && dstHeight > 0) { - var scale = width / initialWidth; - - params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale); - } - - context.drawImage.apply(context, [source].concat(toConsumableArray($.map(params, function (param) { - return Math.floor(normalizeDecimalNumber(param)); - })))); - return canvas; - }, - - - /** - * Change the aspect ratio of the crop box. - * @param {number} aspectRatio - The new aspect ratio. - */ - setAspectRatio: function setAspectRatio(aspectRatio) { - var options = this.options; - - - if (!this.disabled && !isUndefined(aspectRatio)) { - // 0 -> NaN - options.aspectRatio = Math.max(0, aspectRatio) || NaN; - - if (this.ready) { - this.initCropBox(); - - if (this.cropped) { - this.renderCropBox(); - } - } - } - }, - - - /** - * Change the drag mode. - * @param {string} mode - The new drag mode. - */ - setDragMode: function setDragMode(mode) { - var options = this.options; - - var croppable = void 0; - var movable = void 0; - - if (this.loaded && !this.disabled) { - croppable = mode === DRAG_MODE_CROP; - movable = options.movable && mode === DRAG_MODE_MOVE; - mode = croppable || movable ? mode : DRAG_MODE_NONE; - - this.$dragBox.data(DATA_ACTION, mode).toggleClass(CLASS_CROP, croppable).toggleClass(CLASS_MOVE, movable); - - if (!options.cropBoxMovable) { - // Sync drag mode to crop box when it is not movable(#300) - this.$face.data(DATA_ACTION, mode).toggleClass(CLASS_CROP, croppable).toggleClass(CLASS_MOVE, movable); - } - } - } -}; - -var Cropper = function () { - /** - * Create a new Cropper. - * @param {Element} element - The target element for cropping. - * @param {Object} [options={}] - The configuration options. - */ - function Cropper(element) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - classCallCheck(this, Cropper); - - if (!element || !REGEXP_TAG_NAME.test(element.tagName)) { - throw new Error('The first argument is required and must be an <img> or <canvas> element.'); - } - - this.element = element; - this.$element = $(element); - this.options = $.extend({}, DEFAULTS, $.isPlainObject(options) && options); - this.completed = false; - this.cropped = false; - this.disabled = false; - this.isImg = false; - this.limited = false; - this.loaded = false; - this.ready = false; - this.replaced = false; - this.wheeling = false; - this.originalUrl = ''; - this.canvas = null; - this.cropBox = null; - this.pointers = {}; - this.init(); - } - - createClass(Cropper, [{ - key: 'init', - value: function init() { - var $element = this.$element; - - var url = void 0; - - if ($element.is('img')) { - this.isImg = true; - - // Should use `$.fn.attr` here. e.g.: "img/picture.jpg" - url = $element.attr('src') || ''; - this.originalUrl = url; - - // Stop when it's a blank image - if (!url) { - return; - } - - // Should use `$.fn.prop` here. e.g.: "http://example.com/img/picture.jpg" - url = $element.prop('src'); - } else if ($element.is('canvas') && window.HTMLCanvasElement) { - url = $element[0].toDataURL(); - } - - this.load(url); - } - - // A shortcut for triggering custom events - - }, { - key: 'trigger', - value: function trigger(type, data) { - var e = $.Event(type, data); - - this.$element.trigger(e); - - return e; - } - }, { - key: 'load', - value: function load(url) { - var _this = this; - - if (!url) { - return; - } - - this.url = url; - this.image = {}; - - var $element = this.$element, - options = this.options; - - - if (!options.checkOrientation || !window.ArrayBuffer) { - this.clone(); - return; - } - - // XMLHttpRequest disallows to open a Data URL in some browsers like IE11 and Safari - if (REGEXP_DATA_URL.test(url)) { - if (REGEXP_DATA_URL_JPEG.test(url)) { - this.read(dataURLToArrayBuffer(url)); - } else { - this.clone(); - } - - return; - } - - var xhr = new XMLHttpRequest(); - - xhr.onerror = function () { - _this.clone(); - }; - - xhr.onload = function () { - _this.read(xhr.response); - }; - - // Bust cache when there is a "crossOrigin" property - if (options.checkCrossOrigin && isCrossOriginURL(url) && !$element.prop('crossOrigin')) { - url = addTimestamp(url); - } - - xhr.open('get', url); - xhr.responseType = 'arraybuffer'; - xhr.withCredentials = $element.prop('crossOrigin') === 'use-credentials'; - xhr.send(); - } - }, { - key: 'read', - value: function read(arrayBuffer) { - var options = this.options, - image = this.image; - - var orientation = getOrientation(arrayBuffer); - var rotate = 0; - var scaleX = 1; - var scaleY = 1; - - if (orientation > 1) { - this.url = arrayBufferToDataURL(arrayBuffer, 'image/jpeg'); - - var _parseOrientation = parseOrientation(orientation); - - rotate = _parseOrientation.rotate; - scaleX = _parseOrientation.scaleX; - scaleY = _parseOrientation.scaleY; - } - - if (options.rotatable) { - image.rotate = rotate; - } - - if (options.scalable) { - image.scaleX = scaleX; - image.scaleY = scaleY; - } - - this.clone(); - } - }, { - key: 'clone', - value: function clone() { - var $element = this.$element, - options = this.options, - url = this.url; - - var crossOrigin = ''; - var crossOriginUrl = void 0; - - if (options.checkCrossOrigin && isCrossOriginURL(url)) { - crossOrigin = $element.prop('crossOrigin'); - - if (crossOrigin) { - crossOriginUrl = url; - } else { - crossOrigin = 'anonymous'; - - // Bust cache (#148) when there is not a "crossOrigin" property - crossOriginUrl = addTimestamp(url); - } - } - - this.crossOrigin = crossOrigin; - this.crossOriginUrl = crossOriginUrl; - - var image = document.createElement('img'); - - if (crossOrigin) { - image.crossOrigin = crossOrigin; - } - - image.src = crossOriginUrl || url; - - var $clone = $(image); - - this.$clone = $clone; - - if (this.isImg) { - if (this.element.complete) { - this.start(); - } else { - $element.one(EVENT_LOAD, $.proxy(this.start, this)); - } - } else { - $clone.one(EVENT_LOAD, $.proxy(this.start, this)).one(EVENT_ERROR, $.proxy(this.stop, this)).addClass(CLASS_HIDE).insertAfter($element); - } - } - }, { - key: 'start', - value: function start() { - var _this2 = this; - - var $clone = this.$clone; - - var $image = this.$element; - - if (!this.isImg) { - $clone.off(EVENT_ERROR, this.stop); - $image = $clone; - } - - getImageNaturalSizes($image[0], function (naturalWidth, naturalHeight) { - $.extend(_this2.image, { - naturalWidth: naturalWidth, - naturalHeight: naturalHeight, - aspectRatio: naturalWidth / naturalHeight - }); - - _this2.loaded = true; - _this2.build(); - }); - } - }, { - key: 'stop', - value: function stop() { - this.$clone.remove(); - this.$clone = null; - } - }, { - key: 'build', - value: function build() { - var _this3 = this; - - if (!this.loaded) { - return; - } - - // Unbuild first when replace - if (this.ready) { - this.unbuild(); - } - - var $element = this.$element, - options = this.options, - $clone = this.$clone; - - var $cropper = $(TEMPLATE); - var $cropBox = $cropper.find('.' + NAMESPACE + '-crop-box'); - var $face = $cropBox.find('.' + NAMESPACE + '-face'); - - // Create cropper elements - this.$container = $element.parent(); - this.$cropper = $cropper; - this.$canvas = $cropper.find('.' + NAMESPACE + '-canvas').append($clone); - this.$dragBox = $cropper.find('.' + NAMESPACE + '-drag-box'); - this.$cropBox = $cropBox; - this.$viewBox = $cropper.find('.' + NAMESPACE + '-view-box'); - this.$face = $face; - - // Hide the original image - $element.addClass(CLASS_HIDDEN).after($cropper); - - // Show the clone image if is hidden - if (!this.isImg) { - $clone.removeClass(CLASS_HIDE); - } - - this.initPreview(); - this.bind(); - - options.aspectRatio = Math.max(0, options.aspectRatio) || NaN; - options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0; - - this.cropped = options.autoCrop; - - if (options.autoCrop) { - if (options.modal) { - this.$dragBox.addClass(CLASS_MODAL); - } - } else { - $cropBox.addClass(CLASS_HIDDEN); - } - - if (!options.guides) { - $cropBox.find('.' + NAMESPACE + '-dashed').addClass(CLASS_HIDDEN); - } - - if (!options.center) { - $cropBox.find('.' + NAMESPACE + '-center').addClass(CLASS_HIDDEN); - } - - if (options.cropBoxMovable) { - $face.addClass(CLASS_MOVE).data(DATA_ACTION, ACTION_ALL); - } - - if (!options.highlight) { - $face.addClass(CLASS_INVISIBLE); - } - - if (options.background) { - $cropper.addClass(NAMESPACE + '-bg'); - } - - if (!options.cropBoxResizable) { - $cropBox.find('.' + NAMESPACE + '-line,.' + NAMESPACE + '-point').addClass(CLASS_HIDDEN); - } - - this.setDragMode(options.dragMode); - this.render(); - this.ready = true; - this.setData(options.data); - - // Trigger the ready event asynchronously to keep `data('cropper')` is defined - this.completing = setTimeout(function () { - if ($.isFunction(options.ready)) { - $element.one(EVENT_READY, options.ready); - } - - _this3.trigger(EVENT_READY); - _this3.trigger(EVENT_CROP, _this3.getData()); - _this3.completed = true; - }, 0); - } - }, { - key: 'unbuild', - value: function unbuild() { - if (!this.ready) { - return; - } - - if (!this.completed) { - clearTimeout(this.completing); - } - - this.ready = false; - this.completed = false; - this.initialImage = null; - - // Clear `initialCanvas` is necessary when replace - this.initialCanvas = null; - this.initialCropBox = null; - this.container = null; - this.canvas = null; - - // Clear `cropBox` is necessary when replace - this.cropBox = null; - this.unbind(); - - this.resetPreview(); - this.$preview = null; - - this.$viewBox = null; - this.$cropBox = null; - this.$dragBox = null; - this.$canvas = null; - this.$container = null; - - this.$cropper.remove(); - this.$cropper = null; - } - - /** - * Change the default options. - * @param {Object} options - The new default options. - */ - - }], [{ - key: 'setDefaults', - value: function setDefaults(options) { - $.extend(DEFAULTS, $.isPlainObject(options) && options); - } - }]); - return Cropper; -}(); - -if ($.extend) { - $.extend(Cropper.prototype, render, preview, events, handlers, change, methods); -} - -if ($.fn) { - var AnotherCropper = $.fn.cropper; - - $.fn.cropper = function jQueryCropper(option) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - var result = void 0; - - this.each(function (i, element) { - var $element = $(element); - var data = $element.data(NAMESPACE); - - if (!data) { - if (/destroy/.test(option)) { - return; - } - - var options = $.extend({}, $element.data(), $.isPlainObject(option) && option); - - data = new Cropper(element, options); - $element.data(NAMESPACE, data); - } - - if (isString(option)) { - var fn = data[option]; - - if ($.isFunction(fn)) { - result = fn.apply(data, args); - } - } - }); - - return isUndefined(result) ? this : result; - }; - - $.fn.cropper.Constructor = Cropper; - $.fn.cropper.setDefaults = Cropper.setDefaults; - $.fn.cropper.noConflict = function noConflict() { - $.fn.cropper = AnotherCropper; - return this; - }; -} - -}))); diff --git a/addons/web_editor/static/lib/cropperjs/LICENSE b/addons/web_editor/static/lib/cropperjs/LICENSE new file mode 100644 index 00000000000..4ca99accbc5 --- /dev/null +++ b/addons/web_editor/static/lib/cropperjs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright 2015-present Chen Fengyuan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/addons/web_editor/static/lib/cropper/css/cropper.css b/addons/web_editor/static/lib/cropperjs/cropper.css index f97ab37eab9..4aba1421290 100644 --- a/addons/web_editor/static/lib/cropper/css/cropper.css +++ b/addons/web_editor/static/lib/cropperjs/cropper.css @@ -1,14 +1,14 @@ /*! - * Cropper v3.1.4 - * https://github.com/fengyuanchen/cropper + * Cropper.js v1.5.5 + * https://fengyuanchen.github.io/cropperjs * - * Copyright (c) 2014-2018 Chen Fengyuan + * Copyright 2015-present Chen Fengyuan * Released under the MIT license * - * Date: 2018-01-13T09:37:21.486Z + * Date: 2019-08-04T02:26:27.232Z */ -.cropper-container { + .cropper-container { direction: ltr; font-size: 0; line-height: 0; @@ -21,8 +21,7 @@ user-select: none; } -.cropper-container img {/*Avoid margin top issue (Occur only when margin-top <= -height) - */ +.cropper-container img { display: block; height: 100%; image-orientation: 0deg; @@ -57,14 +56,14 @@ .cropper-modal { background-color: #000; - opacity: .5; + opacity: 0.5; } .cropper-view-box { display: block; height: 100%; - outline-color: rgba(51, 153, 255, 0.75); outline: 1px solid #39f; + outline-color: rgba(51, 153, 255, 0.75); overflow: hidden; width: 100%; } @@ -72,16 +71,16 @@ .cropper-dashed { border: 0 dashed #eee; display: block; - opacity: .5; + opacity: 0.5; position: absolute; } .cropper-dashed.dashed-h { border-bottom-width: 1px; border-top-width: 1px; - height: 33.33333%; + height: calc(100% / 3); left: 0; - top: 33.33333%; + top: calc(100% / 3); width: 100%; } @@ -89,37 +88,37 @@ border-left-width: 1px; border-right-width: 1px; height: 100%; - left: 33.33333%; + left: calc(100% / 3); top: 0; - width: 33.33333%; + width: calc(100% / 3); } .cropper-center { display: block; height: 0; left: 50%; - opacity: .75; + opacity: 0.75; position: absolute; top: 50%; width: 0; } -.cropper-center:before, -.cropper-center:after { +.cropper-center::before, +.cropper-center::after { background-color: #eee; content: ' '; display: block; position: absolute; } -.cropper-center:before { +.cropper-center::before { height: 1px; left: -3px; top: 0; width: 7px; } -.cropper-center:after { +.cropper-center::after { height: 7px; left: 0; top: -3px; @@ -131,7 +130,7 @@ .cropper-point { display: block; height: 100%; - opacity: .1; + opacity: 0.1; position: absolute; width: 100%; } @@ -177,7 +176,7 @@ .cropper-point { background-color: #39f; height: 5px; - opacity: .75; + opacity: 0.75; width: 5px; } @@ -253,12 +252,12 @@ @media (min-width: 1200px) { .cropper-point.point-se { height: 5px; - opacity: .75; + opacity: 0.75; width: 5px; } } -.cropper-point.point-se:before { +.cropper-point.point-se::before { background-color: #39f; bottom: -50%; content: ' '; @@ -303,4 +302,3 @@ .cropper-disabled .cropper-point { cursor: not-allowed; } - diff --git a/addons/web_editor/static/lib/cropperjs/cropper.js b/addons/web_editor/static/lib/cropperjs/cropper.js new file mode 100644 index 00000000000..b4495132acd --- /dev/null +++ b/addons/web_editor/static/lib/cropperjs/cropper.js @@ -0,0 +1,3566 @@ +/*! + * Cropper.js v1.5.5 + * https://fengyuanchen.github.io/cropperjs + * + * Copyright 2015-present Chen Fengyuan + * Released under the MIT license + * + * Date: 2019-08-04T02:26:31.160Z + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.Cropper = factory()); +}(this, function () { 'use strict'; + + function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } + } + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined'; + var WINDOW = IS_BROWSER ? window : {}; + var IS_TOUCH_DEVICE = IS_BROWSER ? 'ontouchstart' in WINDOW.document.documentElement : false; + var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false; + var NAMESPACE = 'cropper'; // Actions + + var ACTION_ALL = 'all'; + var ACTION_CROP = 'crop'; + var ACTION_MOVE = 'move'; + var ACTION_ZOOM = 'zoom'; + var ACTION_EAST = 'e'; + var ACTION_WEST = 'w'; + var ACTION_SOUTH = 's'; + var ACTION_NORTH = 'n'; + var ACTION_NORTH_EAST = 'ne'; + var ACTION_NORTH_WEST = 'nw'; + var ACTION_SOUTH_EAST = 'se'; + var ACTION_SOUTH_WEST = 'sw'; // Classes + + var CLASS_CROP = "".concat(NAMESPACE, "-crop"); + var CLASS_DISABLED = "".concat(NAMESPACE, "-disabled"); + var CLASS_HIDDEN = "".concat(NAMESPACE, "-hidden"); + var CLASS_HIDE = "".concat(NAMESPACE, "-hide"); + var CLASS_INVISIBLE = "".concat(NAMESPACE, "-invisible"); + var CLASS_MODAL = "".concat(NAMESPACE, "-modal"); + var CLASS_MOVE = "".concat(NAMESPACE, "-move"); // Data keys + + var DATA_ACTION = "".concat(NAMESPACE, "Action"); + var DATA_PREVIEW = "".concat(NAMESPACE, "Preview"); // Drag modes + + var DRAG_MODE_CROP = 'crop'; + var DRAG_MODE_MOVE = 'move'; + var DRAG_MODE_NONE = 'none'; // Events + + var EVENT_CROP = 'crop'; + var EVENT_CROP_END = 'cropend'; + var EVENT_CROP_MOVE = 'cropmove'; + var EVENT_CROP_START = 'cropstart'; + var EVENT_DBLCLICK = 'dblclick'; + var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown'; + var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove'; + var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup'; + var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START; + var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE; + var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END; + var EVENT_READY = 'ready'; + var EVENT_RESIZE = 'resize'; + var EVENT_WHEEL = 'wheel'; + var EVENT_ZOOM = 'zoom'; // Mime types + + var MIME_TYPE_JPEG = 'image/jpeg'; // RegExps + + var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/; + var REGEXP_DATA_URL = /^data:/; + var REGEXP_DATA_URL_JPEG = /^data:image\/jpeg;base64,/; + var REGEXP_TAG_NAME = /^img|canvas$/i; // Misc + // Inspired by the default width and height of a canvas element. + + var MIN_CONTAINER_WIDTH = 200; + var MIN_CONTAINER_HEIGHT = 100; + + var DEFAULTS = { + // Define the view mode of the cropper + viewMode: 0, + // 0, 1, 2, 3 + // Define the dragging mode of the cropper + dragMode: DRAG_MODE_CROP, + // 'crop', 'move' or 'none' + // Define the initial aspect ratio of the crop box + initialAspectRatio: NaN, + // Define the aspect ratio of the crop box + aspectRatio: NaN, + // An object with the previous cropping result data + data: null, + // A selector for adding extra containers to preview + preview: '', + // Re-render the cropper when resize the window + responsive: true, + // Restore the cropped area after resize the window + restore: true, + // Check if the current image is a cross-origin image + checkCrossOrigin: true, + // Check the current image's Exif Orientation information + checkOrientation: true, + // Show the black modal + modal: true, + // Show the dashed lines for guiding + guides: true, + // Show the center indicator for guiding + center: true, + // Show the white modal to highlight the crop box + highlight: true, + // Show the grid background + background: true, + // Enable to crop the image automatically when initialize + autoCrop: true, + // Define the percentage of automatic cropping area when initializes + autoCropArea: 0.8, + // Enable to move the image + movable: true, + // Enable to rotate the image + rotatable: true, + // Enable to scale the image + scalable: true, + // Enable to zoom the image + zoomable: true, + // Enable to zoom the image by dragging touch + zoomOnTouch: true, + // Enable to zoom the image by wheeling mouse + zoomOnWheel: true, + // Define zoom ratio when zoom the image by wheeling mouse + wheelZoomRatio: 0.1, + // Enable to move the crop box + cropBoxMovable: true, + // Enable to resize the crop box + cropBoxResizable: true, + // Toggle drag mode between "crop" and "move" when click twice on the cropper + toggleDragModeOnDblclick: true, + // Size limitation + minCanvasWidth: 0, + minCanvasHeight: 0, + minCropBoxWidth: 0, + minCropBoxHeight: 0, + minContainerWidth: 200, + minContainerHeight: 100, + // Shortcuts of events + ready: null, + cropstart: null, + cropmove: null, + cropend: null, + crop: null, + zoom: null + }; + + var TEMPLATE = '<div class="cropper-container" touch-action="none">' + '<div class="cropper-wrap-box">' + '<div class="cropper-canvas"></div>' + '</div>' + '<div class="cropper-drag-box"></div>' + '<div class="cropper-crop-box">' + '<span class="cropper-view-box"></span>' + '<span class="cropper-dashed dashed-h"></span>' + '<span class="cropper-dashed dashed-v"></span>' + '<span class="cropper-center"></span>' + '<span class="cropper-face"></span>' + '<span class="cropper-line line-e" data-cropper-action="e"></span>' + '<span class="cropper-line line-n" data-cropper-action="n"></span>' + '<span class="cropper-line line-w" data-cropper-action="w"></span>' + '<span class="cropper-line line-s" data-cropper-action="s"></span>' + '<span class="cropper-point point-e" data-cropper-action="e"></span>' + '<span class="cropper-point point-n" data-cropper-action="n"></span>' + '<span class="cropper-point point-w" data-cropper-action="w"></span>' + '<span class="cropper-point point-s" data-cropper-action="s"></span>' + '<span class="cropper-point point-ne" data-cropper-action="ne"></span>' + '<span class="cropper-point point-nw" data-cropper-action="nw"></span>' + '<span class="cropper-point point-sw" data-cropper-action="sw"></span>' + '<span class="cropper-point point-se" data-cropper-action="se"></span>' + '</div>' + '</div>'; + + /** + * Check if the given value is not a number. + */ + + var isNaN = Number.isNaN || WINDOW.isNaN; + /** + * Check if the given value is a number. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a number, else `false`. + */ + + function isNumber(value) { + return typeof value === 'number' && !isNaN(value); + } + /** + * Check if the given value is a positive number. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a positive number, else `false`. + */ + + var isPositiveNumber = function isPositiveNumber(value) { + return value > 0 && value < Infinity; + }; + /** + * Check if the given value is undefined. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is undefined, else `false`. + */ + + function isUndefined(value) { + return typeof value === 'undefined'; + } + /** + * Check if the given value is an object. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is an object, else `false`. + */ + + function isObject(value) { + return _typeof(value) === 'object' && value !== null; + } + var hasOwnProperty = Object.prototype.hasOwnProperty; + /** + * Check if the given value is a plain object. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a plain object, else `false`. + */ + + function isPlainObject(value) { + if (!isObject(value)) { + return false; + } + + try { + var _constructor = value.constructor; + var prototype = _constructor.prototype; + return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf'); + } catch (error) { + return false; + } + } + /** + * Check if the given value is a function. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a function, else `false`. + */ + + function isFunction(value) { + return typeof value === 'function'; + } + var slice = Array.prototype.slice; + /** + * Convert array-like or iterable object to an array. + * @param {*} value - The value to convert. + * @returns {Array} Returns a new array. + */ + + function toArray(value) { + return Array.from ? Array.from(value) : slice.call(value); + } + /** + * Iterate the given data. + * @param {*} data - The data to iterate. + * @param {Function} callback - The process function for each element. + * @returns {*} The original data. + */ + + function forEach(data, callback) { + if (data && isFunction(callback)) { + if (Array.isArray(data) || isNumber(data.length) + /* array-like */ + ) { + toArray(data).forEach(function (value, key) { + callback.call(data, value, key, data); + }); + } else if (isObject(data)) { + Object.keys(data).forEach(function (key) { + callback.call(data, data[key], key, data); + }); + } + } + + return data; + } + /** + * Extend the given object. + * @param {*} target - The target object to extend. + * @param {*} args - The rest objects for merging to the target object. + * @returns {Object} The extended object. + */ + + var assign = Object.assign || function assign(target) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (isObject(target) && args.length > 0) { + args.forEach(function (arg) { + if (isObject(arg)) { + Object.keys(arg).forEach(function (key) { + target[key] = arg[key]; + }); + } + }); + } + + return target; + }; + var REGEXP_DECIMALS = /\.\d*(?:0|9){12}\d*$/; + /** + * Normalize decimal number. + * Check out {@link http://0.30000000000000004.com/} + * @param {number} value - The value to normalize. + * @param {number} [times=100000000000] - The times for normalizing. + * @returns {number} Returns the normalized number. + */ + + function normalizeDecimalNumber(value) { + var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000; + return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value; + } + var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/; + /** + * Apply styles to the given element. + * @param {Element} element - The target element. + * @param {Object} styles - The styles for applying. + */ + + function setStyle(element, styles) { + var style = element.style; + forEach(styles, function (value, property) { + if (REGEXP_SUFFIX.test(property) && isNumber(value)) { + value = "".concat(value, "px"); + } + + style[property] = value; + }); + } + /** + * Check if the given element has a special class. + * @param {Element} element - The element to check. + * @param {string} value - The class to search. + * @returns {boolean} Returns `true` if the special class was found. + */ + + function hasClass(element, value) { + return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1; + } + /** + * Add classes to the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be added. + */ + + function addClass(element, value) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + addClass(elem, value); + }); + return; + } + + if (element.classList) { + element.classList.add(value); + return; + } + + var className = element.className.trim(); + + if (!className) { + element.className = value; + } else if (className.indexOf(value) < 0) { + element.className = "".concat(className, " ").concat(value); + } + } + /** + * Remove classes from the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be removed. + */ + + function removeClass(element, value) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + removeClass(elem, value); + }); + return; + } + + if (element.classList) { + element.classList.remove(value); + return; + } + + if (element.className.indexOf(value) >= 0) { + element.className = element.className.replace(value, ''); + } + } + /** + * Add or remove classes from the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be toggled. + * @param {boolean} added - Add only. + */ + + function toggleClass(element, value, added) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + toggleClass(elem, value, added); + }); + return; + } // IE10-11 doesn't support the second parameter of `classList.toggle` + + + if (added) { + addClass(element, value); + } else { + removeClass(element, value); + } + } + var REGEXP_CAMEL_CASE = /([a-z\d])([A-Z])/g; + /** + * Transform the given string from camelCase to kebab-case + * @param {string} value - The value to transform. + * @returns {string} The transformed value. + */ + + function toParamCase(value) { + return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase(); + } + /** + * Get data from the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to get. + * @returns {string} The data value. + */ + + function getData(element, name) { + if (isObject(element[name])) { + return element[name]; + } + + if (element.dataset) { + return element.dataset[name]; + } + + return element.getAttribute("data-".concat(toParamCase(name))); + } + /** + * Set data to the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to set. + * @param {string} data - The data value. + */ + + function setData(element, name, data) { + if (isObject(data)) { + element[name] = data; + } else if (element.dataset) { + element.dataset[name] = data; + } else { + element.setAttribute("data-".concat(toParamCase(name)), data); + } + } + /** + * Remove data from the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to remove. + */ + + function removeData(element, name) { + if (isObject(element[name])) { + try { + delete element[name]; + } catch (error) { + element[name] = undefined; + } + } else if (element.dataset) { + // #128 Safari not allows to delete dataset property + try { + delete element.dataset[name]; + } catch (error) { + element.dataset[name] = undefined; + } + } else { + element.removeAttribute("data-".concat(toParamCase(name))); + } + } + var REGEXP_SPACES = /\s\s*/; + + var onceSupported = function () { + var supported = false; + + if (IS_BROWSER) { + var once = false; + + var listener = function listener() {}; + + var options = Object.defineProperty({}, 'once', { + get: function get() { + supported = true; + return once; + }, + + /** + * This setter can fix a `TypeError` in strict mode + * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only} + * @param {boolean} value - The value to set + */ + set: function set(value) { + once = value; + } + }); + WINDOW.addEventListener('test', listener, options); + WINDOW.removeEventListener('test', listener, options); + } + + return supported; + }(); + /** + * Remove event listener from the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Function} listener - The event listener. + * @param {Object} options - The event options. + */ + + + function removeListener(element, type, listener) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + var handler = listener; + type.trim().split(REGEXP_SPACES).forEach(function (event) { + if (!onceSupported) { + var listeners = element.listeners; + + if (listeners && listeners[event] && listeners[event][listener]) { + handler = listeners[event][listener]; + delete listeners[event][listener]; + + if (Object.keys(listeners[event]).length === 0) { + delete listeners[event]; + } + + if (Object.keys(listeners).length === 0) { + delete element.listeners; + } + } + } + + element.removeEventListener(event, handler, options); + }); + } + /** + * Add event listener to the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Function} listener - The event listener. + * @param {Object} options - The event options. + */ + + function addListener(element, type, listener) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + var _handler = listener; + type.trim().split(REGEXP_SPACES).forEach(function (event) { + if (options.once && !onceSupported) { + var _element$listeners = element.listeners, + listeners = _element$listeners === void 0 ? {} : _element$listeners; + + _handler = function handler() { + delete listeners[event][listener]; + element.removeEventListener(event, _handler, options); + + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + listener.apply(element, args); + }; + + if (!listeners[event]) { + listeners[event] = {}; + } + + if (listeners[event][listener]) { + element.removeEventListener(event, listeners[event][listener], options); + } + + listeners[event][listener] = _handler; + element.listeners = listeners; + } + + element.addEventListener(event, _handler, options); + }); + } + /** + * Dispatch event on the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Object} data - The additional event data. + * @returns {boolean} Indicate if the event is default prevented or not. + */ + + function dispatchEvent(element, type, data) { + var event; // Event and CustomEvent on IE9-11 are global objects, not constructors + + if (isFunction(Event) && isFunction(CustomEvent)) { + event = new CustomEvent(type, { + detail: data, + bubbles: true, + cancelable: true + }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(type, true, true, data); + } + + return element.dispatchEvent(event); + } + /** + * Get the offset base on the document. + * @param {Element} element - The target element. + * @returns {Object} The offset data. + */ + + function getOffset(element) { + var box = element.getBoundingClientRect(); + return { + left: box.left + (window.pageXOffset - document.documentElement.clientLeft), + top: box.top + (window.pageYOffset - document.documentElement.clientTop) + }; + } + var location = WINDOW.location; + var REGEXP_ORIGINS = /^(\w+:)\/\/([^:/?#]*):?(\d*)/i; + /** + * Check if the given URL is a cross origin URL. + * @param {string} url - The target URL. + * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`. + */ + + function isCrossOriginURL(url) { + var parts = url.match(REGEXP_ORIGINS); + return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port); + } + /** + * Add timestamp to the given URL. + * @param {string} url - The target URL. + * @returns {string} The result URL. + */ + + function addTimestamp(url) { + var timestamp = "timestamp=".concat(new Date().getTime()); + return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp; + } + /** + * Get transforms base on the given object. + * @param {Object} obj - The target object. + * @returns {string} A string contains transform values. + */ + + function getTransforms(_ref) { + var rotate = _ref.rotate, + scaleX = _ref.scaleX, + scaleY = _ref.scaleY, + translateX = _ref.translateX, + translateY = _ref.translateY; + var values = []; + + if (isNumber(translateX) && translateX !== 0) { + values.push("translateX(".concat(translateX, "px)")); + } + + if (isNumber(translateY) && translateY !== 0) { + values.push("translateY(".concat(translateY, "px)")); + } // Rotate should come first before scale to match orientation transform + + + if (isNumber(rotate) && rotate !== 0) { + values.push("rotate(".concat(rotate, "deg)")); + } + + if (isNumber(scaleX) && scaleX !== 1) { + values.push("scaleX(".concat(scaleX, ")")); + } + + if (isNumber(scaleY) && scaleY !== 1) { + values.push("scaleY(".concat(scaleY, ")")); + } + + var transform = values.length ? values.join(' ') : 'none'; + return { + WebkitTransform: transform, + msTransform: transform, + transform: transform + }; + } + /** + * Get the max ratio of a group of pointers. + * @param {string} pointers - The target pointers. + * @returns {number} The result ratio. + */ + + function getMaxZoomRatio(pointers) { + var pointers2 = assign({}, pointers); + var ratios = []; + forEach(pointers, function (pointer, pointerId) { + delete pointers2[pointerId]; + forEach(pointers2, function (pointer2) { + var x1 = Math.abs(pointer.startX - pointer2.startX); + var y1 = Math.abs(pointer.startY - pointer2.startY); + var x2 = Math.abs(pointer.endX - pointer2.endX); + var y2 = Math.abs(pointer.endY - pointer2.endY); + var z1 = Math.sqrt(x1 * x1 + y1 * y1); + var z2 = Math.sqrt(x2 * x2 + y2 * y2); + var ratio = (z2 - z1) / z1; + ratios.push(ratio); + }); + }); + ratios.sort(function (a, b) { + return Math.abs(a) < Math.abs(b); + }); + return ratios[0]; + } + /** + * Get a pointer from an event object. + * @param {Object} event - The target event object. + * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not. + * @returns {Object} The result pointer contains start and/or end point coordinates. + */ + + function getPointer(_ref2, endOnly) { + var pageX = _ref2.pageX, + pageY = _ref2.pageY; + var end = { + endX: pageX, + endY: pageY + }; + return endOnly ? end : assign({ + startX: pageX, + startY: pageY + }, end); + } + /** + * Get the center point coordinate of a group of pointers. + * @param {Object} pointers - The target pointers. + * @returns {Object} The center point coordinate. + */ + + function getPointersCenter(pointers) { + var pageX = 0; + var pageY = 0; + var count = 0; + forEach(pointers, function (_ref3) { + var startX = _ref3.startX, + startY = _ref3.startY; + pageX += startX; + pageY += startY; + count += 1; + }); + pageX /= count; + pageY /= count; + return { + pageX: pageX, + pageY: pageY + }; + } + /** + * Get the max sizes in a rectangle under the given aspect ratio. + * @param {Object} data - The original sizes. + * @param {string} [type='contain'] - The adjust type. + * @returns {Object} The result sizes. + */ + + function getAdjustedSizes(_ref4) // or 'cover' + { + var aspectRatio = _ref4.aspectRatio, + height = _ref4.height, + width = _ref4.width; + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain'; + var isValidWidth = isPositiveNumber(width); + var isValidHeight = isPositiveNumber(height); + + if (isValidWidth && isValidHeight) { + var adjustedWidth = height * aspectRatio; + + if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) { + height = width / aspectRatio; + } else { + width = height * aspectRatio; + } + } else if (isValidWidth) { + height = width / aspectRatio; + } else if (isValidHeight) { + width = height * aspectRatio; + } + + return { + width: width, + height: height + }; + } + /** + * Get the new sizes of a rectangle after rotated. + * @param {Object} data - The original sizes. + * @returns {Object} The result sizes. + */ + + function getRotatedSizes(_ref5) { + var width = _ref5.width, + height = _ref5.height, + degree = _ref5.degree; + degree = Math.abs(degree) % 180; + + if (degree === 90) { + return { + width: height, + height: width + }; + } + + var arc = degree % 90 * Math.PI / 180; + var sinArc = Math.sin(arc); + var cosArc = Math.cos(arc); + var newWidth = width * cosArc + height * sinArc; + var newHeight = width * sinArc + height * cosArc; + return degree > 90 ? { + width: newHeight, + height: newWidth + } : { + width: newWidth, + height: newHeight + }; + } + /** + * Get a canvas which drew the given image. + * @param {HTMLImageElement} image - The image for drawing. + * @param {Object} imageData - The image data. + * @param {Object} canvasData - The canvas data. + * @param {Object} options - The options. + * @returns {HTMLCanvasElement} The result canvas. + */ + + function getSourceCanvas(image, _ref6, _ref7, _ref8) { + var imageAspectRatio = _ref6.aspectRatio, + imageNaturalWidth = _ref6.naturalWidth, + imageNaturalHeight = _ref6.naturalHeight, + _ref6$rotate = _ref6.rotate, + rotate = _ref6$rotate === void 0 ? 0 : _ref6$rotate, + _ref6$scaleX = _ref6.scaleX, + scaleX = _ref6$scaleX === void 0 ? 1 : _ref6$scaleX, + _ref6$scaleY = _ref6.scaleY, + scaleY = _ref6$scaleY === void 0 ? 1 : _ref6$scaleY; + var aspectRatio = _ref7.aspectRatio, + naturalWidth = _ref7.naturalWidth, + naturalHeight = _ref7.naturalHeight; + var _ref8$fillColor = _ref8.fillColor, + fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor, + _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled, + imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE, + _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality, + imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ, + _ref8$maxWidth = _ref8.maxWidth, + maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth, + _ref8$maxHeight = _ref8.maxHeight, + maxHeight = _ref8$maxHeight === void 0 ? Infinity : _ref8$maxHeight, + _ref8$minWidth = _ref8.minWidth, + minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth, + _ref8$minHeight = _ref8.minHeight, + minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight; + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + var maxSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: maxWidth, + height: maxHeight + }); + var minSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: minWidth, + height: minHeight + }, 'cover'); + var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth)); + var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight)); // Note: should always use image's natural sizes for drawing as + // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90 + + var destMaxSizes = getAdjustedSizes({ + aspectRatio: imageAspectRatio, + width: maxWidth, + height: maxHeight + }); + var destMinSizes = getAdjustedSizes({ + aspectRatio: imageAspectRatio, + width: minWidth, + height: minHeight + }, 'cover'); + var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth)); + var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight)); + var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight]; + canvas.width = normalizeDecimalNumber(width); + canvas.height = normalizeDecimalNumber(height); + context.fillStyle = fillColor; + context.fillRect(0, 0, width, height); + context.save(); + context.translate(width / 2, height / 2); + context.rotate(rotate * Math.PI / 180); + context.scale(scaleX, scaleY); + context.imageSmoothingEnabled = imageSmoothingEnabled; + context.imageSmoothingQuality = imageSmoothingQuality; + context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + })))); + context.restore(); + return canvas; + } + var fromCharCode = String.fromCharCode; + /** + * Get string from char code in data view. + * @param {DataView} dataView - The data view for read. + * @param {number} start - The start index. + * @param {number} length - The read length. + * @returns {string} The read result. + */ + + function getStringFromCharCode(dataView, start, length) { + var str = ''; + length += start; + + for (var i = start; i < length; i += 1) { + str += fromCharCode(dataView.getUint8(i)); + } + + return str; + } + var REGEXP_DATA_URL_HEAD = /^data:.*,/; + /** + * Transform Data URL to array buffer. + * @param {string} dataURL - The Data URL to transform. + * @returns {ArrayBuffer} The result array buffer. + */ + + function dataURLToArrayBuffer(dataURL) { + var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, ''); + var binary = atob(base64); + var arrayBuffer = new ArrayBuffer(binary.length); + var uint8 = new Uint8Array(arrayBuffer); + forEach(uint8, function (value, i) { + uint8[i] = binary.charCodeAt(i); + }); + return arrayBuffer; + } + /** + * Transform array buffer to Data URL. + * @param {ArrayBuffer} arrayBuffer - The array buffer to transform. + * @param {string} mimeType - The mime type of the Data URL. + * @returns {string} The result Data URL. + */ + + function arrayBufferToDataURL(arrayBuffer, mimeType) { + var chunks = []; // Chunk Typed Array for better performance (#435) + + var chunkSize = 8192; + var uint8 = new Uint8Array(arrayBuffer); + + while (uint8.length > 0) { + // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9 + // eslint-disable-next-line prefer-spread + chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize)))); + uint8 = uint8.subarray(chunkSize); + } + + return "data:".concat(mimeType, ";base64,").concat(btoa(chunks.join(''))); + } + /** + * Get orientation value from given array buffer. + * @param {ArrayBuffer} arrayBuffer - The array buffer to read. + * @returns {number} The read orientation value. + */ + + function resetAndGetOrientation(arrayBuffer) { + var dataView = new DataView(arrayBuffer); + var orientation; // Ignores range error when the image does not have correct Exif information + + try { + var littleEndian; + var app1Start; + var ifdStart; // Only handle JPEG image (start by 0xFFD8) + + if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) { + var length = dataView.byteLength; + var offset = 2; + + while (offset + 1 < length) { + if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) { + app1Start = offset; + break; + } + + offset += 1; + } + } + + if (app1Start) { + var exifIDCode = app1Start + 4; + var tiffOffset = app1Start + 10; + + if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') { + var endianness = dataView.getUint16(tiffOffset); + littleEndian = endianness === 0x4949; + + if (littleEndian || endianness === 0x4D4D + /* bigEndian */ + ) { + if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) { + var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian); + + if (firstIFDOffset >= 0x00000008) { + ifdStart = tiffOffset + firstIFDOffset; + } + } + } + } + } + + if (ifdStart) { + var _length = dataView.getUint16(ifdStart, littleEndian); + + var _offset; + + var i; + + for (i = 0; i < _length; i += 1) { + _offset = ifdStart + i * 12 + 2; + + if (dataView.getUint16(_offset, littleEndian) === 0x0112 + /* Orientation */ + ) { + // 8 is the offset of the current tag's value + _offset += 8; // Get the original orientation value + + orientation = dataView.getUint16(_offset, littleEndian); // Override the orientation with its default value + + dataView.setUint16(_offset, 1, littleEndian); + break; + } + } + } + } catch (error) { + orientation = 1; + } + + return orientation; + } + /** + * Parse Exif Orientation value. + * @param {number} orientation - The orientation to parse. + * @returns {Object} The parsed result. + */ + + function parseOrientation(orientation) { + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + + switch (orientation) { + // Flip horizontal + case 2: + scaleX = -1; + break; + // Rotate left 180° + + case 3: + rotate = -180; + break; + // Flip vertical + + case 4: + scaleY = -1; + break; + // Flip vertical and rotate right 90° + + case 5: + rotate = 90; + scaleY = -1; + break; + // Rotate right 90° + + case 6: + rotate = 90; + break; + // Flip horizontal and rotate right 90° + + case 7: + rotate = 90; + scaleX = -1; + break; + // Rotate left 90° + + case 8: + rotate = -90; + break; + + default: + } + + return { + rotate: rotate, + scaleX: scaleX, + scaleY: scaleY + }; + } + + var render = { + render: function render() { + this.initContainer(); + this.initCanvas(); + this.initCropBox(); + this.renderCanvas(); + + if (this.cropped) { + this.renderCropBox(); + } + }, + initContainer: function initContainer() { + var element = this.element, + options = this.options, + container = this.container, + cropper = this.cropper; + addClass(cropper, CLASS_HIDDEN); + removeClass(element, CLASS_HIDDEN); + var containerData = { + width: Math.max(container.offsetWidth, Number(options.minContainerWidth) || 200), + height: Math.max(container.offsetHeight, Number(options.minContainerHeight) || 100) + }; + this.containerData = containerData; + setStyle(cropper, { + width: containerData.width, + height: containerData.height + }); + addClass(element, CLASS_HIDDEN); + removeClass(cropper, CLASS_HIDDEN); + }, + // Canvas (image wrapper) + initCanvas: function initCanvas() { + var containerData = this.containerData, + imageData = this.imageData; + var viewMode = this.options.viewMode; + var rotated = Math.abs(imageData.rotate) % 180 === 90; + var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth; + var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight; + var aspectRatio = naturalWidth / naturalHeight; + var canvasWidth = containerData.width; + var canvasHeight = containerData.height; + + if (containerData.height * aspectRatio > containerData.width) { + if (viewMode === 3) { + canvasWidth = containerData.height * aspectRatio; + } else { + canvasHeight = containerData.width / aspectRatio; + } + } else if (viewMode === 3) { + canvasHeight = containerData.width / aspectRatio; + } else { + canvasWidth = containerData.height * aspectRatio; + } + + var canvasData = { + aspectRatio: aspectRatio, + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + width: canvasWidth, + height: canvasHeight + }; + canvasData.left = (containerData.width - canvasWidth) / 2; + canvasData.top = (containerData.height - canvasHeight) / 2; + canvasData.oldLeft = canvasData.left; + canvasData.oldTop = canvasData.top; + this.canvasData = canvasData; + this.limited = viewMode === 1 || viewMode === 2; + this.limitCanvas(true, true); + this.initialImageData = assign({}, imageData); + this.initialCanvasData = assign({}, canvasData); + }, + limitCanvas: function limitCanvas(sizeLimited, positionLimited) { + var options = this.options, + containerData = this.containerData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + var viewMode = options.viewMode; + var aspectRatio = canvasData.aspectRatio; + var cropped = this.cropped && cropBoxData; + + if (sizeLimited) { + var minCanvasWidth = Number(options.minCanvasWidth) || 0; + var minCanvasHeight = Number(options.minCanvasHeight) || 0; + + if (viewMode > 1) { + minCanvasWidth = Math.max(minCanvasWidth, containerData.width); + minCanvasHeight = Math.max(minCanvasHeight, containerData.height); + + if (viewMode === 3) { + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } else if (viewMode > 0) { + if (minCanvasWidth) { + minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0); + } else if (minCanvasHeight) { + minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0); + } else if (cropped) { + minCanvasWidth = cropBoxData.width; + minCanvasHeight = cropBoxData.height; + + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } + + var _getAdjustedSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: minCanvasWidth, + height: minCanvasHeight + }); + + minCanvasWidth = _getAdjustedSizes.width; + minCanvasHeight = _getAdjustedSizes.height; + canvasData.minWidth = minCanvasWidth; + canvasData.minHeight = minCanvasHeight; + canvasData.maxWidth = Infinity; + canvasData.maxHeight = Infinity; + } + + if (positionLimited) { + if (viewMode > (cropped ? 0 : 1)) { + var newCanvasLeft = containerData.width - canvasData.width; + var newCanvasTop = containerData.height - canvasData.height; + canvasData.minLeft = Math.min(0, newCanvasLeft); + canvasData.minTop = Math.min(0, newCanvasTop); + canvasData.maxLeft = Math.max(0, newCanvasLeft); + canvasData.maxTop = Math.max(0, newCanvasTop); + + if (cropped && this.limited) { + canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width)); + canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height)); + canvasData.maxLeft = cropBoxData.left; + canvasData.maxTop = cropBoxData.top; + + if (viewMode === 2) { + if (canvasData.width >= containerData.width) { + canvasData.minLeft = Math.min(0, newCanvasLeft); + canvasData.maxLeft = Math.max(0, newCanvasLeft); + } + + if (canvasData.height >= containerData.height) { + canvasData.minTop = Math.min(0, newCanvasTop); + canvasData.maxTop = Math.max(0, newCanvasTop); + } + } + } + } else { + canvasData.minLeft = -canvasData.width; + canvasData.minTop = -canvasData.height; + canvasData.maxLeft = containerData.width; + canvasData.maxTop = containerData.height; + } + } + }, + renderCanvas: function renderCanvas(changed, transformed) { + var canvasData = this.canvasData, + imageData = this.imageData; + + if (transformed) { + var _getRotatedSizes = getRotatedSizes({ + width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1), + height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1), + degree: imageData.rotate || 0 + }), + naturalWidth = _getRotatedSizes.width, + naturalHeight = _getRotatedSizes.height; + + var width = canvasData.width * (naturalWidth / canvasData.naturalWidth); + var height = canvasData.height * (naturalHeight / canvasData.naturalHeight); + canvasData.left -= (width - canvasData.width) / 2; + canvasData.top -= (height - canvasData.height) / 2; + canvasData.width = width; + canvasData.height = height; + canvasData.aspectRatio = naturalWidth / naturalHeight; + canvasData.naturalWidth = naturalWidth; + canvasData.naturalHeight = naturalHeight; + this.limitCanvas(true, false); + } + + if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) { + canvasData.left = canvasData.oldLeft; + } + + if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) { + canvasData.top = canvasData.oldTop; + } + + canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth); + canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight); + this.limitCanvas(false, true); + canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft); + canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop); + canvasData.oldLeft = canvasData.left; + canvasData.oldTop = canvasData.top; + setStyle(this.canvas, assign({ + width: canvasData.width, + height: canvasData.height + }, getTransforms({ + translateX: canvasData.left, + translateY: canvasData.top + }))); + this.renderImage(changed); + + if (this.cropped && this.limited) { + this.limitCropBox(true, true); + } + }, + renderImage: function renderImage(changed) { + var canvasData = this.canvasData, + imageData = this.imageData; + var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth); + var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight); + assign(imageData, { + width: width, + height: height, + left: (canvasData.width - width) / 2, + top: (canvasData.height - height) / 2 + }); + setStyle(this.image, assign({ + width: imageData.width, + height: imageData.height + }, getTransforms(assign({ + translateX: imageData.left, + translateY: imageData.top + }, imageData)))); + + if (changed) { + this.output(); + } + }, + initCropBox: function initCropBox() { + var options = this.options, + canvasData = this.canvasData; + var aspectRatio = options.aspectRatio || options.initialAspectRatio; + var autoCropArea = Number(options.autoCropArea) || 0.8; + var cropBoxData = { + width: canvasData.width, + height: canvasData.height + }; + + if (aspectRatio) { + if (canvasData.height * aspectRatio > canvasData.width) { + cropBoxData.height = cropBoxData.width / aspectRatio; + } else { + cropBoxData.width = cropBoxData.height * aspectRatio; + } + } + + this.cropBoxData = cropBoxData; + this.limitCropBox(true, true); // Initialize auto crop area + + cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); + cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); // The width/height of auto crop area must large than "minWidth/Height" + + cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea); + cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea); + cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2; + cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2; + cropBoxData.oldLeft = cropBoxData.left; + cropBoxData.oldTop = cropBoxData.top; + this.initialCropBoxData = assign({}, cropBoxData); + }, + limitCropBox: function limitCropBox(sizeLimited, positionLimited) { + var options = this.options, + containerData = this.containerData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData, + limited = this.limited; + var aspectRatio = options.aspectRatio; + + if (sizeLimited) { + var minCropBoxWidth = Number(options.minCropBoxWidth) || 0; + var minCropBoxHeight = Number(options.minCropBoxHeight) || 0; + var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width; + var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height; // The min/maxCropBoxWidth/Height must be less than container's width/height + + minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width); + minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height); + + if (aspectRatio) { + if (minCropBoxWidth && minCropBoxHeight) { + if (minCropBoxHeight * aspectRatio > minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + } else if (minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else if (minCropBoxHeight) { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + + if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) { + maxCropBoxHeight = maxCropBoxWidth / aspectRatio; + } else { + maxCropBoxWidth = maxCropBoxHeight * aspectRatio; + } + } // The minWidth/Height must be less than maxWidth/Height + + + cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth); + cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight); + cropBoxData.maxWidth = maxCropBoxWidth; + cropBoxData.maxHeight = maxCropBoxHeight; + } + + if (positionLimited) { + if (limited) { + cropBoxData.minLeft = Math.max(0, canvasData.left); + cropBoxData.minTop = Math.max(0, canvasData.top); + cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width; + cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height; + } else { + cropBoxData.minLeft = 0; + cropBoxData.minTop = 0; + cropBoxData.maxLeft = containerData.width - cropBoxData.width; + cropBoxData.maxTop = containerData.height - cropBoxData.height; + } + } + }, + renderCropBox: function renderCropBox() { + var options = this.options, + containerData = this.containerData, + cropBoxData = this.cropBoxData; + + if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) { + cropBoxData.left = cropBoxData.oldLeft; + } + + if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) { + cropBoxData.top = cropBoxData.oldTop; + } + + cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); + cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); + this.limitCropBox(false, true); + cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft); + cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop); + cropBoxData.oldLeft = cropBoxData.left; + cropBoxData.oldTop = cropBoxData.top; + + if (options.movable && options.cropBoxMovable) { + // Turn to move the canvas when the crop box is equal to the container + setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL); + } + + setStyle(this.cropBox, assign({ + width: cropBoxData.width, + height: cropBoxData.height + }, getTransforms({ + translateX: cropBoxData.left, + translateY: cropBoxData.top + }))); + + if (this.cropped && this.limited) { + this.limitCanvas(true, true); + } + + if (!this.disabled) { + this.output(); + } + }, + output: function output() { + this.preview(); + dispatchEvent(this.element, EVENT_CROP, this.getData()); + } + }; + + var preview = { + initPreview: function initPreview() { + var element = this.element, + crossOrigin = this.crossOrigin; + var preview = this.options.preview; + var url = crossOrigin ? this.crossOriginUrl : this.url; + var alt = element.alt || 'The image to preview'; + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = url; + image.alt = alt; + this.viewBox.appendChild(image); + this.viewBoxImage = image; + + if (!preview) { + return; + } + + var previews = preview; + + if (typeof preview === 'string') { + previews = element.ownerDocument.querySelectorAll(preview); + } else if (preview.querySelector) { + previews = [preview]; + } + + this.previews = previews; + forEach(previews, function (el) { + var img = document.createElement('img'); // Save the original size for recover + + setData(el, DATA_PREVIEW, { + width: el.offsetWidth, + height: el.offsetHeight, + html: el.innerHTML + }); + + if (crossOrigin) { + img.crossOrigin = crossOrigin; + } + + img.src = url; + img.alt = alt; + /** + * Override img element styles + * Add `display:block` to avoid margin top issue + * Add `height:auto` to override `height` attribute on IE8 + * (Occur only when margin-top <= -height) + */ + + img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;"'; + el.innerHTML = ''; + el.appendChild(img); + }); + }, + resetPreview: function resetPreview() { + forEach(this.previews, function (element) { + var data = getData(element, DATA_PREVIEW); + setStyle(element, { + width: data.width, + height: data.height + }); + element.innerHTML = data.html; + removeData(element, DATA_PREVIEW); + }); + }, + preview: function preview() { + var imageData = this.imageData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + var cropBoxWidth = cropBoxData.width, + cropBoxHeight = cropBoxData.height; + var width = imageData.width, + height = imageData.height; + var left = cropBoxData.left - canvasData.left - imageData.left; + var top = cropBoxData.top - canvasData.top - imageData.top; + + if (!this.cropped || this.disabled) { + return; + } + + setStyle(this.viewBoxImage, assign({ + width: width, + height: height + }, getTransforms(assign({ + translateX: -left, + translateY: -top + }, imageData)))); + forEach(this.previews, function (element) { + var data = getData(element, DATA_PREVIEW); + var originalWidth = data.width; + var originalHeight = data.height; + var newWidth = originalWidth; + var newHeight = originalHeight; + var ratio = 1; + + if (cropBoxWidth) { + ratio = originalWidth / cropBoxWidth; + newHeight = cropBoxHeight * ratio; + } + + if (cropBoxHeight && newHeight > originalHeight) { + ratio = originalHeight / cropBoxHeight; + newWidth = cropBoxWidth * ratio; + newHeight = originalHeight; + } + + setStyle(element, { + width: newWidth, + height: newHeight + }); + setStyle(element.getElementsByTagName('img')[0], assign({ + width: width * ratio, + height: height * ratio + }, getTransforms(assign({ + translateX: -left * ratio, + translateY: -top * ratio + }, imageData)))); + }); + } + }; + + var events = { + bind: function bind() { + var element = this.element, + options = this.options, + cropper = this.cropper; + + if (isFunction(options.cropstart)) { + addListener(element, EVENT_CROP_START, options.cropstart); + } + + if (isFunction(options.cropmove)) { + addListener(element, EVENT_CROP_MOVE, options.cropmove); + } + + if (isFunction(options.cropend)) { + addListener(element, EVENT_CROP_END, options.cropend); + } + + if (isFunction(options.crop)) { + addListener(element, EVENT_CROP, options.crop); + } + + if (isFunction(options.zoom)) { + addListener(element, EVENT_ZOOM, options.zoom); + } + + addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this)); + + if (options.zoomable && options.zoomOnWheel) { + addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), { + passive: false, + capture: true + }); + } + + if (options.toggleDragModeOnDblclick) { + addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this)); + } + + addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this)); + addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this)); + + if (options.responsive) { + addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this)); + } + }, + unbind: function unbind() { + var element = this.element, + options = this.options, + cropper = this.cropper; + + if (isFunction(options.cropstart)) { + removeListener(element, EVENT_CROP_START, options.cropstart); + } + + if (isFunction(options.cropmove)) { + removeListener(element, EVENT_CROP_MOVE, options.cropmove); + } + + if (isFunction(options.cropend)) { + removeListener(element, EVENT_CROP_END, options.cropend); + } + + if (isFunction(options.crop)) { + removeListener(element, EVENT_CROP, options.crop); + } + + if (isFunction(options.zoom)) { + removeListener(element, EVENT_ZOOM, options.zoom); + } + + removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart); + + if (options.zoomable && options.zoomOnWheel) { + removeListener(cropper, EVENT_WHEEL, this.onWheel, { + passive: false, + capture: true + }); + } + + if (options.toggleDragModeOnDblclick) { + removeListener(cropper, EVENT_DBLCLICK, this.onDblclick); + } + + removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove); + removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd); + + if (options.responsive) { + removeListener(window, EVENT_RESIZE, this.onResize); + } + } + }; + + var handlers = { + resize: function resize() { + var options = this.options, + container = this.container, + containerData = this.containerData; + var minContainerWidth = Number(options.minContainerWidth) || MIN_CONTAINER_WIDTH; + var minContainerHeight = Number(options.minContainerHeight) || MIN_CONTAINER_HEIGHT; + + if (this.disabled || containerData.width <= minContainerWidth || containerData.height <= minContainerHeight) { + return; + } + + var ratio = container.offsetWidth / containerData.width; // Resize when width changed or height changed + + if (ratio !== 1 || container.offsetHeight !== containerData.height) { + var canvasData; + var cropBoxData; + + if (options.restore) { + canvasData = this.getCanvasData(); + cropBoxData = this.getCropBoxData(); + } + + this.render(); + + if (options.restore) { + this.setCanvasData(forEach(canvasData, function (n, i) { + canvasData[i] = n * ratio; + })); + this.setCropBoxData(forEach(cropBoxData, function (n, i) { + cropBoxData[i] = n * ratio; + })); + } + } + }, + dblclick: function dblclick() { + if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) { + return; + } + + this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP); + }, + wheel: function wheel(event) { + var _this = this; + + var ratio = Number(this.options.wheelZoomRatio) || 0.1; + var delta = 1; + + if (this.disabled) { + return; + } + + event.preventDefault(); // Limit wheel speed to prevent zoom too fast (#21) + + if (this.wheeling) { + return; + } + + this.wheeling = true; + setTimeout(function () { + _this.wheeling = false; + }, 50); + + if (event.deltaY) { + delta = event.deltaY > 0 ? 1 : -1; + } else if (event.wheelDelta) { + delta = -event.wheelDelta / 120; + } else if (event.detail) { + delta = event.detail > 0 ? 1 : -1; + } + + this.zoom(-delta * ratio, event); + }, + cropStart: function cropStart(event) { + var buttons = event.buttons, + button = event.button; + + if (this.disabled // No primary button (Usually the left button) + // Note that touch events have no `buttons` or `button` property + || isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0 // Open context menu + || event.ctrlKey) { + return; + } + + var options = this.options, + pointers = this.pointers; + var action; + + if (event.changedTouches) { + // Handle touch event + forEach(event.changedTouches, function (touch) { + pointers[touch.identifier] = getPointer(touch); + }); + } else { + // Handle mouse event and pointer event + pointers[event.pointerId || 0] = getPointer(event); + } + + if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) { + action = ACTION_ZOOM; + } else { + action = getData(event.target, DATA_ACTION); + } + + if (!REGEXP_ACTIONS.test(action)) { + return; + } + + if (dispatchEvent(this.element, EVENT_CROP_START, { + originalEvent: event, + action: action + }) === false) { + return; + } // This line is required for preventing page zooming in iOS browsers + + + event.preventDefault(); + this.action = action; + this.cropping = false; + + if (action === ACTION_CROP) { + this.cropping = true; + addClass(this.dragBox, CLASS_MODAL); + } + }, + cropMove: function cropMove(event) { + var action = this.action; + + if (this.disabled || !action) { + return; + } + + var pointers = this.pointers; + event.preventDefault(); + + if (dispatchEvent(this.element, EVENT_CROP_MOVE, { + originalEvent: event, + action: action + }) === false) { + return; + } + + if (event.changedTouches) { + forEach(event.changedTouches, function (touch) { + // The first parameter should not be undefined (#432) + assign(pointers[touch.identifier] || {}, getPointer(touch, true)); + }); + } else { + assign(pointers[event.pointerId || 0] || {}, getPointer(event, true)); + } + + this.change(event); + }, + cropEnd: function cropEnd(event) { + if (this.disabled) { + return; + } + + var action = this.action, + pointers = this.pointers; + + if (event.changedTouches) { + forEach(event.changedTouches, function (touch) { + delete pointers[touch.identifier]; + }); + } else { + delete pointers[event.pointerId || 0]; + } + + if (!action) { + return; + } + + event.preventDefault(); + + if (!Object.keys(pointers).length) { + this.action = ''; + } + + if (this.cropping) { + this.cropping = false; + toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal); + } + + dispatchEvent(this.element, EVENT_CROP_END, { + originalEvent: event, + action: action + }); + } + }; + + var change = { + change: function change(event) { + var options = this.options, + canvasData = this.canvasData, + containerData = this.containerData, + cropBoxData = this.cropBoxData, + pointers = this.pointers; + var action = this.action; + var aspectRatio = options.aspectRatio; + var left = cropBoxData.left, + top = cropBoxData.top, + width = cropBoxData.width, + height = cropBoxData.height; + var right = left + width; + var bottom = top + height; + var minLeft = 0; + var minTop = 0; + var maxWidth = containerData.width; + var maxHeight = containerData.height; + var renderable = true; + var offset; // Locking aspect ratio in "free mode" by holding shift key + + if (!aspectRatio && event.shiftKey) { + aspectRatio = width && height ? width / height : 1; + } + + if (this.limited) { + minLeft = cropBoxData.minLeft; + minTop = cropBoxData.minTop; + maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width); + maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height); + } + + var pointer = pointers[Object.keys(pointers)[0]]; + var range = { + x: pointer.endX - pointer.startX, + y: pointer.endY - pointer.startY + }; + + var check = function check(side) { + switch (side) { + case ACTION_EAST: + if (right + range.x > maxWidth) { + range.x = maxWidth - right; + } + + break; + + case ACTION_WEST: + if (left + range.x < minLeft) { + range.x = minLeft - left; + } + + break; + + case ACTION_NORTH: + if (top + range.y < minTop) { + range.y = minTop - top; + } + + break; + + case ACTION_SOUTH: + if (bottom + range.y > maxHeight) { + range.y = maxHeight - bottom; + } + + break; + + default: + } + }; + + switch (action) { + // Move crop box + case ACTION_ALL: + left += range.x; + top += range.y; + break; + // Resize crop box + + case ACTION_EAST: + if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + check(ACTION_EAST); + width += range.x; + + if (width < 0) { + action = ACTION_WEST; + width = -width; + left -= width; + } + + if (aspectRatio) { + height = width / aspectRatio; + top += (cropBoxData.height - height) / 2; + } + + break; + + case ACTION_NORTH: + if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + + if (height < 0) { + action = ACTION_SOUTH; + height = -height; + top -= height; + } + + if (aspectRatio) { + width = height * aspectRatio; + left += (cropBoxData.width - width) / 2; + } + + break; + + case ACTION_WEST: + if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + check(ACTION_WEST); + width -= range.x; + left += range.x; + + if (width < 0) { + action = ACTION_EAST; + width = -width; + left -= width; + } + + if (aspectRatio) { + height = width / aspectRatio; + top += (cropBoxData.height - height) / 2; + } + + break; + + case ACTION_SOUTH: + if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + check(ACTION_SOUTH); + height += range.y; + + if (height < 0) { + action = ACTION_NORTH; + height = -height; + top -= height; + } + + if (aspectRatio) { + width = height * aspectRatio; + left += (cropBoxData.width - width) / 2; + } + + break; + + case ACTION_NORTH_EAST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || right >= maxWidth)) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + width = height * aspectRatio; + } else { + check(ACTION_NORTH); + check(ACTION_EAST); + + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_WEST; + height = -height; + width = -width; + top -= height; + left -= width; + } else if (width < 0) { + action = ACTION_NORTH_WEST; + width = -width; + left -= width; + } else if (height < 0) { + action = ACTION_SOUTH_EAST; + height = -height; + top -= height; + } + + break; + + case ACTION_NORTH_WEST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || left <= minLeft)) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + width = height * aspectRatio; + left += cropBoxData.width - width; + } else { + check(ACTION_NORTH); + check(ACTION_WEST); + + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_EAST; + height = -height; + width = -width; + top -= height; + left -= width; + } else if (width < 0) { + action = ACTION_NORTH_EAST; + width = -width; + left -= width; + } else if (height < 0) { + action = ACTION_SOUTH_WEST; + height = -height; + top -= height; + } + + break; + + case ACTION_SOUTH_WEST: + if (aspectRatio) { + if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) { + renderable = false; + break; + } + + check(ACTION_WEST); + width -= range.x; + left += range.x; + height = width / aspectRatio; + } else { + check(ACTION_SOUTH); + check(ACTION_WEST); + + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_EAST; + height = -height; + width = -width; + top -= height; + left -= width; + } else if (width < 0) { + action = ACTION_SOUTH_EAST; + width = -width; + left -= width; + } else if (height < 0) { + action = ACTION_NORTH_WEST; + height = -height; + top -= height; + } + + break; + + case ACTION_SOUTH_EAST: + if (aspectRatio) { + if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) { + renderable = false; + break; + } + + check(ACTION_EAST); + width += range.x; + height = width / aspectRatio; + } else { + check(ACTION_SOUTH); + check(ACTION_EAST); + + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_WEST; + height = -height; + width = -width; + top -= height; + left -= width; + } else if (width < 0) { + action = ACTION_SOUTH_WEST; + width = -width; + left -= width; + } else if (height < 0) { + action = ACTION_NORTH_EAST; + height = -height; + top -= height; + } + + break; + // Move canvas + + case ACTION_MOVE: + this.move(range.x, range.y); + renderable = false; + break; + // Zoom canvas + + case ACTION_ZOOM: + this.zoom(getMaxZoomRatio(pointers), event); + renderable = false; + break; + // Create crop box + + case ACTION_CROP: + if (!range.x || !range.y) { + renderable = false; + break; + } + + offset = getOffset(this.cropper); + left = pointer.startX - offset.left; + top = pointer.startY - offset.top; + width = cropBoxData.minWidth; + height = cropBoxData.minHeight; + + if (range.x > 0) { + action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST; + } else if (range.x < 0) { + left -= width; + action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST; + } + + if (range.y < 0) { + top -= height; + } // Show the crop box if is hidden + + + if (!this.cropped) { + removeClass(this.cropBox, CLASS_HIDDEN); + this.cropped = true; + + if (this.limited) { + this.limitCropBox(true, true); + } + } + + break; + + default: + } + + if (renderable) { + cropBoxData.width = width; + cropBoxData.height = height; + cropBoxData.left = left; + cropBoxData.top = top; + this.action = action; + this.renderCropBox(); + } // Override + + + forEach(pointers, function (p) { + p.startX = p.endX; + p.startY = p.endY; + }); + } + }; + + var methods = { + // Show the crop box manually + crop: function crop() { + if (this.ready && !this.cropped && !this.disabled) { + this.cropped = true; + this.limitCropBox(true, true); + + if (this.options.modal) { + addClass(this.dragBox, CLASS_MODAL); + } + + removeClass(this.cropBox, CLASS_HIDDEN); + this.setCropBoxData(this.initialCropBoxData); + } + + return this; + }, + // Reset the image and crop box to their initial states + reset: function reset() { + if (this.ready && !this.disabled) { + this.imageData = assign({}, this.initialImageData); + this.canvasData = assign({}, this.initialCanvasData); + this.cropBoxData = assign({}, this.initialCropBoxData); + this.renderCanvas(); + + if (this.cropped) { + this.renderCropBox(); + } + } + + return this; + }, + // Clear the crop box + clear: function clear() { + if (this.cropped && !this.disabled) { + assign(this.cropBoxData, { + left: 0, + top: 0, + width: 0, + height: 0 + }); + this.cropped = false; + this.renderCropBox(); + this.limitCanvas(true, true); // Render canvas after crop box rendered + + this.renderCanvas(); + removeClass(this.dragBox, CLASS_MODAL); + addClass(this.cropBox, CLASS_HIDDEN); + } + + return this; + }, + + /** + * Replace the image's src and rebuild the cropper + * @param {string} url - The new URL. + * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one. + * @returns {Cropper} this + */ + replace: function replace(url) { + var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!this.disabled && url) { + if (this.isImg) { + this.element.src = url; + } + + if (hasSameSize) { + this.url = url; + this.image.src = url; + + if (this.ready) { + this.viewBoxImage.src = url; + forEach(this.previews, function (element) { + element.getElementsByTagName('img')[0].src = url; + }); + } + } else { + if (this.isImg) { + this.replaced = true; + } + + this.options.data = null; + this.uncreate(); + this.load(url); + } + } + + return this; + }, + // Enable (unfreeze) the cropper + enable: function enable() { + if (this.ready && this.disabled) { + this.disabled = false; + removeClass(this.cropper, CLASS_DISABLED); + } + + return this; + }, + // Disable (freeze) the cropper + disable: function disable() { + if (this.ready && !this.disabled) { + this.disabled = true; + addClass(this.cropper, CLASS_DISABLED); + } + + return this; + }, + + /** + * Destroy the cropper and remove the instance from the image + * @returns {Cropper} this + */ + destroy: function destroy() { + var element = this.element; + + if (!element[NAMESPACE]) { + return this; + } + + element[NAMESPACE] = undefined; + + if (this.isImg && this.replaced) { + element.src = this.originalUrl; + } + + this.uncreate(); + return this; + }, + + /** + * Move the canvas with relative offsets + * @param {number} offsetX - The relative offset distance on the x-axis. + * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis. + * @returns {Cropper} this + */ + move: function move(offsetX) { + var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX; + var _this$canvasData = this.canvasData, + left = _this$canvasData.left, + top = _this$canvasData.top; + return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY)); + }, + + /** + * Move the canvas to an absolute point + * @param {number} x - The x-axis coordinate. + * @param {number} [y=x] - The y-axis coordinate. + * @returns {Cropper} this + */ + moveTo: function moveTo(x) { + var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x; + var canvasData = this.canvasData; + var changed = false; + x = Number(x); + y = Number(y); + + if (this.ready && !this.disabled && this.options.movable) { + if (isNumber(x)) { + canvasData.left = x; + changed = true; + } + + if (isNumber(y)) { + canvasData.top = y; + changed = true; + } + + if (changed) { + this.renderCanvas(true); + } + } + + return this; + }, + + /** + * Zoom the canvas with a relative ratio + * @param {number} ratio - The target ratio. + * @param {Event} _originalEvent - The original event if any. + * @returns {Cropper} this + */ + zoom: function zoom(ratio, _originalEvent) { + var canvasData = this.canvasData; + ratio = Number(ratio); + + if (ratio < 0) { + ratio = 1 / (1 - ratio); + } else { + ratio = 1 + ratio; + } + + return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent); + }, + + /** + * Zoom the canvas to an absolute ratio + * @param {number} ratio - The target ratio. + * @param {Object} pivot - The zoom pivot point coordinate. + * @param {Event} _originalEvent - The original event if any. + * @returns {Cropper} this + */ + zoomTo: function zoomTo(ratio, pivot, _originalEvent) { + var options = this.options, + canvasData = this.canvasData; + var width = canvasData.width, + height = canvasData.height, + naturalWidth = canvasData.naturalWidth, + naturalHeight = canvasData.naturalHeight; + ratio = Number(ratio); + + if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) { + var newWidth = naturalWidth * ratio; + var newHeight = naturalHeight * ratio; + + if (dispatchEvent(this.element, EVENT_ZOOM, { + ratio: ratio, + oldRatio: width / naturalWidth, + originalEvent: _originalEvent + }) === false) { + return this; + } + + if (_originalEvent) { + var pointers = this.pointers; + var offset = getOffset(this.cropper); + var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : { + pageX: _originalEvent.pageX, + pageY: _originalEvent.pageY + }; // Zoom from the triggering point of the event + + canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width); + canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height); + } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) { + canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width); + canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height); + } else { + // Zoom from the center of the canvas + canvasData.left -= (newWidth - width) / 2; + canvasData.top -= (newHeight - height) / 2; + } + + canvasData.width = newWidth; + canvasData.height = newHeight; + this.renderCanvas(true); + } + + return this; + }, + + /** + * Rotate the canvas with a relative degree + * @param {number} degree - The rotate degree. + * @returns {Cropper} this + */ + rotate: function rotate(degree) { + return this.rotateTo((this.imageData.rotate || 0) + Number(degree)); + }, + + /** + * Rotate the canvas to an absolute degree + * @param {number} degree - The rotate degree. + * @returns {Cropper} this + */ + rotateTo: function rotateTo(degree) { + degree = Number(degree); + + if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) { + this.imageData.rotate = degree % 360; + this.renderCanvas(true, true); + } + + return this; + }, + + /** + * Scale the image on the x-axis. + * @param {number} scaleX - The scale ratio on the x-axis. + * @returns {Cropper} this + */ + scaleX: function scaleX(_scaleX) { + var scaleY = this.imageData.scaleY; + return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1); + }, + + /** + * Scale the image on the y-axis. + * @param {number} scaleY - The scale ratio on the y-axis. + * @returns {Cropper} this + */ + scaleY: function scaleY(_scaleY) { + var scaleX = this.imageData.scaleX; + return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY); + }, + + /** + * Scale the image + * @param {number} scaleX - The scale ratio on the x-axis. + * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis. + * @returns {Cropper} this + */ + scale: function scale(scaleX) { + var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX; + var imageData = this.imageData; + var transformed = false; + scaleX = Number(scaleX); + scaleY = Number(scaleY); + + if (this.ready && !this.disabled && this.options.scalable) { + if (isNumber(scaleX)) { + imageData.scaleX = scaleX; + transformed = true; + } + + if (isNumber(scaleY)) { + imageData.scaleY = scaleY; + transformed = true; + } + + if (transformed) { + this.renderCanvas(true, true); + } + } + + return this; + }, + + /** + * Get the cropped area position and size data (base on the original image) + * @param {boolean} [rounded=false] - Indicate if round the data values or not. + * @returns {Object} The result cropped data. + */ + getData: function getData() { + var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var options = this.options, + imageData = this.imageData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + var data; + + if (this.ready && this.cropped) { + data = { + x: cropBoxData.left - canvasData.left, + y: cropBoxData.top - canvasData.top, + width: cropBoxData.width, + height: cropBoxData.height + }; + var ratio = imageData.width / imageData.naturalWidth; + forEach(data, function (n, i) { + data[i] = n / ratio; + }); + + if (rounded) { + // In case rounding off leads to extra 1px in right or bottom border + // we should round the top-left corner and the dimension (#343). + var bottom = Math.round(data.y + data.height); + var right = Math.round(data.x + data.width); + data.x = Math.round(data.x); + data.y = Math.round(data.y); + data.width = right - data.x; + data.height = bottom - data.y; + } + } else { + data = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + } + + if (options.rotatable) { + data.rotate = imageData.rotate || 0; + } + + if (options.scalable) { + data.scaleX = imageData.scaleX || 1; + data.scaleY = imageData.scaleY || 1; + } + + return data; + }, + + /** + * Set the cropped area position and size with new data + * @param {Object} data - The new data. + * @returns {Cropper} this + */ + setData: function setData(data) { + var options = this.options, + imageData = this.imageData, + canvasData = this.canvasData; + var cropBoxData = {}; + + if (this.ready && !this.disabled && isPlainObject(data)) { + var transformed = false; + + if (options.rotatable) { + if (isNumber(data.rotate) && data.rotate !== imageData.rotate) { + imageData.rotate = data.rotate; + transformed = true; + } + } + + if (options.scalable) { + if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) { + imageData.scaleX = data.scaleX; + transformed = true; + } + + if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) { + imageData.scaleY = data.scaleY; + transformed = true; + } + } + + if (transformed) { + this.renderCanvas(true, true); + } + + var ratio = imageData.width / imageData.naturalWidth; + + if (isNumber(data.x)) { + cropBoxData.left = data.x * ratio + canvasData.left; + } + + if (isNumber(data.y)) { + cropBoxData.top = data.y * ratio + canvasData.top; + } + + if (isNumber(data.width)) { + cropBoxData.width = data.width * ratio; + } + + if (isNumber(data.height)) { + cropBoxData.height = data.height * ratio; + } + + this.setCropBoxData(cropBoxData); + } + + return this; + }, + + /** + * Get the container size data. + * @returns {Object} The result container data. + */ + getContainerData: function getContainerData() { + return this.ready ? assign({}, this.containerData) : {}; + }, + + /** + * Get the image position and size data. + * @returns {Object} The result image data. + */ + getImageData: function getImageData() { + return this.sized ? assign({}, this.imageData) : {}; + }, + + /** + * Get the canvas position and size data. + * @returns {Object} The result canvas data. + */ + getCanvasData: function getCanvasData() { + var canvasData = this.canvasData; + var data = {}; + + if (this.ready) { + forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) { + data[n] = canvasData[n]; + }); + } + + return data; + }, + + /** + * Set the canvas position and size with new data. + * @param {Object} data - The new canvas data. + * @returns {Cropper} this + */ + setCanvasData: function setCanvasData(data) { + var canvasData = this.canvasData; + var aspectRatio = canvasData.aspectRatio; + + if (this.ready && !this.disabled && isPlainObject(data)) { + if (isNumber(data.left)) { + canvasData.left = data.left; + } + + if (isNumber(data.top)) { + canvasData.top = data.top; + } + + if (isNumber(data.width)) { + canvasData.width = data.width; + canvasData.height = data.width / aspectRatio; + } else if (isNumber(data.height)) { + canvasData.height = data.height; + canvasData.width = data.height * aspectRatio; + } + + this.renderCanvas(true); + } + + return this; + }, + + /** + * Get the crop box position and size data. + * @returns {Object} The result crop box data. + */ + getCropBoxData: function getCropBoxData() { + var cropBoxData = this.cropBoxData; + var data; + + if (this.ready && this.cropped) { + data = { + left: cropBoxData.left, + top: cropBoxData.top, + width: cropBoxData.width, + height: cropBoxData.height + }; + } + + return data || {}; + }, + + /** + * Set the crop box position and size with new data. + * @param {Object} data - The new crop box data. + * @returns {Cropper} this + */ + setCropBoxData: function setCropBoxData(data) { + var cropBoxData = this.cropBoxData; + var aspectRatio = this.options.aspectRatio; + var widthChanged; + var heightChanged; + + if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) { + if (isNumber(data.left)) { + cropBoxData.left = data.left; + } + + if (isNumber(data.top)) { + cropBoxData.top = data.top; + } + + if (isNumber(data.width) && data.width !== cropBoxData.width) { + widthChanged = true; + cropBoxData.width = data.width; + } + + if (isNumber(data.height) && data.height !== cropBoxData.height) { + heightChanged = true; + cropBoxData.height = data.height; + } + + if (aspectRatio) { + if (widthChanged) { + cropBoxData.height = cropBoxData.width / aspectRatio; + } else if (heightChanged) { + cropBoxData.width = cropBoxData.height * aspectRatio; + } + } + + this.renderCropBox(); + } + + return this; + }, + + /** + * Get a canvas drawn the cropped image. + * @param {Object} [options={}] - The config options. + * @returns {HTMLCanvasElement} - The result canvas. + */ + getCroppedCanvas: function getCroppedCanvas() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (!this.ready || !window.HTMLCanvasElement) { + return null; + } + + var canvasData = this.canvasData; + var source = getSourceCanvas(this.image, this.imageData, canvasData, options); // Returns the source canvas if it is not cropped. + + if (!this.cropped) { + return source; + } + + var _this$getData = this.getData(), + initialX = _this$getData.x, + initialY = _this$getData.y, + initialWidth = _this$getData.width, + initialHeight = _this$getData.height; + + var ratio = source.width / Math.floor(canvasData.naturalWidth); + + if (ratio !== 1) { + initialX *= ratio; + initialY *= ratio; + initialWidth *= ratio; + initialHeight *= ratio; + } + + var aspectRatio = initialWidth / initialHeight; + var maxSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.maxWidth || Infinity, + height: options.maxHeight || Infinity + }); + var minSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.minWidth || 0, + height: options.minHeight || 0 + }, 'cover'); + + var _getAdjustedSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.width || (ratio !== 1 ? source.width : initialWidth), + height: options.height || (ratio !== 1 ? source.height : initialHeight) + }), + width = _getAdjustedSizes.width, + height = _getAdjustedSizes.height; + + width = Math.min(maxSizes.width, Math.max(minSizes.width, width)); + height = Math.min(maxSizes.height, Math.max(minSizes.height, height)); + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + canvas.width = normalizeDecimalNumber(width); + canvas.height = normalizeDecimalNumber(height); + context.fillStyle = options.fillColor || 'transparent'; + context.fillRect(0, 0, width, height); + var _options$imageSmoothi = options.imageSmoothingEnabled, + imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi, + imageSmoothingQuality = options.imageSmoothingQuality; + context.imageSmoothingEnabled = imageSmoothingEnabled; + + if (imageSmoothingQuality) { + context.imageSmoothingQuality = imageSmoothingQuality; + } // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage + + + var sourceWidth = source.width; + var sourceHeight = source.height; // Source canvas parameters + + var srcX = initialX; + var srcY = initialY; + var srcWidth; + var srcHeight; // Destination canvas parameters + + var dstX; + var dstY; + var dstWidth; + var dstHeight; + + if (srcX <= -initialWidth || srcX > sourceWidth) { + srcX = 0; + srcWidth = 0; + dstX = 0; + dstWidth = 0; + } else if (srcX <= 0) { + dstX = -srcX; + srcX = 0; + srcWidth = Math.min(sourceWidth, initialWidth + srcX); + dstWidth = srcWidth; + } else if (srcX <= sourceWidth) { + dstX = 0; + srcWidth = Math.min(initialWidth, sourceWidth - srcX); + dstWidth = srcWidth; + } + + if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) { + srcY = 0; + srcHeight = 0; + dstY = 0; + dstHeight = 0; + } else if (srcY <= 0) { + dstY = -srcY; + srcY = 0; + srcHeight = Math.min(sourceHeight, initialHeight + srcY); + dstHeight = srcHeight; + } else if (srcY <= sourceHeight) { + dstY = 0; + srcHeight = Math.min(initialHeight, sourceHeight - srcY); + dstHeight = srcHeight; + } + + var params = [srcX, srcY, srcWidth, srcHeight]; // Avoid "IndexSizeError" + + if (dstWidth > 0 && dstHeight > 0) { + var scale = width / initialWidth; + params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale); + } // All the numerical parameters should be integer for `drawImage` + // https://github.com/fengyuanchen/cropper/issues/476 + + + context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + })))); + return canvas; + }, + + /** + * Change the aspect ratio of the crop box. + * @param {number} aspectRatio - The new aspect ratio. + * @returns {Cropper} this + */ + setAspectRatio: function setAspectRatio(aspectRatio) { + var options = this.options; + + if (!this.disabled && !isUndefined(aspectRatio)) { + // 0 -> NaN + options.aspectRatio = Math.max(0, aspectRatio) || NaN; + + if (this.ready) { + this.initCropBox(); + + if (this.cropped) { + this.renderCropBox(); + } + } + } + + return this; + }, + + /** + * Change the drag mode. + * @param {string} mode - The new drag mode. + * @returns {Cropper} this + */ + setDragMode: function setDragMode(mode) { + var options = this.options, + dragBox = this.dragBox, + face = this.face; + + if (this.ready && !this.disabled) { + var croppable = mode === DRAG_MODE_CROP; + var movable = options.movable && mode === DRAG_MODE_MOVE; + mode = croppable || movable ? mode : DRAG_MODE_NONE; + options.dragMode = mode; + setData(dragBox, DATA_ACTION, mode); + toggleClass(dragBox, CLASS_CROP, croppable); + toggleClass(dragBox, CLASS_MOVE, movable); + + if (!options.cropBoxMovable) { + // Sync drag mode to crop box when it is not movable + setData(face, DATA_ACTION, mode); + toggleClass(face, CLASS_CROP, croppable); + toggleClass(face, CLASS_MOVE, movable); + } + } + + return this; + } + }; + + var AnotherCropper = WINDOW.Cropper; + + var Cropper = + /*#__PURE__*/ + function () { + /** + * Create a new Cropper. + * @param {Element} element - The target element for cropping. + * @param {Object} [options={}] - The configuration options. + */ + function Cropper(element) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + _classCallCheck(this, Cropper); + + if (!element || !REGEXP_TAG_NAME.test(element.tagName)) { + throw new Error('The first argument is required and must be an <img> or <canvas> element.'); + } + + this.element = element; + this.options = assign({}, DEFAULTS, isPlainObject(options) && options); + this.cropped = false; + this.disabled = false; + this.pointers = {}; + this.ready = false; + this.reloading = false; + this.replaced = false; + this.sized = false; + this.sizing = false; + this.init(); + } + + _createClass(Cropper, [{ + key: "init", + value: function init() { + var element = this.element; + var tagName = element.tagName.toLowerCase(); + var url; + + if (element[NAMESPACE]) { + return; + } + + element[NAMESPACE] = this; + + if (tagName === 'img') { + this.isImg = true; // e.g.: "img/picture.jpg" + + url = element.getAttribute('src') || ''; + this.originalUrl = url; // Stop when it's a blank image + + if (!url) { + return; + } // e.g.: "http://example.com/img/picture.jpg" + + + url = element.src; + } else if (tagName === 'canvas' && window.HTMLCanvasElement) { + url = element.toDataURL(); + } + + this.load(url); + } + }, { + key: "load", + value: function load(url) { + var _this = this; + + if (!url) { + return; + } + + this.url = url; + this.imageData = {}; + var element = this.element, + options = this.options; + + if (!options.rotatable && !options.scalable) { + options.checkOrientation = false; + } // Only IE10+ supports Typed Arrays + + + if (!options.checkOrientation || !window.ArrayBuffer) { + this.clone(); + return; + } // Detect the mime type of the image directly if it is a Data URL + + + if (REGEXP_DATA_URL.test(url)) { + // Read ArrayBuffer from Data URL of JPEG images directly for better performance + if (REGEXP_DATA_URL_JPEG.test(url)) { + this.read(dataURLToArrayBuffer(url)); + } else { + // Only a JPEG image may contains Exif Orientation information, + // the rest types of Data URLs are not necessary to check orientation at all. + this.clone(); + } + + return; + } // 1. Detect the mime type of the image by a XMLHttpRequest. + // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image. + + + var xhr = new XMLHttpRequest(); + var clone = this.clone.bind(this); + this.reloading = true; + this.xhr = xhr; // 1. Cross origin requests are only supported for protocol schemes: + // http, https, data, chrome, chrome-extension. + // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy + // in some browsers as IE11 and Safari. + + xhr.onabort = clone; + xhr.onerror = clone; + xhr.ontimeout = clone; + + xhr.onprogress = function () { + // Abort the request directly if it not a JPEG image for better performance + if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) { + xhr.abort(); + } + }; + + xhr.onload = function () { + _this.read(xhr.response); + }; + + xhr.onloadend = function () { + _this.reloading = false; + _this.xhr = null; + }; // Bust cache when there is a "crossOrigin" property to avoid browser cache error + + + if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) { + url = addTimestamp(url); + } + + xhr.open('GET', url); + xhr.responseType = 'arraybuffer'; + xhr.withCredentials = element.crossOrigin === 'use-credentials'; + xhr.send(); + } + }, { + key: "read", + value: function read(arrayBuffer) { + var options = this.options, + imageData = this.imageData; // Reset the orientation value to its default value 1 + // as some iOS browsers will render image with its orientation + + var orientation = resetAndGetOrientation(arrayBuffer); + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + + if (orientation > 1) { + // Generate a new URL which has the default orientation value + this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG); + + var _parseOrientation = parseOrientation(orientation); + + rotate = _parseOrientation.rotate; + scaleX = _parseOrientation.scaleX; + scaleY = _parseOrientation.scaleY; + } + + if (options.rotatable) { + imageData.rotate = rotate; + } + + if (options.scalable) { + imageData.scaleX = scaleX; + imageData.scaleY = scaleY; + } + + this.clone(); + } + }, { + key: "clone", + value: function clone() { + var element = this.element, + url = this.url; + var crossOrigin = element.crossOrigin; + var crossOriginUrl = url; + + if (this.options.checkCrossOrigin && isCrossOriginURL(url)) { + if (!crossOrigin) { + crossOrigin = 'anonymous'; + } // Bust cache when there is not a "crossOrigin" property (#519) + + + crossOriginUrl = addTimestamp(url); + } + + this.crossOrigin = crossOrigin; + this.crossOriginUrl = crossOriginUrl; + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = crossOriginUrl || url; + image.alt = element.alt || 'The image to crop'; + this.image = image; + image.onload = this.start.bind(this); + image.onerror = this.stop.bind(this); + addClass(image, CLASS_HIDE); + element.parentNode.insertBefore(image, element.nextSibling); + } + }, { + key: "start", + value: function start() { + var _this2 = this; + + var image = this.image; + image.onload = null; + image.onerror = null; + this.sizing = true; // Match all browsers that use WebKit as the layout engine in iOS devices, + // such as Safari for iOS, Chrome for iOS, and in-app browsers. + + var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent); + + var done = function done(naturalWidth, naturalHeight) { + assign(_this2.imageData, { + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + aspectRatio: naturalWidth / naturalHeight + }); + _this2.sizing = false; + _this2.sized = true; + + _this2.build(); + }; // Most modern browsers (excepts iOS WebKit) + + + if (image.naturalWidth && !isIOSWebKit) { + done(image.naturalWidth, image.naturalHeight); + return; + } + + var sizingImage = document.createElement('img'); + var body = document.body || document.documentElement; + this.sizingImage = sizingImage; + + sizingImage.onload = function () { + done(sizingImage.width, sizingImage.height); + + if (!isIOSWebKit) { + body.removeChild(sizingImage); + } + }; + + sizingImage.src = image.src; // iOS WebKit will convert the image automatically + // with its orientation once append it into DOM (#279) + + if (!isIOSWebKit) { + sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;'; + body.appendChild(sizingImage); + } + } + }, { + key: "stop", + value: function stop() { + var image = this.image; + image.onload = null; + image.onerror = null; + image.parentNode.removeChild(image); + this.image = null; + } + }, { + key: "build", + value: function build() { + if (!this.sized || this.ready) { + return; + } + + var element = this.element, + options = this.options, + image = this.image; // Create cropper elements + + var container = element.parentNode; + var template = document.createElement('div'); + template.innerHTML = TEMPLATE; + var cropper = template.querySelector(".".concat(NAMESPACE, "-container")); + var canvas = cropper.querySelector(".".concat(NAMESPACE, "-canvas")); + var dragBox = cropper.querySelector(".".concat(NAMESPACE, "-drag-box")); + var cropBox = cropper.querySelector(".".concat(NAMESPACE, "-crop-box")); + var face = cropBox.querySelector(".".concat(NAMESPACE, "-face")); + this.container = container; + this.cropper = cropper; + this.canvas = canvas; + this.dragBox = dragBox; + this.cropBox = cropBox; + this.viewBox = cropper.querySelector(".".concat(NAMESPACE, "-view-box")); + this.face = face; + canvas.appendChild(image); // Hide the original image + + addClass(element, CLASS_HIDDEN); // Inserts the cropper after to the current image + + container.insertBefore(cropper, element.nextSibling); // Show the image if is hidden + + if (!this.isImg) { + removeClass(image, CLASS_HIDE); + } + + this.initPreview(); + this.bind(); + options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN; + options.aspectRatio = Math.max(0, options.aspectRatio) || NaN; + options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0; + addClass(cropBox, CLASS_HIDDEN); + + if (!options.guides) { + addClass(cropBox.getElementsByClassName("".concat(NAMESPACE, "-dashed")), CLASS_HIDDEN); + } + + if (!options.center) { + addClass(cropBox.getElementsByClassName("".concat(NAMESPACE, "-center")), CLASS_HIDDEN); + } + + if (options.background) { + addClass(cropper, "".concat(NAMESPACE, "-bg")); + } + + if (!options.highlight) { + addClass(face, CLASS_INVISIBLE); + } + + if (options.cropBoxMovable) { + addClass(face, CLASS_MOVE); + setData(face, DATA_ACTION, ACTION_ALL); + } + + if (!options.cropBoxResizable) { + addClass(cropBox.getElementsByClassName("".concat(NAMESPACE, "-line")), CLASS_HIDDEN); + addClass(cropBox.getElementsByClassName("".concat(NAMESPACE, "-point")), CLASS_HIDDEN); + } + + this.render(); + this.ready = true; + this.setDragMode(options.dragMode); + + if (options.autoCrop) { + this.crop(); + } + + this.setData(options.data); + + if (isFunction(options.ready)) { + addListener(element, EVENT_READY, options.ready, { + once: true + }); + } + + dispatchEvent(element, EVENT_READY); + } + }, { + key: "unbuild", + value: function unbuild() { + if (!this.ready) { + return; + } + + this.ready = false; + this.unbind(); + this.resetPreview(); + this.cropper.parentNode.removeChild(this.cropper); + removeClass(this.element, CLASS_HIDDEN); + } + }, { + key: "uncreate", + value: function uncreate() { + if (this.ready) { + this.unbuild(); + this.ready = false; + this.cropped = false; + } else if (this.sizing) { + this.sizingImage.onload = null; + this.sizing = false; + this.sized = false; + } else if (this.reloading) { + this.xhr.onabort = null; + this.xhr.abort(); + } else if (this.image) { + this.stop(); + } + } + /** + * Get the no conflict cropper class. + * @returns {Cropper} The cropper class. + */ + + }], [{ + key: "noConflict", + value: function noConflict() { + window.Cropper = AnotherCropper; + return Cropper; + } + /** + * Change the default options. + * @param {Object} options - The new default options. + */ + + }, { + key: "setDefaults", + value: function setDefaults(options) { + assign(DEFAULTS, isPlainObject(options) && options); + } + }]); + + return Cropper; + }(); + + assign(Cropper.prototype, render, preview, events, handlers, change, methods); + + return Cropper; + +})); diff --git a/addons/web_editor/static/lib/jquery-cropper/LICENSE b/addons/web_editor/static/lib/jquery-cropper/LICENSE new file mode 100644 index 00000000000..4b2a9da8a66 --- /dev/null +++ b/addons/web_editor/static/lib/jquery-cropper/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Chen Fengyuan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/addons/web_editor/static/lib/jquery-cropper/jquery-cropper.js b/addons/web_editor/static/lib/jquery-cropper/jquery-cropper.js new file mode 100644 index 00000000000..c1c71415d19 --- /dev/null +++ b/addons/web_editor/static/lib/jquery-cropper/jquery-cropper.js @@ -0,0 +1,75 @@ +/*! + * jQuery Cropper v1.0.0 + * https://github.com/fengyuanchen/jquery-cropper + * + * Copyright (c) 2018 Chen Fengyuan + * Released under the MIT license + * + * Date: 2018-04-01T06:20:13.168Z + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery'), require('cropperjs')) : + typeof define === 'function' && define.amd ? define(['jquery', 'cropperjs'], factory) : + (factory(global.jQuery,global.Cropper)); + }(this, (function ($,Cropper) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Cropper = Cropper && Cropper.hasOwnProperty('default') ? Cropper['default'] : Cropper; + + if ($.fn) { + var AnotherCropper = $.fn.cropper; + var NAMESPACE = 'cropper'; + + $.fn.cropper = function jQueryCropper(option) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var result = void 0; + + this.each(function (i, element) { + var $element = $(element); + var isDestroy = option === 'destroy'; + var cropper = $element.data(NAMESPACE); + + if (!cropper) { + if (isDestroy) { + return; + } + + var options = $.extend({}, $element.data(), $.isPlainObject(option) && option); + + cropper = new Cropper(element, options); + $element.data(NAMESPACE, cropper); + } + + if (typeof option === 'string') { + var fn = cropper[option]; + + if ($.isFunction(fn)) { + result = fn.apply(cropper, args); + + if (result === cropper) { + result = undefined; + } + + if (isDestroy) { + $element.removeData(NAMESPACE); + } + } + } + }); + + return result !== undefined ? result : this; + }; + + $.fn.cropper.Constructor = Cropper; + $.fn.cropper.setDefaults = Cropper.setDefaults; + $.fn.cropper.noConflict = function noConflict() { + $.fn.cropper = AnotherCropper; + return this; + }; + } + + }))); diff --git a/addons/web_editor/static/src/js/backend/field_html.js b/addons/web_editor/static/src/js/backend/field_html.js index 0be20743132..cc06bc53c96 100644 --- a/addons/web_editor/static/src/js/backend/field_html.js +++ b/addons/web_editor/static/src/js/backend/field_html.js @@ -432,6 +432,8 @@ var FieldHtml = basic_fields.DebouncedField.extend(TranslatableFieldMixin, { if (ev.offsetX > 0) { return; } + ev.stopPropagation(); + ev.preventDefault(); var checked = $(ev.target).hasClass('o_checked'); var checklistId = parseInt(($(ev.target).attr('id') || '0').replace(/^checklist-id-/, '')); diff --git a/addons/web_editor/static/src/js/editor/rte.js b/addons/web_editor/static/src/js/editor/rte.js index bfd7994b161..529bf68887e 100644 --- a/addons/web_editor/static/src/js/editor/rte.js +++ b/addons/web_editor/static/src/js/editor/rte.js @@ -323,11 +323,20 @@ var RTEWidget = Widget.extend({ }); // start element observation - $(document).on('content_changed', '.o_editable', function (ev) { + $(document).on('content_changed', function (ev) { self.trigger_up('rte_change', {target: ev.target}); + + // Add the dirty flag to the element that changed by either adding + // it on the highest editable ancestor or, if there is no editable + // ancestor, on the element itself (that element may not be editable + // but if it received a content_changed event, it should be marked + // as dirty to allow for custom savings). if (!ev.__isDirtyHandled) { - $(this).addClass('o_dirty'); ev.__isDirtyHandled = true; + + var el = ev.target; + var dirty = el.closest('.o_editable') || el; + dirty.classList.add('o_dirty'); } }); @@ -586,11 +595,16 @@ var RTEWidget = Widget.extend({ * page element) */ _saveElement: function ($el, context, withLang) { + var viewID = $el.data('oe-id'); + if (!viewID) { + return Promise.resolve(); + } + return this._rpc({ model: 'ir.ui.view', method: 'save', args: [ - $el.data('oe-id'), + viewID, this._getEscapedElement($el).prop('outerHTML'), $el.data('oe-xpath') || null, ], @@ -720,7 +734,7 @@ var RTEWidget = Widget.extend({ // selected too) // // The triple click behavior is reimplemented for all browsers here - if (ev.originalEvent.detail === 3) { + if (ev.originalEvent && ev.originalEvent.detail === 3) { // Select the whole content inside the deepest DOM element that was // triple-clicked range.create(ev.target, 0, ev.target, ev.target.childNodes.length).select(); diff --git a/addons/web_editor/static/src/js/editor/rte.summernote.js b/addons/web_editor/static/src/js/editor/rte.summernote.js index b5b74f64466..95ce86572ae 100644 --- a/addons/web_editor/static/src/js/editor/rte.summernote.js +++ b/addons/web_editor/static/src/js/editor/rte.summernote.js @@ -452,6 +452,9 @@ eventHandler.modules.linkDialog.showLinkDialog = function ($editable, $dialog, l $editable.data('range').select(); $editable.data('NoteHistory').recordUndo(); + var link = linkInfo.range.commonAncestor().closest('a'); + linkInfo.className = link && link.className; + var def = new $.Deferred(); core.bus.trigger('link_dialog_demand', { $editable: $editable, diff --git a/addons/web_editor/static/src/js/editor/snippets.editor.js b/addons/web_editor/static/src/js/editor/snippets.editor.js index c9571f59c51..b94c7108122 100644 --- a/addons/web_editor/static/src/js/editor/snippets.editor.js +++ b/addons/web_editor/static/src/js/editor/snippets.editor.js @@ -77,7 +77,16 @@ var SnippetEditor = Widget.extend({ return $clone; }, start: this._onDragAndDropStart.bind(this), - stop: this._onDragAndDropStop.bind(this), + stop: function () { + // Delay our stop handler so that some summernote handlers + // which occur on mouseup (and are themself delayed) are + // executed first (this prevents the library to crash + // because our stop handler may change the DOM). + var args = arguments; + setTimeout(function () { + self._onDragAndDropStop.apply(self, args); + }, 0); + }, }); } else { this.$('.o_move_handle').addClass('d-none'); diff --git a/addons/web_editor/static/src/js/editor/snippets.options.js b/addons/web_editor/static/src/js/editor/snippets.options.js index f124d1841f0..eec85058ebc 100644 --- a/addons/web_editor/static/src/js/editor/snippets.options.js +++ b/addons/web_editor/static/src/js/editor/snippets.options.js @@ -700,6 +700,17 @@ registry.colorpicker = SnippetOption.extend({ this.$el.find('we-collapse').append($pt); } + + // TODO refactor in master + // The primary and secondary are hardcoded here (but marked as hidden) + // so they can be removed from snippets when selecting another color. + // Normally, the chosable colors do not contain them, which prevents + // them to be removed. Indeed, normally, the 'alpha' and 'beta' colors + // (which are the same) are displayed instead... but not for all themes. + var $colorpicker = this.$el.find('.colorpicker'); + $colorpicker.append($('<button/>', {'class': 'd-none', 'data-color': 'primary'})); + $colorpicker.append($('<button/>', {'class': 'd-none', 'data-color': 'secondary'})); + var classes = []; this.$el.find('.colorpicker button').each(function () { var $color = $(this); @@ -838,23 +849,18 @@ registry.background = SnippetOption.extend({ * @see this.selectClass for parameters */ chooseImage: function (previewMode, value, $opt) { - // Put fake image in the DOM, edit it and use it as background-image - var $image = $('<img/>', {class: 'd-none', src: value === 'true' ? '' : value}).appendTo(this.$target); + var options = this._getMediaDialogOptions(); + var media = this._getEditableMedia(); - var $editable = this.$target.closest('.o_editable'); - var _editor = new weWidgets.MediaDialog(this, { - 'onlyImages': true, - 'firstFilters': ['background'], - 'res_model': $editable.data('oe-model'), - 'res_id': $editable.data('oe-id'), - }, $image[0]).open(); - - _editor.on('save', this, function () { - this._setCustomBackground($image.attr('src')); + var _editor = new weWidgets.MediaDialog(this, options, media).open(); + _editor.on('save', this, data => { + this._onSaveMediaDialog(data); this.$target.trigger('content_changed'); }); - _editor.on('closed', this, function () { - $image.remove(); + _editor.on('closed', this, () => { + if (media.classList.contains('o_we_fake_image')) { + media.parentNode.removeChild(media); + } }); }, @@ -871,16 +877,7 @@ registry.background = SnippetOption.extend({ return; } this.$target.off('.background-option') - .on('background-color-event.background-option', (function (e, previewMode) { - e.stopPropagation(); - if (e.currentTarget !== e.target) { - return; - } - if (previewMode === false) { - this.__customImageSrc = undefined; - } - this.background(previewMode); - }).bind(this)); + .on('background-color-event.background-option', this._onBackgroundColorUpdate.bind(this)); }, /** * @override @@ -897,6 +894,37 @@ registry.background = SnippetOption.extend({ //-------------------------------------------------------------------------- /** + * Returns a media element the media dialog will be able to edit to use + * the result as the snippet's background somehow. + * + * @private + * @returns {HTMLElement} + */ + _getEditableMedia: function () { + var $image = $('<img/>', { + class: 'd-none o_we_fake_image', + }).appendTo(this.$target); + return $image[0]; + }, + /** + * Returns the options to be given to the MediaDialog instance when choosing + * a snippet's background. + * + * @private + * @returns {Object} + */ + _getMediaDialogOptions: function () { + var $editable = this.$target.closest('.o_editable'); + return { + noDocuments: true, + noIcons: true, + noVideos: true, + firstFilters: ['background'], + res_model: $editable.data('oe-model'), + res_id: $editable.data('oe-id'), + }; + }, + /** * Returns the src value from a css value related to a background image * (e.g. "url('blabla')" => "blabla" / "none" => ""). * @@ -941,6 +969,42 @@ registry.background = SnippetOption.extend({ this._setActive(); this.$target.trigger('snippet-option-change', [this]); }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * Called on background-color update (useful to remove the background to be + * able to see the chosen color). + * + * @private + * @param {Event} ev + * @param {boolean|string} previewMode + * @returns {boolean} true if the color has been applied (removing the + * background) + */ + _onBackgroundColorUpdate: function (ev, previewMode) { + ev.stopPropagation(); + if (ev.currentTarget !== ev.target) { + return false; + } + if (previewMode === false) { + this.__customImageSrc = undefined; + } + this.background(previewMode); + return true; + }, + /** + * Called on media dialog save (when choosing a snippet's background) -> + * sets the resulting media as the snippet's background somehow. + * + * @private + * @param {Object} data + */ + _onSaveMediaDialog: function (data) { + this._setCustomBackground(data.src); + }, }); /** diff --git a/addons/web_editor/static/src/js/editor/summernote.js b/addons/web_editor/static/src/js/editor/summernote.js index 6c62758142d..c2cf0d68d6c 100644 --- a/addons/web_editor/static/src/js/editor/summernote.js +++ b/addons/web_editor/static/src/js/editor/summernote.js @@ -1790,6 +1790,7 @@ $.summernote.pluginEvents.insertUnorderedList = function (event, editor, layoutI } r.clean().select(); event.preventDefault(); + return false; }; $.summernote.pluginEvents.insertOrderedList = function (event, editor, layoutInfo) { @@ -1797,6 +1798,7 @@ $.summernote.pluginEvents.insertOrderedList = function (event, editor, layoutInf }; $.summernote.pluginEvents.insertCheckList = function (event, editor, layoutInfo) { $.summernote.pluginEvents.insertUnorderedList(event, editor, layoutInfo, "checklist"); + $(range.create().sc.parentNode).trigger('input'); // to update checklist-id }; $.summernote.pluginEvents.indent = function (event, editor, layoutInfo, outdent) { var $editable = layoutInfo.editable(); @@ -2469,6 +2471,7 @@ function mouseDownChecklist (e) { if (!dom.isLi(e.target) || !$(e.target).parent('ul.o_checklist').length || e.offsetX > 0) { return; } + e.stopPropagation(); e.preventDefault(); var checked = $(e.target).hasClass('o_checked'); $(e.target).toggleClass('o_checked', !checked); @@ -2478,12 +2481,14 @@ function mouseDownChecklist (e) { }); if (checked) { $sublevel.removeClass('o_checked'); - $parents.prev('ul.o_checklist li').removeClass('o_checked'); + do { + $parents = $parents.prev('ul.o_checklist li').removeClass('o_checked'); + } while ($parents.length); } else { $sublevel.addClass('o_checked'); var $lis; do { - $lis = $parents.not(':has(li:not(.o_checked))').prev('ul.o_checklist li:not(.o_checked)'); + $lis = $parents.not(':has(li[id^="checklist-id"]:not(.o_checked))').prev('ul.o_checklist li:not(.o_checked)'); $lis.addClass('o_checked'); } while ($lis.length); } diff --git a/addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js b/addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js index 19623d05f5e..9f827410221 100644 --- a/addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js +++ b/addons/web_editor/static/src/js/wysiwyg/widgets/crop_dialog.js @@ -14,12 +14,6 @@ var CropImageDialog = Dialog.extend({ xmlDependencies: Dialog.prototype.xmlDependencies.concat( ['/web_editor/static/src/xml/wysiwyg.xml'] ), - jsLibs: [ - '/web_editor/static/lib/cropper/js/cropper.js', - ], - cssLibs: [ - '/web_editor/static/lib/cropper/css/cropper.css', - ], events: _.extend({}, Dialog.prototype.events, { 'click .o_crop_options [data-event]': '_onCropOptionClick', }), @@ -116,8 +110,9 @@ var CropImageDialog = Dialog.extend({ } } this.$cropperImage.cropper({ - viewMode: 1, - autoCropArea: 1, + viewMode: 2, + dragMode: 'move', + autoCropArea: 1.0, aspectRatio: ratio, data: _.pick(data, 'x', 'y', 'width', 'height', 'rotate', 'scaleX', 'scaleY') }); diff --git a/addons/web_editor/static/src/js/wysiwyg/widgets/media.js b/addons/web_editor/static/src/js/wysiwyg/widgets/media.js index cbb39ea6173..c291a00a0c7 100644 --- a/addons/web_editor/static/src/js/wysiwyg/widgets/media.js +++ b/addons/web_editor/static/src/js/wysiwyg/widgets/media.js @@ -1009,8 +1009,9 @@ var VideoWidget = MediaWidget.extend({ /** * @constructor */ - init: function (parent, media) { + init: function (parent, media, options) { this._super.apply(this, arguments); + this.isForBgVideo = !!options.isForBgVideo; this._onVideoCodeInput = _.debounce(this._onVideoCodeInput, 1000); }, /** @@ -1021,7 +1022,7 @@ var VideoWidget = MediaWidget.extend({ if (this.media) { var $media = $(this.media); - var src = $media.data('oe-expression') || $media.data('src') || ''; + var src = $media.data('oe-expression') || $media.data('src') || ($media.is('iframe') ? $media.attr('src') : '') || ''; this.$('textarea#o_video_text').val(src); this.$('input#o_video_autoplay').prop('checked', src.indexOf('autoplay=1') >= 0); @@ -1047,6 +1048,9 @@ var VideoWidget = MediaWidget.extend({ */ save: function () { this._updateVideo(); + if (this.isForBgVideo) { + return Promise.resolve({bgVideoSrc: this.$content.attr('src')}); + } if (this.$('.o_video_dialog_iframe').is('iframe')) { this.$media = $( '<div class="media_iframe_video" data-oe-expression="' + this.$content.attr('src') + '">' + @@ -1135,7 +1139,7 @@ var VideoWidget = MediaWidget.extend({ $video.attr('src', vinMatch[0] + '/embed/simple'); videoType = 'vin'; } else if (vimMatch && vimMatch[3].length) { - $video.attr('src', '//player.vimeo.com/video/' + vimMatch[3] + autoplay); + $video.attr('src', '//player.vimeo.com/video/' + vimMatch[3] + autoplay.replace('mute', 'muted')); videoType = 'vim'; } else if (dmMatch && dmMatch[2].length) { var justId = dmMatch[2].replace('video/', ''); @@ -1200,13 +1204,13 @@ var VideoWidget = MediaWidget.extend({ var url = embedMatch ? embedMatch[1] : code; var query = this._createVideoNode(url, { - autoplay: this.$('input#o_video_autoplay').is(':checked'), - hide_controls: this.$('input#o_video_hide_controls').is(':checked'), - loop: this.$('input#o_video_loop').is(':checked'), - hide_fullscreen: this.$('input#o_video_hide_fullscreen').is(':checked'), - hide_yt_logo: this.$('input#o_video_hide_yt_logo').is(':checked'), - hide_dm_logo: this.$('input#o_video_hide_dm_logo').is(':checked'), - hide_dm_share: this.$('input#o_video_hide_dm_share').is(':checked'), + 'autoplay': this.isForBgVideo || this.$('input#o_video_autoplay').is(':checked'), + 'hide_controls': this.isForBgVideo || this.$('input#o_video_hide_controls').is(':checked'), + 'loop': this.isForBgVideo || this.$('input#o_video_loop').is(':checked'), + 'hide_fullscreen': this.isForBgVideo || this.$('input#o_video_hide_fullscreen').is(':checked'), + 'hide_yt_logo': this.isForBgVideo || this.$('input#o_video_hide_yt_logo').is(':checked'), + 'hide_dm_logo': this.isForBgVideo || this.$('input#o_video_hide_dm_logo').is(':checked'), + 'hide_dm_share': this.isForBgVideo || this.$('input#o_video_hide_dm_share').is(':checked'), }); var $optBox = this.$('.o_video_dialog_options'); @@ -1222,8 +1226,9 @@ var VideoWidget = MediaWidget.extend({ // Individually show / hide options base on the video provider $optBox.find('div.o_' + query.type + '_option').removeClass('d-none'); - // Hide the entire options box if no options are available - $optBox.toggleClass('d-none', $optBox.find('div:not(.d-none)').length === 0); + // Hide the entire options box if no options are available or if the + // dialog is opened for a background-video + $optBox.toggleClass('d-none', this.isForBgVideo || $optBox.find('div:not(.d-none)').length === 0); if (query.type === 'yt') { // Youtube only: If 'hide controls' is checked, hide 'fullscreen' diff --git a/addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js b/addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js index 84dd8e7f650..6d1f2b642c7 100644 --- a/addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js +++ b/addons/web_editor/static/src/js/wysiwyg/widgets/media_dialog.js @@ -76,7 +76,7 @@ var MediaDialog = Dialog.extend({ this.activeWidget = this.imageWidget; } else if (this.documentWidget && $media.is('a.o_image')) { this.activeWidget = this.documentWidget; - } else if (this.videoWidget && $media.hasClass('media_iframe_video')) { + } else if (this.videoWidget && $media.is('.media_iframe_video, .o_bg_video_iframe')) { this.activeWidget = this.videoWidget; } else if (this.iconWidget && $media.is('span, i')) { this.activeWidget = this.iconWidget; diff --git a/addons/web_editor/static/src/js/wysiwyg/wysiwyg.js b/addons/web_editor/static/src/js/wysiwyg/wysiwyg.js index d33f5455da4..361355c4cab 100644 --- a/addons/web_editor/static/src/js/wysiwyg/wysiwyg.js +++ b/addons/web_editor/static/src/js/wysiwyg/wysiwyg.js @@ -78,9 +78,7 @@ var Wysiwyg = Widget.extend({ this.$editor.data('oe-id', options.recordInfo.res_id); $(document).on('mousedown', this._blur); this._value = this.$target.html() || this.$target.val(); - return this._super.apply(this, arguments).then(() => { - this.$editor.trigger('mouseup'); - }); + return this._super.apply(this, arguments); }, /** * @override diff --git a/addons/web_editor/static/src/js/wysiwyg/wysiwyg_snippets.js b/addons/web_editor/static/src/js/wysiwyg/wysiwyg_snippets.js index 4b095029432..df6d243ffc6 100644 --- a/addons/web_editor/static/src/js/wysiwyg/wysiwyg_snippets.js +++ b/addons/web_editor/static/src/js/wysiwyg/wysiwyg_snippets.js @@ -20,8 +20,6 @@ Wysiwyg.include({ await this.editor.prependTo(this.$editor[0].ownerDocument.body); this.options.toolbarHandler.append(this.editor.$el); this.$el.on('content_changed', function (e) { - var $editable = $(e.target).closest('[data-oe-model], .o_editable'); - $editable.addClass('o_dirty'); self.trigger_up('wysiwyg_change'); }); } else { diff --git a/addons/web_editor/static/src/scss/wysiwyg.scss b/addons/web_editor/static/src/scss/wysiwyg.scss index 175463da8f1..bfef4658081 100644 --- a/addons/web_editor/static/src/scss/wysiwyg.scss +++ b/addons/web_editor/static/src/scss/wysiwyg.scss @@ -19,9 +19,25 @@ $o-we-zindex: $o-we-overlay-zindex + 1 !default; } // EDITOR TOP BAR AND POPOVER -body.editor_enable { +.note-popover .popover { + max-width: 350px; + left: 50% !important; + transform: translate(-50%, 0); + .popover-body { + white-space: normal; + } +} + +.editor_enable { padding-top: var(--o-we-toolbar-height) !important; + .note-popover .popover .popover-body { + height: var(--o-we-toolbar-height); + } + .note-popover .popover { + transform: none; + } } + #web_editor-top-edit { @include o-position-absolute(0, 0, auto, 0); position: fixed; @@ -34,6 +50,7 @@ body.editor_enable { left: 0 !important; right: 0 !important; border: none !important; + max-width: none; } } @@ -43,14 +60,16 @@ body.editor_enable { margin: 0; padding: 0; } +// avoid popover bar over its opened modal +.note-popover .popover { + z-index: $o-we-overlay-zindex; +} .note-popover .popover .popover-body, .panel-heading.note-toolbar { - height: var(--o-we-toolbar-height); padding-bottom: 0; border-bottom: $o-we-border-width solid $o-we-border-color; background-color: var(--o-we-bg-color); font-family: $o-we-font-family; - white-space: nowrap; // Main layout of buttons .btn-group, .btn { @@ -141,6 +160,24 @@ body.editor_enable { .note-color-palette div .note-color-btn { border-color: var(--o-we-dropdown-bg-color); } + .note-custom-color-palette .note-color-row { + height: auto!important; + .note-color-btn { + float: left; + height: 20px; + width: 20px; + padding: 0; + margin: 0; + border: 1px solid var(--o-we-dropdown-bg-color); + } + } +} +.note-color ul.show { + min-width: 172px !important; +} + +.panel-heading.note-toolbar { + white-space: nowrap; } // ANIMATIONS diff --git a/addons/web_editor/static/src/xml/wysiwyg.xml b/addons/web_editor/static/src/xml/wysiwyg.xml index b9b29a8984e..bcf3a480a93 100644 --- a/addons/web_editor/static/src/xml/wysiwyg.xml +++ b/addons/web_editor/static/src/xml/wysiwyg.xml @@ -383,7 +383,7 @@ <textarea class="form-control" id="o_video_text" placeholder="Copy-paste your URL or embed code here"/> </div> <div class="text-right"> - <small class="text-muted">Accepts <b><i>Youtube</i></b>, <b><i>Instagram</i></b>, <b><i>Vine.co</i></b>, <b><i>Vimeo</i></b>, <b><i>Dailymotion</i></b> and <b><i>Youku</i></b> videos</small> + <small class="text-muted">Accepts <b><i>Youtube</i></b>, <b><i>Vimeo</i></b>, <b><i>Dailymotion</i></b> and <b><i>Youku</i></b> videos</small> </div> <div class="o_video_dialog_options d-none mt-4"> <div class="o_yt_option o_vim_option o_dm_option"> diff --git a/addons/web_editor/views/editor.xml b/addons/web_editor/views/editor.xml index 8c9c2028cd2..0393af7cdf6 100644 --- a/addons/web_editor/views/editor.xml +++ b/addons/web_editor/views/editor.xml @@ -16,8 +16,9 @@ <t t-call-assets="web_editor.summernote"/> - <link rel="stylesheet" type="text/css" href="/web_editor/static/lib/cropper/css/cropper.css"/> - <script type="text/javascript" src="/web_editor/static/lib/cropper/js/cropper.js"/> + <link rel="stylesheet" type="text/css" href="/web_editor/static/lib/cropperjs/cropper.css"/> + <script type="text/javascript" src="/web_editor/static/lib/cropperjs/cropper.js"/> + <script type="text/javascript" src="/web_editor/static/lib/jquery-cropper/jquery-cropper.js"/> <script type="text/javascript" src="/web_editor/static/lib/jQuery.transfo.js"/> <script type="text/javascript" src="/web_editor/static/lib/nearest/jquery.nearest.js"/> |
