Add initial support for placeholders and substitutions
authorKevin Sawicki <kevinsawicki@gmail.com>
Tue, 7 Jun 2016 23:03:43 +0000 (16:03 -0700)
committerKevin Sawicki <kevinsawicki@gmail.com>
Thu, 9 Jun 2016 20:57:08 +0000 (13:57 -0700)
lib/renderer/extensions/i18n.js

index 168a29e..b14499e 100644 (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 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)
     }
   }
 }