Skip to content
Snippets Groups Projects
Commit 1e54660e authored by Collin Wing's avatar Collin Wing
Browse files

Bug 1486935 - Migrated aboutProfiles to fluent for localization r=Gijs,flod

Differential Revision: https://phabricator.services.mozilla.com/D5283

--HG--
extra : moz-landing-system : lando
parent 9a8bd3b5
No related branches found
No related tags found
No related merge requests found
from __future__ import absolute_import
import fluent.syntax.ast as FTL
from fluent.migrate.helpers import transforms_from
from fluent.migrate.helpers import VARIABLE_REFERENCE
from fluent.migrate import REPLACE
from fluent.migrate import COPY
def migrate(ctx):
""" Bug 1486935 - Migrate about:Profiles strings to FTL, part {index}. """
ctx.add_transforms(
"toolkit/toolkit/about/aboutProfiles.ftl",
"toolkit/toolkit/about/aboutProfiles.ftl",
transforms_from(
"""
profiles-title = { COPY("toolkit/chrome/global/aboutProfiles.dtd", "aboutProfiles.title")}
profiles-subtitle = { COPY("toolkit/chrome/global/aboutProfiles.dtd", "aboutProfiles.subtitle")}
profiles-create = { COPY("toolkit/chrome/global/aboutProfiles.dtd", "aboutProfiles.create")}
profiles-restart-title = { COPY("toolkit/chrome/global/aboutProfiles.dtd", "aboutProfiles.restart.title")}
profiles-restart-in-safe-mode = { COPY("toolkit/chrome/global/aboutProfiles.dtd", "aboutProfiles.restart.inSafeMode")}
profiles-restart-normal = { COPY("toolkit/chrome/global/aboutProfiles.dtd", "aboutProfiles.restart.normal")}
profiles-is-default = { COPY("toolkit/chrome/global/aboutProfiles.properties", "isDefault")}
profiles-rootdir = { COPY("toolkit/chrome/global/aboutProfiles.properties", "rootDir")}
profiles-localdir = { COPY("toolkit/chrome/global/aboutProfiles.properties", "localDir")}
profiles-current-profile = { COPY("toolkit/chrome/global/aboutProfiles.properties", "currentProfile")}
profiles-in-use-profile = { COPY("toolkit/chrome/global/aboutProfiles.properties", "inUseProfile")}
profiles-rename = { COPY("toolkit/chrome/global/aboutProfiles.properties", "rename")}
profiles-remove = { COPY("toolkit/chrome/global/aboutProfiles.properties", "remove")}
profiles-set-as-default = { COPY("toolkit/chrome/global/aboutProfiles.properties", "setAsDefault")}
profiles-launch-profile = { COPY("toolkit/chrome/global/aboutProfiles.properties", "launchProfile")}
profiles-yes = { COPY("toolkit/chrome/global/aboutProfiles.properties", "yes")}
profiles-no = { COPY("toolkit/chrome/global/aboutProfiles.properties", "no")}
profiles-rename-profile-title = { COPY("toolkit/chrome/global/aboutProfiles.properties", "renameProfileTitle")}
profiles-invalid-profile-name-title = { COPY("toolkit/chrome/global/aboutProfiles.properties", "invalidProfileNameTitle")}
profiles-delete-profile-title = { COPY("toolkit/chrome/global/aboutProfiles.properties", "deleteProfileTitle")}
profiles-delete-files = { COPY("toolkit/chrome/global/aboutProfiles.properties", "deleteFiles")}
profiles-dont-delete-files = { COPY("toolkit/chrome/global/aboutProfiles.properties", "dontDeleteFiles")}
profiles-delete-profile-failed-title = { COPY("toolkit/chrome/global/aboutProfiles.properties", "deleteProfileFailedTitle")}
profiles-delete-profile-failed-message = { COPY("toolkit/chrome/global/aboutProfiles.properties", "deleteProfileFailedMessage")}
""")
)
ctx.add_transforms(
"toolkit/toolkit/about/aboutProfiles.ftl",
"toolkit/toolkit/about/aboutProfiles.ftl",
[
FTL.Message(
id=FTL.Identifier("profiles-name"),
value=REPLACE(
"toolkit/chrome/global/aboutProfiles.properties",
"name",
{
"%S": VARIABLE_REFERENCE(
"name"
),
}
)
),
FTL.Message(
id=FTL.Identifier("profiles-rename-profile"),
value=REPLACE(
"toolkit/chrome/global/aboutProfiles.properties",
"renameProfile",
{
"%S": VARIABLE_REFERENCE(
"name"
),
}
)
),
FTL.Message(
id=FTL.Identifier("profiles-invalid-profile-name"),
value=REPLACE(
"toolkit/chrome/global/aboutProfiles.properties",
"invalidProfileName",
{
"%S": VARIABLE_REFERENCE(
"name"
),
}
)
),
FTL.Message(
id=FTL.Identifier("profiles-delete-profile-confirm"),
value=REPLACE(
"toolkit/chrome/global/aboutProfiles.properties",
"deleteProfileConfirm",
{
"%S": VARIABLE_REFERENCE(
"dir"
),
}
)
),
FTL.Message(
id=FTL.Identifier("profiles-opendir"),
value=FTL.Pattern(
elements=[
FTL.Placeable(
expression=FTL.SelectExpression(
selector=FTL.CallExpression(
callee=FTL.Function("PLATFORM")
),
variants=[
FTL.Variant(
key=FTL.VariantName("macos"),
default=False,
value=COPY(
"toolkit/chrome/global/aboutProfiles.properties",
"macOpenDir"
)
),
FTL.Variant(
key=FTL.VariantName("windows"),
default=False,
value=COPY(
"toolkit/chrome/global/aboutProfiles.properties",
"winOpenDir2"
)
),
FTL.Variant(
key=FTL.VariantName("other"),
default=True,
value=COPY(
"toolkit/chrome/global/aboutProfiles.properties",
"openDir"
)
)
]
)
)
]
)
)
]
)
...@@ -15,9 +15,6 @@ XPCOMUtils.defineLazyServiceGetter( ...@@ -15,9 +15,6 @@ XPCOMUtils.defineLazyServiceGetter(
"nsIToolkitProfileService" "nsIToolkitProfileService"
); );
const bundle = Services.strings.createBundle(
"chrome://global/locale/aboutProfiles.properties");
// nsIToolkitProfileService.selectProfile can be used only during the selection // nsIToolkitProfileService.selectProfile can be used only during the selection
// of the profile in the ProfileManager. If we are showing about:profiles in a // of the profile in the ProfileManager. If we are showing about:profiles in a
// tab, the selectedProfile returns the default profile. // tab, the selectedProfile returns the default profile.
...@@ -103,22 +100,19 @@ function display(profileData) { ...@@ -103,22 +100,19 @@ function display(profileData) {
let div = document.createElement("div"); let div = document.createElement("div");
parent.appendChild(div); parent.appendChild(div);
let nameStr = bundle.formatStringFromName("name", [profileData.profile.name], 1);
let name = document.createElement("h2"); let name = document.createElement("h2");
name.appendChild(document.createTextNode(nameStr));
div.appendChild(name); div.appendChild(name);
document.l10n.setAttributes(name, "profiles-name", { name: profileData.profile.name });
if (profileData.isCurrentProfile) { if (profileData.isCurrentProfile) {
let currentProfile = document.createElement("h3"); let currentProfile = document.createElement("h3");
let currentProfileStr = bundle.GetStringFromName("currentProfile"); document.l10n.setAttributes(currentProfile, "profiles-current-profile");
currentProfile.appendChild(document.createTextNode(currentProfileStr));
div.appendChild(currentProfile); div.appendChild(currentProfile);
} else if (profileData.isInUse) { } else if (profileData.isInUse) {
let currentProfile = document.createElement("h3"); let currentProfile = document.createElement("h3");
let currentProfileStr = bundle.GetStringFromName("inUseProfile"); document.l10n.setAttributes(currentProfile, "profiles-in-use-profile");
currentProfile.appendChild(document.createTextNode(currentProfileStr));
div.appendChild(currentProfile); div.appendChild(currentProfile);
} }
...@@ -134,43 +128,39 @@ function display(profileData) { ...@@ -134,43 +128,39 @@ function display(profileData) {
let th = document.createElement("th"); let th = document.createElement("th");
th.setAttribute("class", "column"); th.setAttribute("class", "column");
th.appendChild(document.createTextNode(title)); document.l10n.setAttributes(th, title);
tr.appendChild(th); tr.appendChild(th);
let td = document.createElement("td"); let td = document.createElement("td");
td.appendChild(document.createTextNode(value));
tr.appendChild(td); tr.appendChild(td);
if (dir) { if (dir) {
td.appendChild(document.createTextNode(" ")); td.appendChild(document.createTextNode(value));
let button = document.createElement("button"); let button = document.createElement("button");
let string = "openDir"; button.setAttribute("class", "opendir");
if (AppConstants.platform == "win") { document.l10n.setAttributes(button, "profiles-opendir");
string = "winOpenDir2";
} else if (AppConstants.platform == "macosx") {
string = "macOpenDir";
}
let buttonText = document.createTextNode(bundle.GetStringFromName(string));
button.appendChild(buttonText);
td.appendChild(button); td.appendChild(button);
button.addEventListener("click", function(e) { button.addEventListener("click", function(e) {
openDirectory(value); openDirectory(value);
}); });
} else {
document.l10n.setAttributes(td, value);
} }
} }
createItem(bundle.GetStringFromName("isDefault"), createItem("profiles-is-default",
profileData.isDefault ? bundle.GetStringFromName("yes") : bundle.GetStringFromName("no")); profileData.isDefault ? "profiles-yes" : "profiles-no");
createItem(bundle.GetStringFromName("rootDir"), profileData.profile.rootDir.path, true); createItem("profiles-rootdir", profileData.profile.rootDir.path, true);
if (profileData.profile.localDir.path != profileData.profile.rootDir.path) { if (profileData.profile.localDir.path != profileData.profile.rootDir.path) {
createItem(bundle.GetStringFromName("localDir"), profileData.profile.localDir.path, true); createItem("profiles-localdir", profileData.profile.localDir.path, true);
} }
let renameButton = document.createElement("button"); let renameButton = document.createElement("button");
renameButton.appendChild(document.createTextNode(bundle.GetStringFromName("rename"))); document.l10n.setAttributes(renameButton, "profiles-rename");
renameButton.onclick = function() { renameButton.onclick = function() {
renameProfile(profileData.profile); renameProfile(profileData.profile);
}; };
...@@ -178,7 +168,7 @@ function display(profileData) { ...@@ -178,7 +168,7 @@ function display(profileData) {
if (!profileData.isInUse) { if (!profileData.isInUse) {
let removeButton = document.createElement("button"); let removeButton = document.createElement("button");
removeButton.appendChild(document.createTextNode(bundle.GetStringFromName("remove"))); document.l10n.setAttributes(removeButton, "profiles-remove");
removeButton.onclick = function() { removeButton.onclick = function() {
removeProfile(profileData.profile); removeProfile(profileData.profile);
}; };
...@@ -188,7 +178,7 @@ function display(profileData) { ...@@ -188,7 +178,7 @@ function display(profileData) {
if (!profileData.isDefault) { if (!profileData.isDefault) {
let defaultButton = document.createElement("button"); let defaultButton = document.createElement("button");
defaultButton.appendChild(document.createTextNode(bundle.GetStringFromName("setAsDefault"))); document.l10n.setAttributes(defaultButton, "profiles-set-as-default");
defaultButton.onclick = function() { defaultButton.onclick = function() {
defaultProfile(profileData.profile); defaultProfile(profileData.profile);
}; };
...@@ -197,7 +187,7 @@ function display(profileData) { ...@@ -197,7 +187,7 @@ function display(profileData) {
if (!profileData.isInUse) { if (!profileData.isInUse) {
let runButton = document.createElement("button"); let runButton = document.createElement("button");
runButton.appendChild(document.createTextNode(bundle.GetStringFromName("launchProfile"))); document.l10n.setAttributes(runButton, "profiles-launch-profile");
runButton.onclick = function() { runButton.onclick = function() {
openProfile(profileData.profile); openProfile(profileData.profile);
}; };
...@@ -221,10 +211,13 @@ function createProfileWizard() { ...@@ -221,10 +211,13 @@ function createProfileWizard() {
ProfileService); ProfileService);
} }
function renameProfile(profile) { async function renameProfile(profile) {
let title = bundle.GetStringFromName("renameProfileTitle");
let msg = bundle.formatStringFromName("renameProfile", [profile.name], 1);
let newName = { value: profile.name }; let newName = { value: profile.name };
let [title, msg] = await document.l10n.formatValues([
{ id: "profiles-rename-profile-title" },
{ id: "profiles-rename-profile", args: { name: profile.name } },
]);
if (Services.prompt.prompt(window, title, msg, newName, null, if (Services.prompt.prompt(window, title, msg, newName, null,
{ value: 0 })) { { value: 0 })) {
...@@ -237,8 +230,11 @@ function renameProfile(profile) { ...@@ -237,8 +230,11 @@ function renameProfile(profile) {
try { try {
profile.name = newName; profile.name = newName;
} catch (e) { } catch (e) {
let title = bundle.GetStringFromName("invalidProfileNameTitle"); let [title, msg] = await document.l10n.formatValues([
let msg = bundle.formatStringFromName("invalidProfileName", [newName], 1); { id: "profiles-invalid-profile-name-title" },
{ id: "profiles-invalid-profile-name", args: { name: newName } },
]);
Services.prompt.alert(window, title, msg); Services.prompt.alert(window, title, msg);
return; return;
} }
...@@ -248,21 +244,23 @@ function renameProfile(profile) { ...@@ -248,21 +244,23 @@ function renameProfile(profile) {
} }
} }
function removeProfile(profile) { async function removeProfile(profile) {
let deleteFiles = false; let deleteFiles = false;
if (profile.rootDir.exists()) { if (profile.rootDir.exists()) {
let title = bundle.GetStringFromName("deleteProfileTitle"); let [title, msg, dontDeleteStr, deleteStr] = await document.l10n.formatValues([
let msg = bundle.formatStringFromName("deleteProfileConfirm", { id: "profiles-delete-profile-title" },
[profile.rootDir.path], 1); { id: "profiles-delete-profile-confirm", args: { dir: profile.rootDir.path } },
{ id: "profiles-dont-delete-files" },
{ id: "profiles-delete-files" },
]);
let buttonPressed = Services.prompt.confirmEx(window, title, msg, let buttonPressed = Services.prompt.confirmEx(window, title, msg,
(Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0) + (Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0) +
(Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1) + (Services.prompt.BUTTON_TITLE_CANCEL * Services.prompt.BUTTON_POS_1) +
(Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_2), (Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_2),
bundle.GetStringFromName("dontDeleteFiles"), dontDeleteStr,
null, null,
bundle.GetStringFromName("deleteFiles"), deleteStr,
null, {value: 0}); null, {value: 0});
if (buttonPressed == 1) { if (buttonPressed == 1) {
return; return;
...@@ -306,8 +304,11 @@ function removeProfile(profile) { ...@@ -306,8 +304,11 @@ function removeProfile(profile) {
try { try {
profile.removeInBackground(deleteFiles); profile.removeInBackground(deleteFiles);
} catch (e) { } catch (e) {
let title = bundle.GetStringFromName("deleteProfileFailedTitle"); let [title, msg] = await document.l10n.formatValues([
let msg = bundle.GetStringFromName("deleteProfileFailedMessage"); { id: "profiles-delete-profile-failed-title" },
{ id: "profiles-delete-profile-failed-message" },
]);
Services.prompt.alert(window, title, msg); Services.prompt.alert(window, title, msg);
return; return;
} }
......
...@@ -4,32 +4,28 @@ ...@@ -4,32 +4,28 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --> - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<!DOCTYPE html [ <!DOCTYPE html>
<!ENTITY % htmlDTD PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> %htmlDTD;
<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd"> %globalDTD;
<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd"> %brandDTD;
<!ENTITY % profilesDTD SYSTEM "chrome://global/locale/aboutProfiles.dtd"> %profilesDTD;
]>
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<title>&aboutProfiles.title;</title> <title data-l10n-id="profiles-title"></title>
<link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/> <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png" />
<link rel="stylesheet" href="chrome://mozapps/skin/aboutProfiles.css" type="text/css" /> <link rel="stylesheet" href="chrome://mozapps/skin/aboutProfiles.css" type="text/css" />
<script type="application/javascript" src="chrome://global/content/aboutProfiles.js" /> <script type="application/javascript" src="chrome://global/content/aboutProfiles.js" />
</head> <link rel="localization" href="toolkit/about/aboutProfiles.ftl" />
<body id="body" dir="&locale.dir;" class="wide-container"> </head>
<body id="body" class="wide-container">
<div id="action-box" class="notice-box"> <div id="action-box" class="notice-box">
<h3>&aboutProfiles.restart.title;</h3> <h3 data-l10n-id="profiles-restart-title"></h3>
<button id="restart-in-safe-mode-button">&aboutProfiles.restart.inSafeMode;</button> <button id="restart-in-safe-mode-button" data-l10n-id="profiles-restart-in-safe-mode"></button>
<button id="restart-button">&aboutProfiles.restart.normal;</button> <button id="restart-button" data-l10n-id="profiles-restart-normal"></button>
</div> </div>
<h1>&aboutProfiles.title;</h1> <h1 data-l10n-id="profiles-title"></h1>
<div class="page-subtitle">&aboutProfiles.subtitle;</div> <div data-l10n-id="profiles-subtitle"></div>
<div> <div>
<button id="create-button">&aboutProfiles.create;</button> <button id="create-button" data-l10n-id="profiles-create"></button>
</div> </div>
<div id="profiles" class="tab"></div> <div id="profiles" class="tab"></div>
......
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- 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/. -->
<!ENTITY aboutProfiles.title "About Profiles">
<!ENTITY aboutProfiles.subtitle "This page helps you to manage your profiles. Each profile is a separate world which contains separate history, bookmarks, settings and add-ons.">
<!ENTITY aboutProfiles.create "Create a New Profile">
<!ENTITY aboutProfiles.restart.title "Restart">
<!ENTITY aboutProfiles.restart.inSafeMode "Restart with Add-ons Disabled…">
<!ENTITY aboutProfiles.restart.normal "Restart normally…">
# This Source Code Form is subject to the terms of the Mozilla Public
# 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/.
name = Profile: %S
isDefault = Default Profile
rootDir = Root Directory
# LOCALIZATION NOTE: localDir is used to show the directory corresponding to
# the main profile directory that exists for the purpose of storing data on the
# local filesystem, including cache files or other data files that may not
# represent critical user data. (e.g., this directory may not be included as
# part of a backup scheme.)
# In case localDir and rootDir are equal, localDir is not shown.
localDir = Local Directory
currentProfile = This is the profile in use and it cannot be deleted.
inUseProfile = This profile is in use in another application and it cannot be deleted.
rename = Rename
remove = Remove
setAsDefault = Set as default profile
launchProfile = Launch profile in new browser
yes = yes
no = no
renameProfileTitle = Rename Profile
renameProfile = Rename profile %S
invalidProfileNameTitle = Invalid profile name
invalidProfileName = The profile name “%S” is not allowed.
deleteProfileTitle = Delete Profile
deleteProfileConfirm = Deleting a profile will remove the profile from the list of available profiles and cannot be undone.\nYou may also choose to delete the profile data files, including your settings, certificates and other user-related data. This option will delete the folder “%S” and cannot be undone.\nWould you like to delete the profile data files?
deleteFiles = Delete Files
dontDeleteFiles = Don’t Delete Files
deleteProfileFailedTitle = Error
deleteProfileFailedMessage = There was an error while attempting to delete this profile.
openDir = Open Directory
# LOCALIZATION NOTE (macOpenDir): This is the Mac-specific variant of openDir.
# This allows us to use the preferred"Finder" terminology on Mac.
macOpenDir = Show in Finder
# LOCALIZATION NOTE (winOpenDir2): This is the Windows-specific variant of
# openDir.
winOpenDir2 = Open Folder
# This Source Code Form is subject to the terms of the Mozilla Public
# 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/.
profiles-title = About Profiles
profiles-subtitle = This page helps you to manage your profiles. Each profile is a separate world which contains separate history, bookmarks, settings and add-ons.
profiles-create = Create a New Profile
profiles-restart-title = Restart
profiles-restart-in-safe-mode = Restart with Add-ons Disabled…
profiles-restart-normal = Restart normally…
# Variables:
# $name (String) - Name of the profile
profiles-name = Profile: { $name }
profiles-is-default = Default Profile
profiles-rootdir = Root Directory
# localDir is used to show the directory corresponding to
# the main profile directory that exists for the purpose of storing data on the
# local filesystem, including cache files or other data files that may not
# represent critical user data. (e.g., this directory may not be included as
# part of a backup scheme.)
# In case localDir and rootDir are equal, localDir is not shown.
profiles-localdir = Local Directory
profiles-current-profile = This is the profile in use and it cannot be deleted.
profiles-in-use-profile = This profile is in use in another application and it cannot be deleted.
profiles-rename = Rename
profiles-remove = Remove
profiles-set-as-default = Set as default profile
profiles-launch-profile = Launch profile in new browser
profiles-yes = yes
profiles-no = no
profiles-rename-profile-title = Rename Profile
# Variables:
# $name (String) - Name of the profile
profiles-rename-profile = Rename profile { $name }
profiles-invalid-profile-name-title = Invalid profile name
# Variables:
# $name (String) - Name of the profile
profiles-invalid-profile-name = The profile name “{ $name }” is not allowed.
profiles-delete-profile-title = Delete Profile
# Variables:
# $dir (String) - Path to be displayed
profiles-delete-profile-confirm =
Deleting a profile will remove the profile from the list of available profiles and cannot be undone.
You may also choose to delete the profile data files, including your settings, certificates and other user-related data. This option will delete the folder “{ $dir }” and cannot be undone.
Would you like to delete the profile data files?
profiles-delete-files = Delete Files
profiles-dont-delete-files = Don’t Delete Files
profiles-delete-profile-failed-title = Error
profiles-delete-profile-failed-message = There was an error while attempting to delete this profile.
profiles-opendir =
{ PLATFORM() ->
[macos] Show in Finder
[windows] Open Folder
*[other] Open Directory
}
...@@ -13,10 +13,6 @@ ...@@ -13,10 +13,6 @@
locale/@AB_CD@/global/aboutReader.properties (%chrome/global/aboutReader.properties) locale/@AB_CD@/global/aboutReader.properties (%chrome/global/aboutReader.properties)
locale/@AB_CD@/global/aboutRights.dtd (%chrome/global/aboutRights.dtd) locale/@AB_CD@/global/aboutRights.dtd (%chrome/global/aboutRights.dtd)
locale/@AB_CD@/global/aboutNetworking.dtd (%chrome/global/aboutNetworking.dtd) locale/@AB_CD@/global/aboutNetworking.dtd (%chrome/global/aboutNetworking.dtd)
#ifndef ANDROID
locale/@AB_CD@/global/aboutProfiles.dtd (%chrome/global/aboutProfiles.dtd)
locale/@AB_CD@/global/aboutProfiles.properties (%chrome/global/aboutProfiles.properties)
#endif
locale/@AB_CD@/global/aboutStudies.properties (%chrome/global/aboutStudies.properties) locale/@AB_CD@/global/aboutStudies.properties (%chrome/global/aboutStudies.properties)
locale/@AB_CD@/global/aboutServiceWorkers.dtd (%chrome/global/aboutServiceWorkers.dtd) locale/@AB_CD@/global/aboutServiceWorkers.dtd (%chrome/global/aboutServiceWorkers.dtd)
locale/@AB_CD@/global/aboutServiceWorkers.properties (%chrome/global/aboutServiceWorkers.properties) locale/@AB_CD@/global/aboutServiceWorkers.properties (%chrome/global/aboutServiceWorkers.properties)
......
...@@ -14,6 +14,10 @@ button { ...@@ -14,6 +14,10 @@ button {
padding: 3px; padding: 3px;
} }
.opendir {
margin-inline-start: 3px;
}
#action-box { #action-box {
float: right; float: right;
margin-top: 2em; margin-top: 2em;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment