diff --git a/lib/renderer/extensions/i18n.js b/lib/renderer/extensions/i18n.js index 168a29ef577f..b14499e2b208 100644 --- a/lib/renderer/extensions/i18n.js +++ b/lib/renderer/extensions/i18n.js @@ -1,3 +1,9 @@ +// Implementation of chrome.i18n.getMessage +// https://developer.chrome.com/extensions/i18n#method-getMessage +// +// Does not implement predefined messages: +// https://developer.chrome.com/extensions/i18n#overview-predefined + const {ipcRenderer} = require('electron') const fs = require('fs') const path = require('path') @@ -28,12 +34,39 @@ const getLanguage = () => { return navigator.language.replace(/-.*$/, '').toLowerCase() } +const replaceNumberedSubstitutions = (message, substitutions) => { + return message.replace(/\$(\d+)/, (_, number) => { + const index = parseInt(number, 10) - 1 + return substitutions[index] || '' + }) +} + +const replacePlaceholders = (message, placeholders, substitutions) => { + if (typeof substitutions === 'string') { + substitutions = [substitutions] + } + if (!Array.isArray(substitutions)) { + substitutions = [] + } + + if (placeholders) { + Object.keys(placeholders).forEach((name) => { + let {content} = placeholders[name] + content = replaceNumberedSubstitutions(content, substitutions) + message = message.replace(new RegExp(`\\$${name}\\$`, 'gi'), content) + }) + } + + return replaceNumberedSubstitutions(message, substitutions) +} + module.exports = { getMessage (messageName, substitutions) { const language = getLanguage() const messages = getMessages(language) if (messages.hasOwnProperty(messageName)) { - return messages[messageName].message + const {message, placeholders} = messages[messageName] + return replacePlaceholders(message, placeholders, substitutions) } } }