Add initial support for placeholders and substitutions

This commit is contained in:
Kevin Sawicki 2016-06-07 16:03:43 -07:00
parent d54de73e03
commit d4925e6226

View file

@ -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 {ipcRenderer} = require('electron')
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
@ -28,12 +34,39 @@ const getLanguage = () => {
return navigator.language.replace(/-.*$/, '').toLowerCase() 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 = { module.exports = {
getMessage (messageName, substitutions) { getMessage (messageName, substitutions) {
const language = getLanguage() const language = getLanguage()
const messages = getMessages(language) const messages = getMessages(language)
if (messages.hasOwnProperty(messageName)) { if (messages.hasOwnProperty(messageName)) {
return messages[messageName].message const {message, placeholders} = messages[messageName]
return replacePlaceholders(message, placeholders, substitutions)
} }
} }
} }