From 1f800fab38aadb73ba4ca234815afa227fa57797 Mon Sep 17 00:00:00 2001 From: Agriya Dev5 Date: Tue, 18 May 2021 17:30:57 +0530 Subject: [PATCH 01/10] #98 i18n translation changes --- src/editor/EditorStartup.js | 1 + .../extensions/ext-storage/storageDialog.js | 17 +++++++++-------- src/editor/locale/lang.en.js | 3 ++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/editor/EditorStartup.js b/src/editor/EditorStartup.js index 7042b873..446b8572 100644 --- a/src/editor/EditorStartup.js +++ b/src/editor/EditorStartup.js @@ -68,6 +68,7 @@ class EditorStartup { const self = this; const { i18next } = await putLocale(this.configObj.pref('lang'), this.goodLangs); this.i18next = i18next; + window.i18next = i18next; // allow to prepare the dom without display this.$svgEditor.style.visibility = 'hidden'; try { diff --git a/src/editor/extensions/ext-storage/storageDialog.js b/src/editor/extensions/ext-storage/storageDialog.js index b224f7d7..4063dd5e 100644 --- a/src/editor/extensions/ext-storage/storageDialog.js +++ b/src/editor/extensions/ext-storage/storageDialog.js @@ -1,4 +1,5 @@ /* eslint-disable max-len */ +/* globals i18next */ const template = document.createElement('template'); template.innerHTML = ` @@ -50,26 +51,26 @@ template.innerHTML = `
-

- By default and where supported, SVG-Edit can store your editor preferences and SVG content locally on your machine so you do not need to add these back each time you load SVG-Edit. If, for privacy reasons, you do not wish to store this information on your machine, you can change away from the default option below. +

+ ${i18next.t('notification.editorPreferencesMsg')}

diff --git a/src/editor/locale/lang.en.js b/src/editor/locale/lang.en.js index a88a6603..3b8f9eff 100644 --- a/src/editor/locale/lang.en.js +++ b/src/editor/locale/lang.en.js @@ -163,7 +163,8 @@ export default { move_back: 'Send to Back', tool_unlink_use: 'Break link to reference element (make unique)', ellipse_circle_tool: 'Ellipse/Circle Tool', - square_rect_tool: 'Square/Rect Tool' + square_rect_tool: 'Square/Rect Tool', + remember_this_choice: 'Remember this choice?' }, layers: { layer: 'Layer', From deafb994cf9c838296ba9632921965cd719d3770 Mon Sep 17 00:00:00 2001 From: Agriya Dev5 Date: Tue, 18 May 2021 18:42:29 +0530 Subject: [PATCH 02/10] #98 extension connectors i18n translate changes --- .../extensions/ext-connector/ext-connector.js | 24 ++++++++++++------- .../extensions/ext-connector/locale/en.js | 1 + .../extensions/ext-connector/locale/fr.js | 1 + .../extensions/ext-connector/locale/zh-CN.js | 1 + 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/editor/extensions/ext-connector/ext-connector.js b/src/editor/extensions/ext-connector/ext-connector.js index 93675bdf..de2c7b32 100644 --- a/src/editor/extensions/ext-connector/ext-connector.js +++ b/src/editor/extensions/ext-connector/ext-connector.js @@ -7,21 +7,25 @@ * */ -const loadExtensionTranslation = async function (lang) { +const name = "connector"; + +const loadExtensionTranslation = async function (svgEditor) { let translationModule; + const lang = svgEditor.configObj.pref('lang'); try { // eslint-disable-next-line no-unsanitized/method - translationModule = await import(`./locale/${encodeURIComponent(lang)}.js`); + translationModule = await import(`./locale/${lang}.js`); } catch (_error) { // eslint-disable-next-line no-console - console.error(`Missing translation (${lang}) - using 'en'`); + console.warn(`Missing translation (${lang}) for ${name} - using 'en'`); + // eslint-disable-next-line no-unsanitized/method translationModule = await import(`./locale/en.js`); } - return translationModule.default; + svgEditor.i18next.addResourceBundle(lang, name, translationModule.default); }; export default { - name: 'connector', + name, async init(S) { const svgEditor = this; const { svgCanvas } = svgEditor; @@ -29,6 +33,7 @@ export default { const { $, svgroot } = S, addElem = svgCanvas.addSVGElementFromJson, selManager = S.selectorManager; + await loadExtensionTranslation(svgEditor); let startX; let startY; @@ -349,16 +354,15 @@ export default { }); }; - const strings = await loadExtensionTranslation(svgEditor.configObj.pref('lang')); return { /** @todo JFH special flag */ newUI: true, - name: strings.name, + name: svgEditor.i18next.t(`${name}:name`), callback() { // Add the button and its handler(s) const buttonTemplate = document.createElement("template"); buttonTemplate.innerHTML = ` - + `; $id('tools_left').append(buttonTemplate.content.cloneNode(true)); $id('mode_connect').addEventListener("click", () => { @@ -367,7 +371,9 @@ export default { }, /* async */ addLangData({ _lang }) { // , importLocale: importLoc return { - data: strings.langList + data: [ + { id: 'mode_connect', title: svgEditor.i18next.t(`${name}:langListTitle`) } + ] }; }, mouseDown(opts) { diff --git a/src/editor/extensions/ext-connector/locale/en.js b/src/editor/extensions/ext-connector/locale/en.js index f360d7a8..5a9aab4d 100644 --- a/src/editor/extensions/ext-connector/locale/en.js +++ b/src/editor/extensions/ext-connector/locale/en.js @@ -1,5 +1,6 @@ export default { name: 'Connector', + langListTitle: 'Connect two objects', langList: [ { id: 'mode_connect', title: 'Connect two objects' } ], diff --git a/src/editor/extensions/ext-connector/locale/fr.js b/src/editor/extensions/ext-connector/locale/fr.js index f38172c2..3132cdba 100644 --- a/src/editor/extensions/ext-connector/locale/fr.js +++ b/src/editor/extensions/ext-connector/locale/fr.js @@ -1,5 +1,6 @@ export default { name: 'Connector', + langListTitle: 'Connecter deux objets', langList: [ { id: 'mode_connect', title: 'Connecter deux objets' } ], diff --git a/src/editor/extensions/ext-connector/locale/zh-CN.js b/src/editor/extensions/ext-connector/locale/zh-CN.js index 5de0be8c..e3782bbc 100755 --- a/src/editor/extensions/ext-connector/locale/zh-CN.js +++ b/src/editor/extensions/ext-connector/locale/zh-CN.js @@ -1,5 +1,6 @@ export default { name: '连接器', + langListTitle: '连接两个对象', langList: [ { id: 'mode_connect', title: '连接两个对象' } ], From bbffc42cca9fddb53de4a80b19740d5a07f15ad9 Mon Sep 17 00:00:00 2001 From: Agriya Dev5 Date: Tue, 18 May 2021 19:18:02 +0530 Subject: [PATCH 03/10] #98 extension imagelib i18n modification --- .../extensions/ext-imagelib/ext-imagelib.js | 59 ++++++++++++------- .../extensions/ext-imagelib/locale/de.js | 25 ++------ .../extensions/ext-imagelib/locale/en.js | 30 ++-------- .../extensions/ext-imagelib/locale/fr.js | 25 ++------ .../extensions/ext-imagelib/locale/pl.js | 25 ++------ .../extensions/ext-imagelib/locale/pt-BR.js | 25 ++------ .../extensions/ext-imagelib/locale/ro.js | 25 ++------ .../extensions/ext-imagelib/locale/sk.js | 25 ++------ .../extensions/ext-imagelib/locale/sl.js | 25 ++------ .../extensions/ext-imagelib/locale/zh-CN.js | 25 ++------ .../extensions/ext-polystar/ext-polystar.js | 2 +- 11 files changed, 75 insertions(+), 216 deletions(-) diff --git a/src/editor/extensions/ext-imagelib/ext-imagelib.js b/src/editor/extensions/ext-imagelib/ext-imagelib.js index 8a990c7e..f49d6b06 100644 --- a/src/editor/extensions/ext-imagelib/ext-imagelib.js +++ b/src/editor/extensions/ext-imagelib/ext-imagelib.js @@ -9,29 +9,46 @@ * */ -const loadExtensionTranslation = async function (lang) { - let translationModule; - try { - // eslint-disable-next-line no-unsanitized/method - translationModule = await import(`./locale/${encodeURIComponent(lang)}.js`); - } catch (_error) { - // eslint-disable-next-line no-console - console.error(`Missing translation (${lang}) - using 'en'`); - translationModule = await import(`./locale/en.js`); - } - return translationModule.default; -}; + const name = "imagelib"; + + const loadExtensionTranslation = async function (svgEditor) { + let translationModule; + const lang = svgEditor.configObj.pref('lang'); + try { + // eslint-disable-next-line no-unsanitized/method + translationModule = await import(`./locale/${lang}.js`); + } catch (_error) { + // eslint-disable-next-line no-console + console.warn(`Missing translation (${lang}) for ${name} - using 'en'`); + // eslint-disable-next-line no-unsanitized/method + translationModule = await import(`./locale/en.js`); + } + svgEditor.i18next.addResourceBundle(lang, name, translationModule.default); + }; export default { - name: 'imagelib', + name, async init({ decode64, dropXMLInternalSubset }) { const svgEditor = this; const { $id } = svgEditor.svgCanvas; - const imagelibStrings = await loadExtensionTranslation(svgEditor.configObj.pref('lang')); + await loadExtensionTranslation(svgEditor); const { svgCanvas } = svgEditor; - const allowedImageLibOrigins = imagelibStrings.imgLibs.map(({ url }) => { + const imgLibs = [ + { + name: svgEditor.i18next.t(`${name}:imgLibs_0_name`), + url: 'extensions/ext-imagelib/index.html', + description: svgEditor.i18next.t(`${name}:imgLibs_0_description`) + }, + { + name: svgEditor.i18next.t(`${name}:imgLibs_1_name`), + url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', + description: svgEditor.i18next.t(`${name}:imgLibs_1_description`) + } + ]; + + const allowedImageLibOrigins = imgLibs.map(({ url }) => { try { return new URL(url).origin; } catch (err) { @@ -391,7 +408,7 @@ export default { insertAfter($id('svg_editor'), div); browser = $id('imgbrowse'); - const allLibs = imagelibStrings.select_lib; + const allLibs = svgEditor.i18next.t(`${name}:select_lib`); const divFrameWrap = document.createElement('div'); divFrameWrap.id = 'lib_framewrap'; @@ -429,7 +446,7 @@ export default { const back = document.createElement('button'); back.style.visibility = "hidden"; // eslint-disable-next-line max-len - back.innerHTML = 'icon' + imagelibStrings.show_list; + back.innerHTML = 'icon' + svgEditor.i18next.t(`${name}:show_list`); leftBlock.appendChild(back); back.addEventListener('click', function () { frame.setAttribute('src', 'about:blank'); @@ -451,9 +468,9 @@ export default { const select = document.createElement('select'); select.innerHTML = ' - - - + + + -