From b1ce996246ec3eb7b5a931052dd605e4537441f0 Mon Sep 17 00:00:00 2001 From: Jaidyn Ann <10477760+JadedCtrl@users.noreply.github.com> Date: Sun, 3 Mar 2024 10:46:17 -0600 Subject: [PATCH] Add localization support + Esperanto translation --- _locales/en/messages.json | 108 ++++++++++++++++++++++++++++++++++++++ _locales/eo/messages.json | 108 ++++++++++++++++++++++++++++++++++++++ background.js | 18 +++---- manifest.json | 8 +-- options.html | 16 +++--- options.js | 32 ++++++++--- 6 files changed, 261 insertions(+), 29 deletions(-) create mode 100644 _locales/en/messages.json create mode 100644 _locales/eo/messages.json diff --git a/_locales/en/messages.json b/_locales/en/messages.json new file mode 100644 index 0000000..82afa5d --- /dev/null +++ b/_locales/en/messages.json @@ -0,0 +1,108 @@ +{ + "extensionName": { + "message": "Shellfox", + "description": "Name of the extension." + }, + + "extensionDescription": { + "message": "Run command-line programs from Firefox, easily.", + "description": "Description of the extension." + }, + + "pageActionName": { + "message": "Run shell command", + "description": "Name of address-bar button for running the default command on current page." + }, + + "pageCommandContextMenu": { + "message": "Run command “$COMMAND$”", + "description": "Menu-item to run a specific command on the current page.", + "placeholders": { + "command": { + "content": "$1", + "example": "Curl" + } + } + }, + + "pageCommandDefaultContextMenu": { + "message": "Run default shell command", + "description": "Menu-item to run the default command on the current page." + }, + + "linkCommandContextMenu": { + "message": "Run “$COMMAND$” on link", + "description": "Menu-item to run a specific command on a link’s URL.", + "placeholders": { + "command": { + "content": "$1", + "example": "Curl" + } + } + }, + + "linkCommandDefaultContextMenu": { + "message": "Run default command on link", + "description": "Menu-item to run the default command on a link’s URL." + }, + + "optionsTitleShell": { + "message": "Shell commands", + "description": "Title of options-page section for commands." + }, + + "optionsDescShell": { + "message": "Add shell commands, to be executed with a page’s URL as its argument. In a command, $URL will be replaced with the target page’s URL.", + "description": "Description of options-page section for commands." + }, + + "optionsHeadShellName": { + "message": "Name", + "description": "Header of table-element for options-page section for commands." + }, + + "optionsHeadShellCommand": { + "message": "Shell command", + "description": "Header of table-element for options-page section for commands." + }, + + "optionsPlaceholderName": { + "message": "Curl", + "description": "Displayed placeholder for options-page input for command-name." + }, + + "optionsPlaceholderCommand": { + "message": "curl $URL > /tmp/downloaded.html", + "description": "Displayed placeholder for options-page input for command." + }, + + "optionsTitleRule": { + "message": "URL/Page rules", + "description": "Title of options-page section for regex." + }, + + "optionsDescRule": { + "message": "Associate the above commands with URLs, based on regex rules. When a URL is tied to a command, a button will appear in context-menus and the address bar to run said command.", + "description": "Description of options-page section for regex." + }, + + "optionsHeadRuleName": { + "message": "URL regex", + "description": "Header of table-element for options-page section for regex." + }, + + "optionsHeadRuleCommand": { + "message": "Shell command", + "description": "Header of table-element for options-page section for regex." + }, + + "optionsPlaceholderRule": { + "message": "https://example.com/.*", + "description": "Displayed placeholder for options-page input for regex." + }, + + "optionsSaveButton": { + "message": "Apply", + "description": "Name of button in options-page to save changes." + } +} diff --git a/_locales/eo/messages.json b/_locales/eo/messages.json new file mode 100644 index 0000000..e626f97 --- /dev/null +++ b/_locales/eo/messages.json @@ -0,0 +1,108 @@ +{ + "extensionName": { + "message": "Ŝelvulpo", + "description": "Nomo de la aldonaĵo." + }, + + "extensionDescription": { + "message": "Ruli ŝel-ordonojn de Firefox, facile.", + "description": "Priskribo de la aldonaĵo." + }, + + "pageActionName": { + "message": "Ruli ŝel-ordonon", + "description": "Nomo de butono por ruli la implicitan ordonon de la nuna paĝo." + }, + + "pageCommandContextMenu": { + "message": "Ruli ordonon «$COMMAND$»", + "description": "Menuero por ruli specifan ordonon je la nuna paĝo.", + "placeholders": { + "command": { + "content": "$1", + "example": "Curl" + } + } + }, + + "pageCommandDefaultContextMenu": { + "message": "Ruli implicitan ŝel-ordonon", + "description": "Menuero por ruli la implicitan ordonon je la nuna paĝo." + }, + + "linkCommandContextMenu": { + "message": "Ruli «$COMMAND$» je ligilo", + "description": "Menuero por ruli specifan ordonon je ligilo.", + "placeholders": { + "command": { + "content": "$1", + "example": "Curl" + } + } + }, + + "linkCommandDefaultContextMenu": { + "message": "Ruli implicitan ordonon je ligilo", + "description": "Menuero por ruli la implicitan ordonon je ligilo." + }, + + "optionsTitleShell": { + "message": "Ŝel-ordonoj", + "description": "Titolo de agordo-parto por ordonoj." + }, + + "optionsDescShell": { + "message": "Alondi ŝel-ordonojn kiuj ruliĝas kun la URL de paĝo kiel parametro. En ordono, «$URL» anstataŭiĝos per tiu URL.", + "description": "Priskribo de agordo-parto por ordonoj." + }, + + "optionsHeadShellName": { + "message": "Nomo", + "description": "Titolo de tabelo-kolumno por agordo-parto por ordonoj." + }, + + "optionsHeadShellCommand": { + "message": "Ŝel-ordono", + "description": "Titolo de tabelo-kolumno por agordo-parto por ordonoj." + }, + + "optionsPlaceholderName": { + "message": "Curl", + "description": "Provizora valoro ĉe agordopaĝo por enigo de ordononomo." + }, + + "optionsPlaceholderCommand": { + "message": "curl $URL > /tmp/elŝutite.html", + "description": "Provizora valoro ĉe agordopaĝo por enigo de ordono." + }, + + "optionsTitleRule": { + "message": "URL/Paĝo-reguloj", + "description": "Titolo de agordo-parto por regulaj esprimoj." + }, + + "optionsDescRule": { + "message": "Ligi la suprajn ŝel-ordonojn al URLoj, laŭ regulaj esprimoj. Se URL estas ligita al ordono, butono aperiĝos en la supra breto por ruli ĝin.", + "description": "Priskribo de agordo-parto por regulaj esprimoj." + }, + + "optionsHeadRuleName": { + "message": "URL regula esprimo", + "description": "Titolo de tabelo-kolumno ĉe agordo-parto por regulaj esprimoj." + }, + + "optionsHeadRuleCommand": { + "message": "Ŝel-ordonoj", + "description": "Titolo de tabelo-kolumno ĉe agordo-parto por regulaj esprimoj." + }, + + "optionsPlaceholderRule": { + "message": "https://ekzemplo.org/.*", + "description": "Provizora valoro ĉe agordopaĝo por enigo de reteja regula esprimo." + }, + + "optionsSaveButton": { + "message": "Konservi", + "description": "Nomo de butono ĉe agordopaĝo por konservi ŝanĝojn." + } +} diff --git a/background.js b/background.js index 1e415de..8906b13 100644 --- a/background.js +++ b/background.js @@ -12,12 +12,10 @@ function initShellfoxProgram() { // Given the name of an array saved to localStorage, return it (if possible). function savedArray(name) { - let saved = []; try { - saved = JSON.parse(localStorage.getItem(name)); + let saved = JSON.parse(localStorage.getItem(name)); return saved; - } catch { }; - return saved; + } catch { return []; }; } @@ -113,7 +111,7 @@ function createCommandMenuItems() { browser.menus.create( { id: actionId, - title: "Run command “" + name + "”", + title: browser.i18n.getMessage("pageCommandContextMenu", name), contexts: ["page_action"] }); @@ -122,7 +120,7 @@ function createCommandMenuItems() { browser.menus.create( { id: pageId, - title: "Run command “" + name + "”", + title: browser.i18n.getMessage("pageCommandContextMenu", name), contexts: ["page"] }); @@ -131,7 +129,7 @@ function createCommandMenuItems() { browser.menus.create( { id: linkId, - title: "Run “" + name + "” on link", + title: browser.i18n.getMessage("linkCommandContextMenu", name), contexts: ["link"] }); } @@ -143,7 +141,7 @@ function createCommandMenuItems() { browser.menus.create( { id: "run-page-command", - title: "Run default shell command", + title: browser.i18n.getMessage("pageCommandDefaultContextMenu"), contexts: ["page"] } ); @@ -153,7 +151,7 @@ browser.menus.create( browser.menus.create( { id: "run-link-command", - title: "Run default command on link", + title: browser.i18n.getMessage("linkCommandDefaultContextMenu"), contexts: ["link"] } ); @@ -168,8 +166,6 @@ browser.pageAction.onClicked.addListener((tab) => { // When a context-menu (right-click menu) is opened, only display the SHellfox // item if there is a configured command for that page. browser.menus.onShown.addListener(info => { - console.log(info); - console.log(info.modifiers); if (info.contexts.includes("link") && getUrlCommands(info.linkUrl)) { showLinkContextMenuItem(); } else if (info.contexts.includes("page") && getUrlCommands(info.pageUrl)) { diff --git a/manifest.json b/manifest.json index 877c142..8cfa522 100644 --- a/manifest.json +++ b/manifest.json @@ -1,11 +1,13 @@ { "manifest_version": 2, - "name": "Shellfox", + "name": "__MSG_extensionName__", "version": "0.1", - "description": "Run command-line programs from Firefox, easily.", + "description": "__MSG_extensionDescription__", "homepage_url": "https://hak.xwx.moe/jadedctrl/shellfox", + "default_locale": "en", + "icons": { "250": "res/shellfox.png", "38": "res/shellfox-38.png", @@ -17,7 +19,7 @@ "19": "res/shellfox-19.png", "38": "res/shellfox-38.png" }, - "default_title": "Shellfox" + "default_title": "__MSG_pageActionName__" }, "permissions": [ diff --git a/options.html b/options.html index d172235..55bc6ce 100644 --- a/options.html +++ b/options.html @@ -5,12 +5,12 @@
-

Shell commands

-

Add shell commands, to be executed with a page’s URL as its argument. In a command, $URL will be replaced with the target page’s URL.

+

Shell commands

+

Add shell commands, to be executed with a page’s URL as its argument. In a command, $URL will be replaced with the target page’s URL.

- - + +
NameShell commandNameShell command
@@ -18,12 +18,12 @@
-

URL/Page rules

-

Associate the above commands with URLs, based on regex rules. When a URL is tied to a command, a button will appear in context-menus and the address bar to run said command.

+

URL/Page rules

+

Associate the above commands with URLs, based on regex rules. When a URL is tied to a command, a button will appear in context-menus and the address bar to run said command.

- - + +
URL regexShell commandURL regexShell command
diff --git a/options.js b/options.js index 9b4b39d..2518ec5 100644 --- a/options.js +++ b/options.js @@ -1,11 +1,9 @@ // Given the name of an array saved to localStorage, return it (if possible). function savedArray(name) { - let saved = []; try { - saved = JSON.parse(localStorage.getItem(name)); + let saved = JSON.parse(localStorage.getItem(name)); return saved; - } catch { }; - return saved; + } catch { return []; }; } @@ -93,7 +91,7 @@ function createRegexTr(regex, command_i, commandMenu) { let regexInput = document.createElement("INPUT"); regexInput.setAttribute("class", "regex"); regexInput.setAttribute("type", "text"); - regexInput.setAttribute("placeholder", "https://example.org/.*"); + regexInput.setAttribute("placeholder", browser.i18n.getMessage("optionsPlaceholderRule")); if (regex && command_i) regexInput.setAttribute("value", regex); @@ -119,7 +117,7 @@ function createCommandTr(name, command) { let nameInput = document.createElement("INPUT"); nameInput.setAttribute("class", "name"); nameInput.setAttribute("type", "text"); - nameInput.setAttribute("placeholder", "Curl"); + nameInput.setAttribute("placeholder", browser.i18n.getMessage("optionsPlaceholderName")); if (name && command) nameInput.setAttribute("value", name); @@ -129,7 +127,7 @@ function createCommandTr(name, command) { let commandInput = document.createElement("INPUT"); commandInput.setAttribute("class", "command"); commandInput.setAttribute("type", "text"); - commandInput.setAttribute("placeholder", "curl $URL > /tmp/downloaded"); + commandInput.setAttribute("placeholder", browser.i18n.getMessage("optionsPlaceholderCommand")); if (name && command) commandInput.setAttribute("value", command); @@ -144,6 +142,25 @@ function createCommandTr(name, command) { } +// Replace the HTML elements’ text with the extension’s translations. +function i18nPage() { + document.getElementsByTagName("html")[0].setAttribute("lang", browser.i18n.getMessage("@@ui_locale")); + + document.getElementById("commandTitle").innerText = browser.i18n.getMessage("optionsTitleShell"); + document.getElementById("commandP").innerText = browser.i18n.getMessage("optionsDescShell"); + document.getElementById("commandNameTh").innerText = browser.i18n.getMessage("optionsHeadShellName"); + document.getElementById("commandShellTh").innerText = browser.i18n.getMessage("optionsHeadShellCommand"); + + document.getElementById("ruleTitle").innerText = browser.i18n.getMessage("optionsTitleRule"); + document.getElementById("ruleP").innerText = browser.i18n.getMessage("optionsDescRule"); + document.getElementById("ruleRegexTh").innerText = browser.i18n.getMessage("optionsHeadRuleName"); + document.getElementById("ruleShellTh").innerText = browser.i18n.getMessage("optionsHeadRuleCommand"); + + document.getElementById("save-cmd").innerText = browser.i18n.getMessage("optionsSaveButton"); + document.getElementById("save-regex").innerText = browser.i18n.getMessage("optionsSaveButton"); +} + + document.addEventListener("click", e => { if (e.target.id == ("save-cmd")) { saveCommands(); @@ -157,3 +174,4 @@ document.addEventListener("click", e => { populateCommandTable(); populateRegexTable(); +i18nPage();