diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/index.js b/packages/node_modules/@node-red/editor-api/lib/editor/index.js index dbf4c18f2..44b4ffa89 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/index.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/index.js @@ -25,8 +25,8 @@ var auth = require("../auth"); var nodes = require("../admin/nodes"); // TODO: move /icons into here var needsPermission; var runtimeAPI; -var log = require("@node-red/util").log; // TODO: separate module -var i18n = require("@node-red/util").i18n; // TODO: separate module +var log = require("@node-red/util").log; +var i18n = require("@node-red/util").i18n; var apiUtil = require("../util"); diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/settings.js b/packages/node_modules/@node-red/editor-api/lib/editor/settings.js index 944792fb7..9d9867f1b 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/settings.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/settings.js @@ -19,6 +19,8 @@ var sshkeys = require("./sshkeys"); var theme = require("./theme"); var clone = require("clone"); +var i18n = require("@node-red/util").i18n + function extend(target, source) { var keys = Object.keys(source); var i = keys.length; @@ -53,12 +55,14 @@ module.exports = { user: req.user } runtimeAPI.settings.getRuntimeSettings(opts).then(function(result) { + result.editorTheme = result.editorTheme||{}; var themeSettings = theme.settings(); if (themeSettings) { // result.editorTheme may already exist with the palette // disabled. Need to merge that into the receive settings - result.editorTheme = extend(clone(themeSettings),result.editorTheme||{}); + result.editorTheme = extend(clone(themeSettings),result.editorTheme); } + result.editorTheme.languages = i18n.availableLanguages("editor"); res.json(result); }); }, diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 5b4985765..22cb436b1 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -42,7 +42,9 @@ "defaultDir": "Default", "ltr": "Left-to-right", "rtl": "Right-to-left", - "auto": "Contextual" + "auto": "Contextual", + "language": "Language", + "browserDefault": "Browser default" }, "sidebar": { "show": "Show sidebar" diff --git a/packages/node_modules/@node-red/editor-client/src/js/i18n.js b/packages/node_modules/@node-red/editor-client/src/js/i18n.js index a2b962246..6efa12644 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/i18n.js +++ b/packages/node_modules/@node-red/editor-client/src/js/i18n.js @@ -21,7 +21,8 @@ RED.i18n = (function() { return { init: function(options, done) { apiRootUrl = options.apiRootUrl||""; - i18n.init({ + var preferredLanguage = localStorage.getItem("editor-language"); + var opts = { resGetPath: apiRootUrl+'locales/__ns__?lng=__lng__', dynamicLoad: false, load:'current', @@ -32,7 +33,11 @@ RED.i18n = (function() { fallbackLng: ['en-US'], useCookie: false, returnObjectTrees: true - },function() { + }; + if (preferredLanguage) { + opts.lng = preferredLanguage; + } + i18n.init(opts,function() { done(); }); RED["_"] = function() { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js index dfce5bf73..d50cd86f8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js @@ -104,6 +104,10 @@ RED.userSettings = (function() { var viewSettings = [ { + options: [ + {setting:"editor-language",local: true, label:"menu.label.view.language",options:function(done){ done([{val:'',text:RED._('menu.label.view.browserDefault')}].concat(RED.settings.theme("languages"))) }}, + ] + },{ title: "menu.label.view.grid", options: [ {setting:"view-show-grid",oldSetting:"menu-menu-item-view-show-grid",label:"menu.label.view.showGrid",toggle:true,onchange:"core:toggle-show-grid"}, @@ -136,14 +140,40 @@ RED.userSettings = (function() { currentEditorSettings.view = currentEditorSettings.view || {}; viewSettings.forEach(function(section) { - $('

').text(RED._(section.title)).appendTo(pane); + if (section.title) { + $('

').text(RED._(section.title)).appendTo(pane); + } section.options.forEach(function(opt) { - var initialState = currentEditorSettings.view[opt.setting]; + var initialState; + if (opt.local) { + initialState = localStorage.getItem(opt.setting); + } else { + initialState = currentEditorSettings.view[opt.setting]; + } var row = $('
').appendTo(pane); var input; if (opt.toggle) { input = $('').appendTo(row).find("input"); input.prop('checked',initialState); + } else if (opt.options) { + $('').appendTo(row); + var select = $('').appendTo(row); + if (typeof opt.options === 'function') { + opt.options(function(options) { + options.forEach(function(opt) { + var val = opt; + var text = opt; + if (typeof opt !== 'string') { + val = opt.val; + text = opt.text; + } + $('