refactor: implement chrome.i18n.getMessage() without the remote module (#16739)
* refactor: implement chrome.i18n.getMessage() without the remote module * replace navigator.language with app.getLocale()
This commit is contained in:
parent
b97f6bd7d4
commit
1632c4b837
2 changed files with 34 additions and 38 deletions
|
@ -4,6 +4,7 @@ const { app, webContents, BrowserWindow } = require('electron')
|
||||||
const { getAllWebContents } = process.atomBinding('web_contents')
|
const { getAllWebContents } = process.atomBinding('web_contents')
|
||||||
const renderProcessPreferences = process.atomBinding('render_process_preferences').forAllWebContents()
|
const renderProcessPreferences = process.atomBinding('render_process_preferences').forAllWebContents()
|
||||||
const { ipcMainInternal } = require('@electron/internal/browser/ipc-main-internal')
|
const { ipcMainInternal } = require('@electron/internal/browser/ipc-main-internal')
|
||||||
|
const ipcMainUtils = require('@electron/internal/browser/ipc-main-internal-utils')
|
||||||
|
|
||||||
const { Buffer } = require('buffer')
|
const { Buffer } = require('buffer')
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
|
@ -166,10 +167,6 @@ ipcMainInternal.on('CHROME_RUNTIME_CONNECT', function (event, extensionId, conne
|
||||||
page.webContents._sendInternalToAll(`CHROME_RUNTIME_ONCONNECT_${extensionId}`, event.sender.id, portId, connectInfo)
|
page.webContents._sendInternalToAll(`CHROME_RUNTIME_ONCONNECT_${extensionId}`, event.sender.id, portId, connectInfo)
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMainInternal.on('CHROME_I18N_MANIFEST', function (event, extensionId) {
|
|
||||||
event.returnValue = manifestMap[extensionId]
|
|
||||||
})
|
|
||||||
|
|
||||||
let resultID = 1
|
let resultID = 1
|
||||||
ipcMainInternal.on('CHROME_RUNTIME_SENDMESSAGE', function (event, extensionId, message, originResultID) {
|
ipcMainInternal.on('CHROME_RUNTIME_SENDMESSAGE', function (event, extensionId, message, originResultID) {
|
||||||
const page = backgroundPages[extensionId]
|
const page = backgroundPages[extensionId]
|
||||||
|
@ -201,6 +198,34 @@ ipcMainInternal.on('CHROME_TABS_SEND_MESSAGE', function (event, tabId, extension
|
||||||
resultID++
|
resultID++
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const getLanguage = () => {
|
||||||
|
return app.getLocale().replace(/-.*$/, '').toLowerCase()
|
||||||
|
}
|
||||||
|
|
||||||
|
const getMessagesPath = (extensionId) => {
|
||||||
|
const metadata = manifestMap[extensionId]
|
||||||
|
if (!metadata) {
|
||||||
|
throw new Error(`Invalid extensionId: ${extensionId}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const localesDirectory = path.join(metadata.srcDirectory, '_locales')
|
||||||
|
const language = getLanguage()
|
||||||
|
|
||||||
|
try {
|
||||||
|
const filename = path.join(localesDirectory, language, 'messages.json')
|
||||||
|
fs.accessSync(filename, fs.constants.R_OK)
|
||||||
|
return filename
|
||||||
|
} catch (err) {
|
||||||
|
const defaultLocale = metadata.default_locale || 'en'
|
||||||
|
return path.join(localesDirectory, defaultLocale, 'messages.json')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ipcMainUtils.handleSync('CHROME_GET_MESSAGES', function (event, extensionId) {
|
||||||
|
const messagesPath = getMessagesPath(extensionId)
|
||||||
|
return fs.readFileSync(messagesPath)
|
||||||
|
})
|
||||||
|
|
||||||
const isChromeExtension = function (pageURL) {
|
const isChromeExtension = function (pageURL) {
|
||||||
const { protocol } = url.parse(pageURL)
|
const { protocol } = url.parse(pageURL)
|
||||||
return protocol === 'chrome-extension:'
|
return protocol === 'chrome-extension:'
|
||||||
|
|
|
@ -6,46 +6,17 @@
|
||||||
// Does not implement predefined messages:
|
// Does not implement predefined messages:
|
||||||
// https://developer.chrome.com/extensions/i18n#overview-predefined
|
// https://developer.chrome.com/extensions/i18n#overview-predefined
|
||||||
|
|
||||||
const { potentiallyRemoteRequire } = require('@electron/internal/renderer/remote')
|
const ipcRendererUtils = require('@electron/internal/renderer/ipc-renderer-internal-utils')
|
||||||
const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal')
|
|
||||||
const fs = potentiallyRemoteRequire('fs')
|
|
||||||
const path = potentiallyRemoteRequire('path')
|
|
||||||
|
|
||||||
let metadata
|
const getMessages = (extensionId) => {
|
||||||
|
|
||||||
const getExtensionMetadata = (extensionId) => {
|
|
||||||
if (!metadata) {
|
|
||||||
metadata = ipcRenderer.sendSync('CHROME_I18N_MANIFEST', extensionId)
|
|
||||||
}
|
|
||||||
return metadata
|
|
||||||
}
|
|
||||||
|
|
||||||
const getMessagesPath = (extensionId, language) => {
|
|
||||||
const metadata = getExtensionMetadata(extensionId)
|
|
||||||
const localesDirectory = path.join(metadata.srcDirectory, '_locales')
|
|
||||||
try {
|
try {
|
||||||
const filename = path.join(localesDirectory, language, 'messages.json')
|
const data = ipcRendererUtils.invokeSync('CHROME_GET_MESSAGES', extensionId)
|
||||||
fs.accessSync(filename, fs.constants.R_OK)
|
return JSON.parse(data) || {}
|
||||||
return filename
|
|
||||||
} catch (err) {
|
|
||||||
const defaultLocale = metadata.default_locale || 'en'
|
|
||||||
return path.join(localesDirectory, defaultLocale, 'messages.json')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const getMessages = (extensionId, language) => {
|
|
||||||
try {
|
|
||||||
const messagesPath = getMessagesPath(extensionId, language)
|
|
||||||
return JSON.parse(fs.readFileSync(messagesPath)) || {}
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const getLanguage = () => {
|
|
||||||
return navigator.language.replace(/-.*$/, '').toLowerCase()
|
|
||||||
}
|
|
||||||
|
|
||||||
const replaceNumberedSubstitutions = (message, substitutions) => {
|
const replaceNumberedSubstitutions = (message, substitutions) => {
|
||||||
return message.replace(/\$(\d+)/, (_, number) => {
|
return message.replace(/\$(\d+)/, (_, number) => {
|
||||||
const index = parseInt(number, 10) - 1
|
const index = parseInt(number, 10) - 1
|
||||||
|
@ -73,7 +44,7 @@ const replacePlaceholders = (message, placeholders, substitutions) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const getMessage = (extensionId, messageName, substitutions) => {
|
const getMessage = (extensionId, messageName, substitutions) => {
|
||||||
const messages = getMessages(extensionId, getLanguage())
|
const messages = getMessages(extensionId)
|
||||||
if (messages.hasOwnProperty(messageName)) {
|
if (messages.hasOwnProperty(messageName)) {
|
||||||
const { message, placeholders } = messages[messageName]
|
const { message, placeholders } = messages[messageName]
|
||||||
return replacePlaceholders(message, placeholders, substitutions)
|
return replacePlaceholders(message, placeholders, substitutions)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue