From d413d67601a5c9c6ab8eb6efa2a5feb2148e544d Mon Sep 17 00:00:00 2001 From: Eemeli Aro Date: Tue, 22 Nov 2022 17:12:21 +0000 Subject: [PATCH] Bug 1760029 - Migrate tabbrowser.properties strings used by tabbrowser.js to Fluent. r=dao,fluent-reviewers,flod Differential Revision: https://phabricator.services.mozilla.com/D159016 --- browser/base/content/tabbrowser.js | 135 +++++------- browser/locales/en-US/browser/tabbrowser.ftl | 85 ++++++++ .../chrome/browser/tabbrowser.properties | 67 ------ .../bug_1760029_tabbrowser.py | 196 ++++++++++++++++++ 4 files changed, 336 insertions(+), 147 deletions(-) create mode 100644 python/l10n/fluent_migrations/bug_1760029_tabbrowser.py diff --git a/browser/base/content/tabbrowser.js b/browser/base/content/tabbrowser.js index d0dd23785c8b..602609fbc1b6 100644 --- a/browser/base/content/tabbrowser.js +++ b/browser/base/content/tabbrowser.js @@ -35,6 +35,9 @@ "nsIMacSharingService", ], }); + XPCOMUtils.defineLazyGetter(this, "tabLocalization", () => { + return new Localization(["browser/tabbrowser.ftl"], true); + }); if (AppConstants.MOZ_CRASHREPORTER) { ChromeUtils.defineModuleGetter( @@ -3194,26 +3197,25 @@ // solve the problem of windows "obscuring" the prompt. // see bug #350299 for more details window.focus(); - let warningTitle = gTabBrowserBundle.GetStringFromName( - "tabs.closeTabsTitle" - ); - warningTitle = PluralForm.get(tabsToClose, warningTitle).replace( - "#1", - tabsToClose - ); + const [title, button, checkbox] = this.tabLocalization.formatValuesSync([ + { + id: "tabbrowser-confirm-close-tabs-title", + args: { tabCount: tabsToClose }, + }, + { id: "tabbrowser-confirm-close-tabs-button" }, + { id: "tabbrowser-confirm-close-tabs-checkbox" }, + ]); let flags = ps.BUTTON_TITLE_IS_STRING * ps.BUTTON_POS_0 + ps.BUTTON_TITLE_CANCEL * ps.BUTTON_POS_1; let checkboxLabel = - aCloseTabs == this.closingTabsEnum.ALL - ? gTabBrowserBundle.GetStringFromName("tabs.closeTabsConfirmCheckbox") - : null; + aCloseTabs == this.closingTabsEnum.ALL ? checkbox : null; var buttonPressed = ps.confirmEx( window, - warningTitle, + title, null, flags, - gTabBrowserBundle.GetStringFromName("tabs.closeButtonMultiple"), + button, null, null, checkboxLabel, @@ -5463,19 +5465,26 @@ try { this._awaitingToggleCaretBrowsingPrompt = true; + const [ + title, + message, + checkbox, + ] = this.tabLocalization.formatValuesSync([ + "tabbrowser-confirm-caretbrowsing-title", + "tabbrowser-confirm-caretbrowsing-message", + "tabbrowser-confirm-caretbrowsing-checkbox", + ]); var buttonPressed = promptService.confirmEx( window, - gTabBrowserBundle.GetStringFromName( - "browsewithcaret.checkWindowTitle" - ), - gTabBrowserBundle.GetStringFromName("browsewithcaret.checkLabel"), + title, + message, // Make "No" the default: promptService.STD_YES_NO_BUTTONS | promptService.BUTTON_POS_1_DEFAULT, null, null, null, - gTabBrowserBundle.GetStringFromName("browsewithcaret.checkMsg"), + checkbox, checkValue ); } catch (ex) { @@ -5576,12 +5585,12 @@ } } if (tab.userContextId) { - label = gTabBrowserBundle.formatStringFromName( - "tabs.containers.tooltip", - [ - label, - ContextualIdentityService.getUserContextLabel(tab.userContextId), - ] + const containerName = ContextualIdentityService.getUserContextLabel( + tab.userContextId + ); + label = this.tabLocalization.formatValueSync( + "tabbrowser-container-tab-title", + { title: label, containerName } ); } return label; @@ -5595,64 +5604,34 @@ return; } - let stringWithShortcut = (stringId, keyElemId, pluralCount) => { - let keyElem = document.getElementById(keyElemId); - let shortcut = ShortcutUtils.prettifyShortcut(keyElem); - return PluralForm.get( - pluralCount, - gTabBrowserBundle.GetStringFromName(stringId) - ) - .replace("%S", shortcut) - .replace("#1", pluralCount); - }; - - let label; - const selectedTabs = this.selectedTabs; - const contextTabInSelection = selectedTabs.includes(tab); - const affectedTabsLength = contextTabInSelection - ? selectedTabs.length + let l10nId, l10nArgs; + const tabCount = this.selectedTabs.includes(tab) + ? this.selectedTabs.length : 1; if (tab.mOverCloseButton) { - label = tab.selected - ? stringWithShortcut( - "tabs.closeTabs.tooltip", - "key_close", - affectedTabsLength - ) - : PluralForm.get( - affectedTabsLength, - gTabBrowserBundle.GetStringFromName("tabs.closeTabs.tooltip") - ).replace("#1", affectedTabsLength); + l10nId = "tabbrowser-close-tabs-tooltip"; + l10nArgs = { tabCount }; } else if (tab._overPlayingIcon) { - let stringID; + l10nArgs = { tabCount }; if (tab.selected) { - stringID = tab.linkedBrowser.audioMuted - ? "tabs.unmuteAudio2.tooltip" - : "tabs.muteAudio2.tooltip"; - label = stringWithShortcut( - stringID, - "key_toggleMute", - affectedTabsLength - ); + l10nId = tab.linkedBrowser.audioMuted + ? "tabbrowser-unmute-tab-audio-tooltip" + : "tabbrowser-mute-tab-audio-tooltip"; + const keyElem = document.getElementById("key_toggleMute"); + l10nArgs.shortcut = ShortcutUtils.prettifyShortcut(keyElem); + } else if (tab.hasAttribute("activemedia-blocked")) { + l10nId = "tabbrowser-unblock-tab-audio-tooltip"; } else { - if (tab.hasAttribute("activemedia-blocked")) { - stringID = "tabs.unblockAudio2.tooltip"; - } else { - stringID = tab.linkedBrowser.audioMuted - ? "tabs.unmuteAudio2.background.tooltip" - : "tabs.muteAudio2.background.tooltip"; - } - - label = PluralForm.get( - affectedTabsLength, - gTabBrowserBundle.GetStringFromName(stringID) - ).replace("#1", affectedTabsLength); + l10nId = tab.linkedBrowser.audioMuted + ? "tabbrowser-unmute-tab-audio-background-tooltip" + : "tabbrowser-mute-tab-audio-background-tooltip"; } } else { - label = this.getTabTooltip(tab); + l10nId = "tabbrowser-tab-tooltip"; + l10nArgs = { title: this.getTabTooltip(tab, true) }; } - event.target.setAttribute("label", label); + document.l10n.setAttributes(event.target, l10nId, l10nArgs); }, handleEvent(aEvent) { @@ -7066,14 +7045,10 @@ var TabBarVisibility = { navbar.setAttribute("tabs-hidden", collapse); document.getElementById("menu_closeWindow").hidden = collapse; - document - .getElementById("menu_close") - .setAttribute( - "label", - gTabBrowserBundle.GetStringFromName( - collapse ? "tabs.close" : "tabs.closeTab" - ) - ); + document.l10n.setAttributes( + document.getElementById("menu_close"), + collapse ? "tabbrowser-menuitem-close" : "tabbrowser-menuitem-close-tab" + ); TabsInTitlebar.allowedBy("tabs-visible", !collapse); }, diff --git a/browser/locales/en-US/browser/tabbrowser.ftl b/browser/locales/en-US/browser/tabbrowser.ftl index de82c27452d3..edc5cc6f3349 100644 --- a/browser/locales/en-US/browser/tabbrowser.ftl +++ b/browser/locales/en-US/browser/tabbrowser.ftl @@ -2,6 +2,91 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +tabbrowser-menuitem-close-tab = + .label = Close Tab +tabbrowser-menuitem-close = + .label = Close + +# Displayed as a tooltip on container tabs +# Variables: +# $title (String): the title of the current tab. +# $containerName (String): the name of the current container. +tabbrowser-container-tab-title = { $title } — { $containerName } + +# Variables: +# $title (String): the title of the current tab. +tabbrowser-tab-tooltip = + .label = { $title } + +# Variables: +# $tabCount (Number): The number of tabs that will be closed. +tabbrowser-close-tabs-tooltip = + .label = + { $tabCount -> + [one] Close tab + *[other] Close { $tabCount } tabs + } + +## Tooltips for tab audio control +## Variables: +## $tabCount (Number): The number of tabs that will be affected. + +# Variables: +# $shortcut (String): The keyboard shortcut for "Mute tab". +tabbrowser-mute-tab-audio-tooltip = + .label = + { $tabCount -> + [one] Mute tab ({ $shortcut }) + *[other] Mute { $tabCount } tabs ({ $shortcut }) + } +# Variables: +# $shortcut (String): The keyboard shortcut for "Unmute tab". +tabbrowser-unmute-tab-audio-tooltip = + .label = + { $tabCount -> + [one] Unmute tab ({ $shortcut }) + *[other] Unmute { $tabCount } tabs ({ $shortcut }) + } +tabbrowser-mute-tab-audio-background-tooltip = + .label = + { $tabCount -> + [one] Mute tab + *[other] Mute { $tabCount } tabs + } +tabbrowser-unmute-tab-audio-background-tooltip = + .label = + { $tabCount -> + [one] Unmute tab + *[other] Unmute { $tabCount } tabs + } +tabbrowser-unblock-tab-audio-tooltip = + .label = + { $tabCount -> + [one] Play tab + *[other] Play { $tabCount } tabs + } + +## Confirmation dialog when closing a window with more than one tab open, +## or when quitting when only one window is open. + +# The singular form is not considered since this string is used only for multiple tabs. +# Variables: +# $tabCount (Number): The number of tabs that will be closed. +tabbrowser-confirm-close-tabs-title = + { $tabCount -> + *[other] Close { $tabCount } tabs? + } +tabbrowser-confirm-close-tabs-button = Close tabs +tabbrowser-confirm-close-tabs-checkbox = Confirm before closing multiple tabs + +## Confirmation dialog for enabling caret browsing + +tabbrowser-confirm-caretbrowsing-title = Caret Browsing +tabbrowser-confirm-caretbrowsing-message = Pressing F7 turns Caret Browsing on or off. This feature places a moveable cursor in web pages, allowing you to select text with the keyboard. Do you want to turn Caret Browsing on? +tabbrowser-confirm-caretbrowsing-checkbox = Do not show me this dialog box again. + +## + # Variables: # $domain (String): URL of the page that is trying to steal focus. tabbrowser-allow-dialogs-to-get-focus = diff --git a/browser/locales/en-US/chrome/browser/tabbrowser.properties b/browser/locales/en-US/chrome/browser/tabbrowser.properties index 1f0e3dd817b0..fc29e1d58c0e 100644 --- a/browser/locales/en-US/chrome/browser/tabbrowser.properties +++ b/browser/locales/en-US/chrome/browser/tabbrowser.properties @@ -4,19 +4,6 @@ tabs.emptyTabTitle=New Tab tabs.emptyPrivateTabTitle2=New Private Tab -tabs.closeTab=Close Tab -tabs.close=Close - -# This section applies when closing a window with more than one tab open, -# or when quitting when only one window is open. -# LOCALIZATION NOTE (tabs.closeTabsTitle): -# Semicolon-separated list of plural forms. See: -# http://developer.mozilla.org/en/docs/Localization_and_Plurals -# The singular form is not considered since this string is used only for -# multiple tabs. -tabs.closeTabsTitle=;Close #1 tabs? -tabs.closeTabsConfirmCheckbox=Confirm before closing multiple tabs -tabs.closeButtonMultiple=Close tabs # This section applies when quitting using the menu and multiple windows are open. # LOCALIZATION NOTE (tabs.closeTitleTabs): @@ -42,56 +29,6 @@ tabs.closeTabsWithKeyButton=Quit %S # %S is replaced with the text of the keyboard shortcut for quitting. tabs.closeTabsWithKeyConfirmCheckbox=Confirm before quitting with %S -# LOCALIZATION NOTE (tabs.closeTabs.tooltip): -# Semicolon-separated list of plural forms. See: -# http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 is the number of tabs that will be closed. This is ignored for the -# single tab case in English, but can be used by other locales as necessary. -tabs.closeTabs.tooltip=Close tab;Close #1 tabs - -# LOCALIZATION NOTE (tabs.muteAudio2.tooltip): -# Semicolon-separated list of plural forms. See: -# http://developer.mozilla.org/en/docs/Localization_and_Plurals -# %S is the keyboard shortcut for "Mute tab". -# #1 is the number of tabs that will be muted. This is ignored for the -# single tab case in English, but can be used by other locales as necessary. -tabs.muteAudio2.tooltip=Mute tab (%S);Mute #1 tabs (%S) - -# LOCALIZATION NOTE (tabs.unmuteAudio2.tooltip): -# Semicolon-separated list of plural forms. See: -# http://developer.mozilla.org/en/docs/Localization_and_Plurals -# %S is the keyboard shortcut for "Unmute tab". -# #1 is the number of tabs that will be unmuted. This is ignored for the -# single tab case in English, but can be used by other locales as necessary. -tabs.unmuteAudio2.tooltip=Unmute tab (%S);Unmute #1 tabs (%S) - -# LOCALIZATION NOTE (tabs.muteAudio2.background.tooltip): -# Semicolon-separated list of plural forms. See: -# http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 is the number of tabs that will be muted. This is ignored for the -# single tab case in English, but can be used by other locales as necessary. -tabs.muteAudio2.background.tooltip=Mute tab;Mute #1 tabs - -# LOCALIZATION NOTE (tabs.unmuteAudio2.background.tooltip): -# Semicolon-separated list of plural forms. See: -# http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 is the number of tabs that will be unmuted. This is ignored for the -# single tab case in English, but can be used by other locales as necessary. -tabs.unmuteAudio2.background.tooltip=Unmute tab;Unmute #1 tabs - -# LOCALIZATION NOTE (tabs.unblockAudio2.tooltip): -# Semicolon-separated list of plural forms. See: -# http://developer.mozilla.org/en/docs/Localization_and_Plurals -# #1 is the number of tabs that will have their audio unblocked. This is ignored for the -# single tab case in English, but can be used by other locales as necessary. -tabs.unblockAudio2.tooltip=Play tab;Play #1 tabs - -# LOCALIZATION NOTE (tabs.containers.tooltip): -# Displayed as a tooltip on container tabs -# %1$S is the title of the current tab -# %2$S is the name of the current container -tabs.containers.tooltip=%1$S — %2$S - # LOCALIZATION NOTE (tabs.openWarningTitle, tabs.openWarningMultipleBranded, tabs.openButtonMultiple, tabs.openWarningPromptMeBranded): # These items are moved from chrome/browser/places/places.properties # Now they are not specific to bookmark. @@ -99,7 +36,3 @@ tabs.openWarningTitle=Confirm open tabs.openWarningMultipleBranded=You are about to open %S tabs. This might slow down %S while the pages are loading. Are you sure you want to continue? tabs.openButtonMultiple=Open tabs tabs.openWarningPromptMeBranded=Warn me when opening multiple tabs might slow down %S - -browsewithcaret.checkMsg=Do not show me this dialog box again. -browsewithcaret.checkWindowTitle=Caret Browsing -browsewithcaret.checkLabel=Pressing F7 turns Caret Browsing on or off. This feature places a moveable cursor in web pages, allowing you to select text with the keyboard. Do you want to turn Caret Browsing on? diff --git a/python/l10n/fluent_migrations/bug_1760029_tabbrowser.py b/python/l10n/fluent_migrations/bug_1760029_tabbrowser.py new file mode 100644 index 000000000000..963602c4acf8 --- /dev/null +++ b/python/l10n/fluent_migrations/bug_1760029_tabbrowser.py @@ -0,0 +1,196 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +import fluent.syntax.ast as FTL +from fluent.migrate.helpers import TERM_REFERENCE, VARIABLE_REFERENCE +from fluent.migrate.transforms import COPY, PLURALS, REPLACE, REPLACE_IN_TEXT + + +def migrate(ctx): + """Bug 1760029 - Migrate tabbrowser to Fluent, part {index}.""" + + source = "browser/chrome/browser/tabbrowser.properties" + target = "browser/browser/tabbrowser.ftl" + + ctx.add_transforms( + target, + target, + [ + FTL.Message( + id=FTL.Identifier("tabbrowser-menuitem-close-tab"), + attributes=[ + FTL.Attribute( + id=FTL.Identifier("label"), value=COPY(source, "tabs.closeTab") + ) + ], + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-menuitem-close"), + attributes=[ + FTL.Attribute( + id=FTL.Identifier("label"), value=COPY(source, "tabs.close") + ) + ], + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-container-tab-title"), + value=REPLACE( + source, + "tabs.containers.tooltip", + { + "%1$S": VARIABLE_REFERENCE("title"), + "%2$S": VARIABLE_REFERENCE("containerName"), + }, + ), + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-tab-tooltip"), + attributes=[ + FTL.Attribute( + id=FTL.Identifier("label"), + value=FTL.Pattern([FTL.Placeable(VARIABLE_REFERENCE("title"))]), + ) + ], + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-close-tabs-tooltip"), + attributes=[ + FTL.Attribute( + id=FTL.Identifier("label"), + value=PLURALS( + source, + "tabs.closeTabs.tooltip", + VARIABLE_REFERENCE("tabCount"), + foreach=lambda n: REPLACE_IN_TEXT( + n, + {"#1": VARIABLE_REFERENCE("tabCount")}, + ), + ), + ) + ], + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-mute-tab-audio-tooltip"), + attributes=[ + FTL.Attribute( + id=FTL.Identifier("label"), + value=PLURALS( + source, + "tabs.muteAudio2.tooltip", + VARIABLE_REFERENCE("tabCount"), + foreach=lambda text: REPLACE_IN_TEXT( + text, + { + "#1": VARIABLE_REFERENCE("tabCount"), + "%S": VARIABLE_REFERENCE("shortcut"), + }, + ), + ), + ) + ], + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-unmute-tab-audio-tooltip"), + attributes=[ + FTL.Attribute( + id=FTL.Identifier("label"), + value=PLURALS( + source, + "tabs.unmuteAudio2.tooltip", + VARIABLE_REFERENCE("tabCount"), + foreach=lambda text: REPLACE_IN_TEXT( + text, + { + "#1": VARIABLE_REFERENCE("tabCount"), + "%S": VARIABLE_REFERENCE("shortcut"), + }, + ), + ), + ) + ], + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-mute-tab-audio-background-tooltip"), + attributes=[ + FTL.Attribute( + id=FTL.Identifier("label"), + value=PLURALS( + source, + "tabs.muteAudio2.background.tooltip", + VARIABLE_REFERENCE("tabCount"), + foreach=lambda n: REPLACE_IN_TEXT( + n, + {"#1": VARIABLE_REFERENCE("tabCount")}, + ), + ), + ) + ], + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-unmute-tab-audio-background-tooltip"), + attributes=[ + FTL.Attribute( + id=FTL.Identifier("label"), + value=PLURALS( + source, + "tabs.unmuteAudio2.background.tooltip", + VARIABLE_REFERENCE("tabCount"), + foreach=lambda n: REPLACE_IN_TEXT( + n, + {"#1": VARIABLE_REFERENCE("tabCount")}, + ), + ), + ) + ], + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-unblock-tab-audio-tooltip"), + attributes=[ + FTL.Attribute( + id=FTL.Identifier("label"), + value=PLURALS( + source, + "tabs.unblockAudio2.tooltip", + VARIABLE_REFERENCE("tabCount"), + foreach=lambda n: REPLACE_IN_TEXT( + n, + {"#1": VARIABLE_REFERENCE("tabCount")}, + ), + ), + ) + ], + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-confirm-close-tabs-title"), + value=PLURALS( + source, + "tabs.closeTabsTitle", + VARIABLE_REFERENCE("tabCount"), + foreach=lambda n: REPLACE_IN_TEXT( + n, + {"#1": VARIABLE_REFERENCE("tabCount")}, + ), + ), + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-confirm-close-tabs-button"), + value=COPY(source, "tabs.closeButtonMultiple"), + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-confirm-close-tabs-checkbox"), + value=COPY(source, "tabs.closeTabsConfirmCheckbox"), + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-confirm-caretbrowsing-title"), + value=COPY(source, "browsewithcaret.checkWindowTitle"), + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-confirm-caretbrowsing-message"), + value=COPY(source, "browsewithcaret.checkLabel"), + ), + FTL.Message( + id=FTL.Identifier("tabbrowser-confirm-caretbrowsing-checkbox"), + value=COPY(source, "browsewithcaret.checkMsg"), + ), + ], + )