Add experimental feature to translate links

This CL adds support for translating links directly from the context
menu. This support is experimental, since many details of the
implementation might change after testing it for a while and finding
ways to improve it (hopefully also thanks to the feedback given by folks
who might also test this).

For this reason, the feature is only enabled in Canary builds of the
extension for now (or when the extension is being developed).

This CL also changes the Crowdin configuration file so strings that
change in the source file and are uploaded for translation don't remove
the existing translations. This is because although no strings are
changed in this CL, the description/context of 2 strings has changed,
and this is to be sure that the translations are not erased.

Bug: translateselectedtext:7
Change-Id: I862af18eee8830c901e7fe7d2b473cab43d9bbe7
diff --git a/src/static/_locales/en/messages.json b/src/static/_locales/en/messages.json
index d8bd3cf..ac04853 100644
--- a/src/static/_locales/en/messages.json
+++ b/src/static/_locales/en/messages.json
@@ -1,98 +1,112 @@
 {
-	"appName": {
-		"message": "Translate Selected Text",
-		"description": "The app name"
-	},
-	"appBetaName": {
-		"message": "Translate Selected Text (Beta)",
-		"description": "The beta app name"
-	},
+  "appName": {
+    "message": "Translate Selected Text",
+    "description": "The app name"
+  },
+  "appBetaName": {
+    "message": "Translate Selected Text (Beta)",
+    "description": "The beta app name"
+  },
   "appCanaryName": {
-		"message": "Translate Selected Text (Canary)",
-		"description": "The beta app name"
-	},
-	"appDescription": {
-		"message": "Translate selected text with Google Translate",
-		"description": "The app description"
-	},
-	"contextmenu_title": {
-		"message": "Translate selection into...",
-		"description": "Title of the context menu that appears when a right click is done. Inside this parent item there are the target languages."
-	},
-	"contextmenu_title2": {
-		"message": "Translate selection into '$language$'",
-		"description": "Title of the context menu that appears when a right click is done and there's only one language available.",
-		"placeholders": {
-          "language": {
-            "content": "$1",
-            "example": "Language to translate into."
-          }
-        }
-	},
-	"contextmenu_edit": {
-		"message": "Edit languages...",
-		"description": "Title of the item inside the 'Translate section into...' context menu which is used to go to the options page."
-	},
-	"options_welcome": {
-		"message": "Welcome!",
-		"description": "Title of the options page which welcomes users"
-	},
-	"options_introduction": {
-		"message": "Please, select the languages you want to show up in the \"translate\" menu.",
-		"description": "Introduction paragraph in the options page preceding the language list."
-	},
-	"options_languageselectheader": {
-		"message": "Languages:",
-		"description": "Header of the selected languages list."
-	},
-	"options_otheroptionsheader": {
-		"message": "Other options:",
-		"description": "Subheader in the options page before the options to choose where should the translation be shown.."
-	},
-	"options_tabsoption_1": {
-		"message": "Open Google Translate in a new tab for each translation.",
-		"description": "Option which defines where should the translations be shown (in this case, each translation will be opened in a new tab)."
-	},
-	"options_tabsoption_2": {
-		"message": "Open Google Translate in a unique tab and override the last translation instead of opening several tabs.",
-		"description": "Option which defines where should the translations be shown (in this case, each translation will be opened in the same tab used for the previous translation, or will open a new tab if there aren't any translation tabs open)."
-	},
-	"options_tabsoption_3": {
-		"message": "Open Google Translate in a popup.",
-		"description": "Option which defines where should the translations be shown (in this case, each translation will be opened in a new popup)."
-	},
-	"options_savebutton": {
-		"message": "Save",
-		"description": "Save button in the settings page"
-	},
-	"options_addlanguage": {
-		"message": "Add language",
-		"description": "Title for the 'Add language' dialog"
-	},
-	"options_addlanguage_addbutton": {
-		"message": "Add",
-		"description": "'Add' button in the footer of the languages list which is used to show a dialog with a list of potential languages to add. In the dialog, this message is also shown inside a button which is used to confirm the action."
-	},
-	"options_language_label": {
-		"message": "Language:",
-		"description": "Label for the language selector in the 'Add language' dialog"
-	},
-	"options_credits": {
-		"message": "Credits",
-		"description": "Message for the link to the credits dialog, and also the title for the credits dialog, which shows a list of open source projects used inside the extension and a list of translators/contributors."
-	},
+    "message": "Translate Selected Text (Canary)",
+    "description": "The beta app name"
+  },
+  "appDescription": {
+    "message": "Translate selected text with Google Translate",
+    "description": "The app description"
+  },
+  "contextmenu_title": {
+    "message": "Translate selection into...",
+    "description": "Title of the context menu that appears when selecting text in a website and then right clicking it. Inside this parent item there are the target languages."
+  },
+  "contextmenu_title2": {
+    "message": "Translate selection into '$language$'",
+    "description": "Title of the context menu that appears after selecting text in a website and right clicking it, when only one target language has been configured.",
+    "placeholders": {
+      "language": {
+        "content": "$1",
+        "example": "Language to translate into."
+      }
+    }
+  },
+  "contextmenulink_title": {
+    "message": "Translate this link to...",
+    "description": "Title of the context menu that appears when right clicking a link. Inside this parent item there are the target languages."
+  },
+  "contextmenulink_title2": {
+    "message": "Translate this link to '$language$'",
+    "description": "Title of the context menu that appears after right clicking a link, when only one target language has been configured.",
+    "placeholders": {
+      "language": {
+        "content": "$1",
+        "example": "Language to translate into."
+      }
+    }
+  },
+  "contextmenu_edit": {
+    "message": "Edit languages...",
+    "description": "Title of the item inside the 'Translate section into...' context menu which is used to go to the options page."
+  },
+  "options_welcome": {
+    "message": "Welcome!",
+    "description": "Title of the options page which welcomes users"
+  },
+  "options_introduction": {
+    "message": "Please, select the languages you want to show up in the \"translate\" menu.",
+    "description": "Introduction paragraph in the options page preceding the language list."
+  },
+  "options_languageselectheader": {
+    "message": "Languages:",
+    "description": "Header of the selected languages list."
+  },
+  "options_otheroptionsheader": {
+    "message": "Other options:",
+    "description": "Subheader in the options page before the options to choose where should the translation be shown.."
+  },
+  "options_tabsoption_1": {
+    "message": "Open Google Translate in a new tab for each translation.",
+    "description": "Option which defines where should the translations be shown (in this case, each translation will be opened in a new tab)."
+  },
+  "options_tabsoption_2": {
+    "message": "Open Google Translate in a unique tab and override the last translation instead of opening several tabs.",
+    "description": "Option which defines where should the translations be shown (in this case, each translation will be opened in the same tab used for the previous translation, or will open a new tab if there aren't any translation tabs open)."
+  },
+  "options_tabsoption_3": {
+    "message": "Open Google Translate in a popup.",
+    "description": "Option which defines where should the translations be shown (in this case, each translation will be opened in a new popup)."
+  },
+  "options_savebutton": {
+    "message": "Save",
+    "description": "Save button in the settings page"
+  },
+  "options_addlanguage": {
+    "message": "Add language",
+    "description": "Title for the 'Add language' dialog"
+  },
+  "options_addlanguage_addbutton": {
+    "message": "Add",
+    "description": "'Add' button in the footer of the languages list which is used to show a dialog with a list of potential languages to add. In the dialog, this message is also shown inside a button which is used to confirm the action."
+  },
+  "options_language_label": {
+    "message": "Language:",
+    "description": "Label for the language selector in the 'Add language' dialog"
+  },
+  "options_credits": {
+    "message": "Credits",
+    "description": "Message for the link to the credits dialog, and also the title for the credits dialog, which shows a list of open source projects used inside the extension and a list of translators/contributors."
+  },
   "options_credits_createdby": {
     "message": "Extension created by: <a href=\"https://www.avm99963.com/\" target=\"_blank\">@avm99963</a> (Adrià Vilanova Martínez)",
     "description": "Text shown in the credits dialog, which shows that the extension was created by Adrià Vilanova Martínez (and their username is avm99963)."
   },
-	"options_credits_homepage": {
-		"message": "homepage",
-		"description": "Text shown for links to go to each homepage of open source projects in the credits. NOTE: put in in lowercase letters"
-	},
-	"options_credits_by": {
-		"message": "by",
-		"description": "Fragment of the author statement in an item of the credits. NOTE: put in in lowercase letters. EXAMPLE: '{{options_credits_by}} Adrià Vilanova Martínez'"
-	},
+  "options_credits_homepage": {
+    "message": "homepage",
+    "description": "Text shown for links to go to each homepage of open source projects in the credits. NOTE: put in in lowercase letters"
+  },
+  "options_credits_by": {
+    "message": "by",
+    "description": "Fragment of the author statement in an item of the credits. NOTE: put in in lowercase letters. EXAMPLE: '{{options_credits_by}} Adrià Vilanova Martínez'"
+  },
   "options_credits_translations": {
     "message": "Translations",
     "description": "Header for the section in the credits dialog which recognizes translators."
@@ -101,14 +115,18 @@
     "message": "I would like to give a very special thank you to the following contributors, who have selflessly translated the extension interface to many languages:",
     "description": "Paragraph in the 'Translations' section of the credits dialog, which recognizes translators. Following this paragraph there's a list with all the translators' names (if you've translated a string in Crowdin, you'll automatically be added to the list in the following extension update)."
   },
-	"options_ok": {
-		"message": "OK",
-		"description": "OK button in informative dialogs, which is used to close them (no action is done when pressing these buttons)"
-	},
-	"options_cancel": {
-		"message": "Cancel",
-		"description": "Cancel button in the dialogs, to reject an action."
-	},
-	"notification_install_title": { "message": "Thanks for installing 'Translate Selected Text'" },
-	"notification_install_message": { "message": "Click this notification to set it up." }
+  "options_ok": {
+    "message": "OK",
+    "description": "OK button in informative dialogs, which is used to close them (no action is done when pressing these buttons)"
+  },
+  "options_cancel": {
+    "message": "Cancel",
+    "description": "Cancel button in the dialogs, to reject an action."
+  },
+  "notification_install_title": {
+    "message": "Thanks for installing 'Translate Selected Text'"
+  },
+  "notification_install_message": {
+    "message": "Click this notification to set it up."
+  }
 }