diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3bd0e581d..6977bfe8c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -514,6 +514,13 @@ jobs:
run: |
bash scripts/mar_sign.sh -s
+ - name: Verify MARs and update manifests
+ env:
+ SIGNMAR: ${{ github.workspace }}/linux-bin-x86_64/signmar
+ RELEASE_BRANCH: ${{ inputs.update_branch }}
+ run: |
+ bash scripts/mar_verify.sh
+
- name: Copy update manifests
env:
RELEASE_BRANCH: ${{ inputs.update_branch }}
diff --git a/.github/workflows/linux-release-build.yml b/.github/workflows/linux-release-build.yml
index 2fba0e880..5e5a32bff 100644
--- a/.github/workflows/linux-release-build.yml
+++ b/.github/workflows/linux-release-build.yml
@@ -34,7 +34,6 @@ jobs:
env:
SCCACHE_GHA_ENABLED: ${{ inputs.use-sccache && 'true' || 'false' }}
CARGO_TERM_COLOR: always
- RUSTC_WRAPPER: ${{ inputs.use-sccache && 'sccache' || '' }}
CARGO_INCREMENTAL: 0
name: Build Linux - ${{ matrix.arch }}
@@ -104,6 +103,8 @@ jobs:
- name: Import
env:
SURFER_COMPAT: ${{ matrix.arch }}
+ SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }}
+ SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }}
run: |
. "$HOME/.cargo/env"
npm run import
@@ -118,15 +119,45 @@ jobs:
./mach --no-interactive bootstrap --application-choice browser
cd ..
- - name: Insert API Keys
+ - name: Build (PGO stage 1 - generate)
+ if: ${{ matrix.arch == 'x86_64' }}
+ env:
+ SURFER_COMPAT: ${{ matrix.arch }}
+ ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
+ ZEN_GA_GENERATE_PROFILE: 1
+ ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }}
+ ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }}
+ ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }}
+ continue-on-error: true
run: |
- mkdir -p ~/.zen-keys
- echo "${{ secrets.ZEN_SAFEBROWSING_API_KEY }}" > ~/.zen-keys/safebrowsing.dat
+ export SURFER_PLATFORM="linux"
+ if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
+ export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
+ fi
+ bash .github/workflows/src/release-build.sh
+
+ - name: Generate PGO profile data
+ if: ${{ matrix.arch == 'x86_64' }}
+ run: |
+ set -x
+ export DISPLAY=:2
+ export LLVM_PROFDATA="$HOME/.mozbuild/clang/bin/llvm-profdata"
+ export JARLOG_FILE=en-US.log
+ mkdir -p "$HOME/artifact"
+ cd engine
+ ./mach python ../scripts/download_pgo_extended_corpus.py
+ ./mach package
+ ./mach python build/pgo/profileserver.py --extended-corpus ./pgo-extended-corpus
+ mv merged.profdata "$HOME/artifact/merged.profdata"
+ mv en-US.log "$HOME/artifact/en-US.log"
- name: Build
env:
SURFER_COMPAT: ${{ matrix.arch }}
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
+ ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }}
+ ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }}
+ ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }}
continue-on-error: true
run: |
export SURFER_PLATFORM="linux"
@@ -144,10 +175,6 @@ jobs:
export ZEN_RELEASE=1
npm run package
- - name: Remove API Keys
- run: |
- rm -rf ~/.zen-keys
-
- name: Rename artifacts
run: |
mv dist/zen-*.tar.xz "zen.linux-${{ matrix.arch }}.tar.xz"
diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml
index ccfeacf39..66f2789f0 100644
--- a/.github/workflows/macos-release-build.yml
+++ b/.github/workflows/macos-release-build.yml
@@ -26,7 +26,7 @@ on:
jobs:
mac-build:
name: Build macOS - ${{ matrix.arch }}
- runs-on: macos-26
+ runs-on: ${{ (inputs.release-branch == 'release') && 'blacksmith-6vcpu-macos-latest' || 'macos-26' }}
strategy:
fail-fast: false
@@ -35,7 +35,6 @@ jobs:
env:
SCCACHE_GHA_ENABLED: ${{ inputs.use-sccache && 'true' || 'false' }}
CARGO_TERM_COLOR: always
- RUSTC_WRAPPER: ${{ inputs.use-sccache && 'sccache' || '' }}
CARGO_INCREMENTAL: 0
steps:
- name: Checkout repository
@@ -118,7 +117,9 @@ jobs:
- name: Import
env:
SURFER_COMPAT: ${{ matrix.arch }}
- run: npm run import -- --verbose
+ SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }}
+ SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }}
+ run: npm run import
- name: Bootstrap
run: |
@@ -132,15 +133,43 @@ jobs:
- name: Build language packs
run: sh scripts/download-language-packs.sh
- - name: Insert API Keys
+ - name: Build Zen (PGO stage 1 - generate)
+ env:
+ SURFER_COMPAT: ${{ matrix.arch }}
+ ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
+ ZEN_GA_GENERATE_PROFILE: 1
+ ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }}
+ ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }}
+ ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }}
run: |
- mkdir -p ~/.zen-keys
- echo "${{ secrets.ZEN_SAFEBROWSING_API_KEY }}" > ~/.zen-keys/safebrowsing.dat
+ export SURFER_PLATFORM="darwin"
+ if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
+ export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
+ fi
+ bash .github/workflows/src/release-build.sh
+
+ - name: Generate PGO profile data
+ env:
+ SURFER_COMPAT: ${{ matrix.arch }}
+ run: |
+ set -x
+ export LLVM_PROFDATA="$HOME/.mozbuild/clang/bin/llvm-profdata"
+ export JARLOG_FILE=en-US.log
+ mkdir -p "$HOME/artifact"
+ cd engine
+ ./mach python ../scripts/download_pgo_extended_corpus.py
+ ./mach package
+ ./mach python build/pgo/profileserver.py --extended-corpus ./pgo-extended-corpus
+ mv merged.profdata "$HOME/artifact/merged.profdata"
+ mv en-US.log "$HOME/artifact/en-US.log"
- name: Build Zen
env:
SURFER_COMPAT: ${{ matrix.arch }}
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
+ ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }}
+ ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }}
+ ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }}
run: |
export SURFER_PLATFORM="darwin"
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
@@ -157,10 +186,6 @@ jobs:
export ZEN_RELEASE=1
npm run package
- - name: Remove API Keys
- run: |
- rm -rf ~/.zen-keys
-
- name: Rename artifacts
run: |
echo "Tarballing DMG"
diff --git a/.github/workflows/macos-universal-release-build.yml b/.github/workflows/macos-universal-release-build.yml
index dbc2130f0..b4fea39a0 100644
--- a/.github/workflows/macos-universal-release-build.yml
+++ b/.github/workflows/macos-universal-release-build.yml
@@ -93,6 +93,7 @@ jobs:
env:
SURFER_MOZCONFIG_ONLY: true
ZEN_RELEASE: 1
+ ZEN_GA_DISABLE_PGO: true
run: |
npm run build
cd engine
@@ -232,6 +233,7 @@ jobs:
- name: Package for mar
env:
JUST_MAR: true
+ ZEN_GA_DISABLE_PGO: true
run: |
# we don't need it anymore
set -ex
diff --git a/.github/workflows/src/release-build.sh b/.github/workflows/src/release-build.sh
index 7b2a5b034..fbccedce2 100644
--- a/.github/workflows/src/release-build.sh
+++ b/.github/workflows/src/release-build.sh
@@ -8,6 +8,11 @@ if command -v apt-get &> /dev/null; then
sudo apt-get install -y xvfb libnvidia-egl-wayland1 mesa-utils libgl1-mesa-dri
fi
+mkdir -p ~/.zen-keys
+echo "$ZEN_SAFEBROWSING_API_KEY" > ~/.zen-keys/safebrowsing.dat
+echo "$ZEN_MOZILLA_API_KEY" > ~/.zen-keys/mozilla.dat
+echo "$ZEN_GOOGLE_LOCATION_SERVICE_API_KEY" > ~/.zen-keys/google_location_service.dat
+
. $HOME/.cargo/env
bash ./scripts/mar_sign.sh -i
@@ -30,3 +35,6 @@ else
export ZEN_RELEASE=1
npm run build
fi
+
+echo "Build complete, removing API keys"
+rm -rf ~/.zen-keys
diff --git a/.github/workflows/twilight-release-schedule.yml b/.github/workflows/twilight-release-schedule.yml
index de9e3ff1e..5b50f55c3 100644
--- a/.github/workflows/twilight-release-schedule.yml
+++ b/.github/workflows/twilight-release-schedule.yml
@@ -20,7 +20,7 @@ jobs:
with:
create_release: ${{ github.event_name != 'workflow_dispatch' && true || inputs.create_release }}
update_branch: twilight
- use-sccache: false
+ use-sccache: true
update_version: false
post-build:
diff --git a/.github/workflows/windows-profile-build.yml b/.github/workflows/windows-profile-build.yml
index 740c5fd3f..0984f2d37 100644
--- a/.github/workflows/windows-profile-build.yml
+++ b/.github/workflows/windows-profile-build.yml
@@ -93,7 +93,8 @@ jobs:
echo "cd $workspace_dir" '' >> mozilla-build-run.sh
echo 'export PATH=/c/mozilla-build/msys2/usr/bin:$PATH' '' >> mozilla-build-run.sh
echo './mach --no-interactive bootstrap --application-choice browser' '' >> mozilla-build-run.sh
- echo 'LLVM_PROFDATA=/c/Users/runneradmin/.mozbuild/clang/bin/llvm-profdata.exe JARLOG_FILE=en-US.log ./mach python build/pgo/profileserver.py --binary /c/artifact/zen/zen.exe' '' >> mozilla-build-run.sh
+ echo './mach python ../scripts/download_pgo_extended_corpus.py' '' >> mozilla-build-run.sh
+ echo 'LLVM_PROFDATA=/c/Users/runneradmin/.mozbuild/clang/bin/llvm-profdata.exe JARLOG_FILE=en-US.log ./mach python build/pgo/profileserver.py --binary /c/artifact/zen/zen.exe --extended-corpus ./pgo-extended-corpus --' '' >> mozilla-build-run.sh
C:\mozilla-build\start-shell.bat $workspace_dir_current\mozilla-build-run.sh
- name: Move profile data
diff --git a/.github/workflows/windows-release-build.yml b/.github/workflows/windows-release-build.yml
index 10c1da6d3..d2570dbfd 100644
--- a/.github/workflows/windows-release-build.yml
+++ b/.github/workflows/windows-release-build.yml
@@ -39,7 +39,6 @@ jobs:
env:
SCCACHE_GHA_ENABLED: ${{ inputs.use-sccache && 'true' || 'false' }}
CARGO_TERM_COLOR: always
- RUSTC_WRAPPER: ${{ inputs.use-sccache && 'sccache' || '' }}
CARGO_INCREMENTAL: 0
strategy:
fail-fast: false
@@ -165,6 +164,8 @@ jobs:
if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }}
env:
SURFER_COMPAT: ${{ matrix.arch }}
+ SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }}
+ SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }}
run: |
. "$HOME/.cargo/env"
npm run import -- --verbose
@@ -226,16 +227,14 @@ jobs:
chmod +x ~/artifact/en-US.log
chmod +x ~/artifact/merged.profdata
- - name: Insert API Keys
- run: |
- mkdir -p ~/.zen-keys
- echo "${{ secrets.ZEN_SAFEBROWSING_API_KEY }}" > ~/.zen-keys/safebrowsing.dat
-
- name: Build
if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }}
env:
SURFER_COMPAT: ${{ matrix.arch }}
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
+ ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }}
+ ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }}
+ ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }}
run: |
set -x
dos2unix configs/windows/mozconfig
@@ -264,10 +263,6 @@ jobs:
ls ./dist
ls .
- - name: Remove API Keys
- run: |
- rm -rf ~/.zen-keys
-
- name: Move package for PGO upload
if: ${{ inputs.generate-gpo && matrix.arch == 'x86_64' }}
run: |
diff --git a/README.md b/README.md
index f92956ab3..26e5634e7 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,7 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne
### Firefox Versions
-- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `149.0.2`! 🚀
+- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `150.0`! 🚀
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 150.0`!
### Contributing
diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash
index 901736b71..fc5481288 100644
--- a/build/firefox-cache/l10n-last-commit-hash
+++ b/build/firefox-cache/l10n-last-commit-hash
@@ -1 +1 @@
-11d1ba8e182db855a1aba82796e219c2abe8c3ac
\ No newline at end of file
+fb55808f9cdd2172649e551705008af4f98038fe
\ No newline at end of file
diff --git a/build/signing/public_key.der b/build/signing/public_key.der
index 689941690..733d57508 100644
Binary files a/build/signing/public_key.der and b/build/signing/public_key.der differ
diff --git a/build/windows/sign.ps1 b/build/windows/sign.ps1
index 2c935d776..b9301141c 100644
--- a/build/windows/sign.ps1
+++ b/build/windows/sign.ps1
@@ -4,6 +4,7 @@
param(
[string][Parameter(Mandatory=$true)]$SignIdentity,
+ [string][Parameter(Mandatory=$true)]$SignIdentityIssuer,
[string][Parameter(Mandatory=$true)]$GithubRunId
)
@@ -26,6 +27,9 @@ mkdir windsign-temp -ErrorAction SilentlyContinue
$env:SURFER_MOZCONFIG_ONLY="1"
$env:SURFER_SIGNING_MODE=""
+$env:SURFER_CERT_PATCH_ISSUER=$SignIdentityIssuer
+$env:SURFER_CERT_PATCH_NAME=$SignIdentity
+
Start-Job -Name "DownloadGitl10n" -ScriptBlock {
param($PWD)
cd $PWD
diff --git a/configs/common/mozconfig b/configs/common/mozconfig
index a93df9072..22b8e95c5 100644
--- a/configs/common/mozconfig
+++ b/configs/common/mozconfig
@@ -26,24 +26,33 @@ export MOZ_INCLUDE_SOURCE_INFO=1
ac_add_options --enable-application=browser
-# Anything except 'SCCACHE_GHA_ENABLED == false'
-if ! test "$SCCACHE_GHA_ENABLED" = "false"; then
+if test "$SCCACHE_GHA_ENABLED" = "true"; then
if test -x "$(command -v sccache)"; then
ac_add_options --with-ccache=sccache
elif test -f "$HOME/.mozbuild/sccache/sccache"; then
ac_add_options --with-ccache="$HOME"/.mozbuild/sccache/sccache
fi
+
+ mk_add_options 'export RUSTC_WRAPPER=sccache'
+ mk_add_options 'export CCACHE_CPP2=yes'
fi
-# add safe browsing key if it exists on a file
+# add API keys if it exists on a file
if test -f "$HOME/.zen-keys/safebrowsing.dat"; then
ac_add_options --with-google-safebrowsing-api-keyfile="$HOME/.zen-keys/safebrowsing.dat"
fi
+if test -f "$HOME/.zen-keys/mozilla.dat"; then
+ ac_add_options --with-mozilla-api-keyfile="$HOME/.zen-keys/mozilla.dat"
+fi
+
+if test -f "$HOME/.zen-keys/google_location_service.dat"; then
+ ac_add_options --with-google-location-service-api-keyfile="$HOME/.zen-keys/google_location_service.dat"
+fi
+
if test "$ZEN_RELEASE"; then
- # TODO: Make this successful in builds
- # ac_add_options --enable-clang-plugin
+ ac_add_options --enable-clang-plugin
ac_add_options --enable-bootstrap=-sccache
ac_add_options --enable-optimize
diff --git a/configs/linux/mozconfig b/configs/linux/mozconfig
index b15dcd399..9816e7580 100644
--- a/configs/linux/mozconfig
+++ b/configs/linux/mozconfig
@@ -18,8 +18,14 @@ if test "$ZEN_RELEASE"; then
# Enable Profile Guided Optimization
if ! test "$ZEN_GA_DISABLE_PGO"; then
- export MOZ_PGO=1
- ac_add_options MOZ_PGO=1
+ if test "$ZEN_GA_GENERATE_PROFILE"; then
+ mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0"
+ ac_add_options --enable-profile-generate=cross
+ else
+ ac_add_options --enable-profile-use=cross
+ ac_add_options --with-pgo-profile-path="$(echo ~)/artifact/merged.profdata"
+ ac_add_options --with-pgo-jarlog="$(echo ~)/artifact/en-US.log"
+ fi
fi
elif test "$SURFER_COMPAT" = "aarch64"; then
ac_add_options --target=aarch64-linux-gnu
diff --git a/configs/macos/mozconfig b/configs/macos/mozconfig
index 317f6b4e8..a4c359bc0 100644
--- a/configs/macos/mozconfig
+++ b/configs/macos/mozconfig
@@ -8,18 +8,15 @@ ac_add_options --disable-dmd
ac_add_options --enable-eme=widevine
if test "$ZEN_RELEASE"; then
- # override LTO settings
- # TODO: Dont use LTO for now, it's causing a lot of issues
- export MOZ_LTO=cross,thin
- ac_add_options --enable-lto=cross,thin
-fi
-
-if test "$ZEN_RELEASE"; then
- if test "$ZEN_GA_DISABLE_PGO"; then
- export ZEN_DUMMY=1
- else
- export MOZ_PGO=1
- ac_add_options MOZ_PGO=1
+ if ! test "$ZEN_GA_DISABLE_PGO"; then
+ if test "$ZEN_GA_GENERATE_PROFILE"; then
+ mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0"
+ ac_add_options --enable-profile-generate=cross
+ else
+ ac_add_options --enable-profile-use=cross
+ ac_add_options --with-pgo-profile-path="$(echo ~)/artifact/merged.profdata"
+ ac_add_options --with-pgo-jarlog="$(echo ~)/artifact/en-US.log"
+ fi
fi
fi
@@ -28,9 +25,12 @@ if test "$SURFER_COMPAT" = "x86_64"; then
if test "$ZEN_RELEASE"; then
ac_add_options --enable-wasm-avx
+
+ # override LTO settings
+ export MOZ_LTO=cross,thin
+ ac_add_options --enable-lto=cross,thin
fi
else
- ac_add_options --enable-clang-plugin
ac_add_options --target=aarch64-apple-darwin
if test "$ZEN_RELEASE"; then
diff --git a/configs/windows/mozconfig b/configs/windows/mozconfig
index 9290c08bc..065ed1291 100644
--- a/configs/windows/mozconfig
+++ b/configs/windows/mozconfig
@@ -22,10 +22,6 @@ if test "$ZEN_CROSS_COMPILING"; then
fi
fi
-# We wrongly detect ccache on windows, which leads to build failures.
-# This line should be removed once the detection is fixed.
-ac_add_options --without-ccache
-
if test "$SURFER_COMPAT" = "x86_64"; then
ac_add_options --target=x86_64-pc-windows-msvc
ac_add_options --enable-eme=widevine,wmfcdm
diff --git a/locales/ar/browser/browser/preferences/zen-preferences.ftl b/locales/ar/browser/browser/preferences/zen-preferences.ftl
index 14e96263f..c8d4332a5 100644
--- a/locales/ar/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ar/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = قلب DOM
zen-devtools-toggle-accessibility-shortcut = قلب إمكانية الوصول
zen-close-all-unpinned-tabs-shortcut = إغلاق جميع علامات التبويب الغير مثبتة
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/ar/browser/browser/zen-general.ftl b/locales/ar/browser/browser/zen-general.ftl
index 997a14a2b..688288f1b 100644
--- a/locales/ar/browser/browser/zen-general.ftl
+++ b/locales/ar/browser/browser/zen-general.ftl
@@ -52,6 +52,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL.
zen-tabs-renamed = تم تغيير اسم التبويب بنجاح!
zen-background-tab-opened-toast = تم فتح علامة تبويب خلفية جديدة!
zen-workspace-renamed-toast = تم تغيير اسم مساحة العمل بنجاح!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = الوضع المدمج
.tooltiptext = تبديل الوضع المدمج
diff --git a/locales/ar/browser/browser/zen-split-view.ftl b/locales/ar/browser/browser/zen-split-view.ftl
index 6539c2f0b..281cc5cfd 100644
--- a/locales/ar/browser/browser/zen-split-view.ftl
+++ b/locales/ar/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] تبويب تقسيم (عدة علامات تبويب محددة مطلوبة)
- *[other] تقسيم { $tabCount } علامات التبويب
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = س
zen-split-link =
diff --git a/locales/ar/browser/browser/zen-vertical-tabs.ftl b/locales/ar/browser/browser/zen-vertical-tabs.ftl
index 47898b5db..ab6a38a17 100644
--- a/locales/ar/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ar/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = إخفاء كليهما
.accesskey = خ
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = مجلّد جديد
.accesskey = ن
diff --git a/locales/bg/browser/browser/preferences/zen-preferences.ftl b/locales/bg/browser/browser/preferences/zen-preferences.ftl
index da9d313b4..ed26f72b8 100644
--- a/locales/bg/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/bg/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/bg/browser/browser/zen-general.ftl b/locales/bg/browser/browser/zen-general.ftl
index ead213776..3e7defe97 100644
--- a/locales/bg/browser/browser/zen-general.ftl
+++ b/locales/bg/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Адресът на закачения раздел б
zen-tabs-renamed = Разделът беше успешно преименуван!
zen-background-tab-opened-toast = Отворен е нов раздел на заден план!
zen-workspace-renamed-toast = Работното пространство беше преименувано успешно!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Компактен изглед
.tooltiptext = Превключи компактен режим
diff --git a/locales/bg/browser/browser/zen-split-view.ftl b/locales/bg/browser/browser/zen-split-view.ftl
index 8fbcd79c2..e09ec8107 100644
--- a/locales/bg/browser/browser/zen-split-view.ftl
+++ b/locales/bg/browser/browser/zen-split-view.ftl
@@ -5,7 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Join Tab (multiple selected tabs needed)
+ [-1] Split out tab
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/bg/browser/browser/zen-vertical-tabs.ftl b/locales/bg/browser/browser/zen-vertical-tabs.ftl
index ff8a3775c..9989c7666 100644
--- a/locales/bg/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/bg/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Hide both
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = New Folder
.accesskey = N
diff --git a/locales/bs/browser/browser/preferences/zen-preferences.ftl b/locales/bs/browser/browser/preferences/zen-preferences.ftl
index da9d313b4..ed26f72b8 100644
--- a/locales/bs/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/bs/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/bs/browser/browser/zen-general.ftl b/locales/bs/browser/browser/zen-general.ftl
index 21d9a7475..709b4575f 100644
--- a/locales/bs/browser/browser/zen-general.ftl
+++ b/locales/bs/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL!
zen-tabs-renamed = Tab has been successfully renamed!
zen-background-tab-opened-toast = New background tab opened!
zen-workspace-renamed-toast = Workspace has been successfully renamed!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Compact Mode
.tooltiptext = Toggle Compact Mode
diff --git a/locales/bs/browser/browser/zen-split-view.ftl b/locales/bs/browser/browser/zen-split-view.ftl
index 743688eed..4430fab34 100644
--- a/locales/bs/browser/browser/zen-split-view.ftl
+++ b/locales/bs/browser/browser/zen-split-view.ftl
@@ -5,7 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Join Tab (multiple selected tabs needed)
+ [-1] Split out tab
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/bs/browser/browser/zen-vertical-tabs.ftl b/locales/bs/browser/browser/zen-vertical-tabs.ftl
index ff8a3775c..9989c7666 100644
--- a/locales/bs/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/bs/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Hide both
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = New Folder
.accesskey = N
diff --git a/locales/ca/browser/browser/preferences/zen-preferences.ftl b/locales/ca/browser/browser/preferences/zen-preferences.ftl
index 0c7d866c6..4b9b2c758 100644
--- a/locales/ca/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ca/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Commuta el DOM
zen-devtools-toggle-accessibility-shortcut = Commuta l'accessibilitat
zen-close-all-unpinned-tabs-shortcut = Tanca totes les pestanyes no fixades
zen-new-unsynced-window-shortcut = Nova finestra en blanc
+zen-duplicate-tab-shortcut = Duplica la pestanya
diff --git a/locales/ca/browser/browser/zen-general.ftl b/locales/ca/browser/browser/zen-general.ftl
index e9a05a52a..d50b46e7c 100644
--- a/locales/ca/browser/browser/zen-general.ftl
+++ b/locales/ca/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = L'URL de la pestanya fixada s'ha substituït per l'URL
zen-tabs-renamed = S'ha canviat el nom de la pestanya correctament
zen-background-tab-opened-toast = S'ha obert una nova pestanya de fons
zen-workspace-renamed-toast = S'ha canviat el nom de l'espai de treball correctament
+zen-split-view-limit-toast = No es poden afegir més panells a la vista dividida!
zen-toggle-compact-mode-button =
.label = Mode compacte
.tooltiptext = Commuta el mode compacte
diff --git a/locales/ca/browser/browser/zen-split-view.ftl b/locales/ca/browser/browser/zen-split-view.ftl
index 52ba7b3e1..5a2953f5a 100644
--- a/locales/ca/browser/browser/zen-split-view.ftl
+++ b/locales/ca/browser/browser/zen-split-view.ftl
@@ -6,7 +6,7 @@ tab-zen-split-tabs =
.label =
{ $tabCount ->
[-1] Pestanya dividida
- [1] Uneix pestanyes (calen diverses pestanyes seleccionades)
+ [1] Afegeix una vista dividida...
*[other] Uneix { $tabCount } pestanyes
}
.accesskey = S
diff --git a/locales/ca/browser/browser/zen-vertical-tabs.ftl b/locales/ca/browser/browser/zen-vertical-tabs.ftl
index 868efd1b5..d8932f8a9 100644
--- a/locales/ca/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ca/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Amaga les dues
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Mou a la carpeta...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Carpeta nova
.accesskey = N
diff --git a/locales/cs/browser/browser/preferences/zen-preferences.ftl b/locales/cs/browser/browser/preferences/zen-preferences.ftl
index 1b46b53ff..fdacf7348 100644
--- a/locales/cs/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/cs/browser/browser/preferences/zen-preferences.ftl
@@ -43,11 +43,11 @@ category-zen-workspaces =
.tooltiptext = { pane-zen-tabs-title }
pane-settings-workspaces-title = Pracoviště
zen-tabs-select-recently-used-on-close =
- .label = When closing a tab, switch to the most recently used tab instead of the next tab
+ .label = Při zavření panelu přepnout na naposledy použitý panel namísto dalšího panelu
zen-tabs-close-on-back-with-no-history =
.label = Zavřít panel a přepnout na jeho nadřazený panel (nebo naposledy použitý panel), když se vracíte zpět bez historie
zen-settings-workspaces-sync-unpinned-tabs =
- .label = Sync only pinned tabs in workspaces
+ .label = Synchronizovat pouze připnuté panely v pracovních prostorách
zen-tabs-cycle-by-attribute =
.label = Ctrl+Tab zahrnuje Essentials v pracovních panelech
zen-tabs-cycle-ignore-pending-tabs =
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Přepnout DOM
zen-devtools-toggle-accessibility-shortcut = Přepnout přístupnost
zen-close-all-unpinned-tabs-shortcut = Zavřít všechny nepřipnuté panely
zen-new-unsynced-window-shortcut = Nové nesynchronizované okno
+zen-duplicate-tab-shortcut = Duplikovat panel
diff --git a/locales/cs/browser/browser/zen-general.ftl b/locales/cs/browser/browser/zen-general.ftl
index a7afe69a1..ca6132599 100644
--- a/locales/cs/browser/browser/zen-general.ftl
+++ b/locales/cs/browser/browser/zen-general.ftl
@@ -7,8 +7,8 @@ unified-extensions-description = Rozšíření slouží k přidání dalších f
tab-context-zen-reset-pinned-tab =
.label =
{ $isEssential ->
- [true] Reset Essential Tab
- *[false] Reset Pinned Tab
+ [true] Resetovat Essential panel
+ *[false] Resetovat připnutý panel
}
.accesskey = R
tab-context-zen-add-essential =
@@ -21,8 +21,8 @@ tab-context-zen-remove-essential =
tab-context-zen-replace-pinned-url-with-current =
.label =
{ $isEssential ->
- [true] Replace Essential URL with Current
- *[false] Replace Pinned URL with Current
+ [true] Nahradit Essential URL aktuální
+ *[false] Nahradit připnutou URL aktuální
}
.accesskey = C
tab-context-zen-edit-title =
@@ -41,7 +41,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimalizovat
zen-panel-ui-gradient-generator-custom-color = Vlastní barva
zen-copy-current-url-confirmation = URL adresa byla zkopírována!
-zen-copy-current-url-as-markdown-confirmation = Copied current URL as Markdown!
+zen-copy-current-url-as-markdown-confirmation = Kopírovat aktuální URL jako Markdown!
zen-general-cancel-label =
.label = Zrušit
zen-general-confirm =
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Připnutá URL adresa panelu byla nahrazena aktuální
zen-tabs-renamed = Panel byl úspěšně přejmenován!
zen-background-tab-opened-toast = Nový panel na pozadí byl otevřen!
zen-workspace-renamed-toast = Pracovní prostor byl úspěšně přejmenován!
+zen-split-view-limit-toast = Do rozděleného zobrazení nelze přidat více panelů!
zen-toggle-compact-mode-button =
.label = Kompaktní režim
.tooltiptext = Přepnout kompaktní režim
@@ -123,4 +124,4 @@ zen-window-sync-migration-dialog-message = Zen nyní synchronizuje okna na stejn
zen-window-sync-migration-dialog-learn-more = Zjistit více
zen-window-sync-migration-dialog-accept = Rozumím
zen-appmenu-new-blank-window =
- .label = New blank window
+ .label = Nové prázdné okno
diff --git a/locales/cs/browser/browser/zen-menubar.ftl b/locales/cs/browser/browser/zen-menubar.ftl
index 4f09f176f..738649024 100644
--- a/locales/cs/browser/browser/zen-menubar.ftl
+++ b/locales/cs/browser/browser/zen-menubar.ftl
@@ -19,4 +19,4 @@ zen-menubar-appearance-light =
zen-menubar-appearance-dark =
.label = Tmavý
zen-menubar-new-blank-window =
- .label = New Blank Window
+ .label = Nové prázdné okno
diff --git a/locales/cs/browser/browser/zen-split-view.ftl b/locales/cs/browser/browser/zen-split-view.ftl
index 8b807444f..c6f4f5e07 100644
--- a/locales/cs/browser/browser/zen-split-view.ftl
+++ b/locales/cs/browser/browser/zen-split-view.ftl
@@ -5,11 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Rozdělit kartu (je třeba více vybraných karet)
- [2] Rozdělit { $tabCount } karty
- [3] Rozdělit { $tabCount } karty
- [4] Rozdělit { $tabCount } karty
- *[other] Rozdělit { $tabCount } karet
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = S
zen-split-link =
diff --git a/locales/cs/browser/browser/zen-vertical-tabs.ftl b/locales/cs/browser/browser/zen-vertical-tabs.ftl
index a76c866a5..bfeae9159 100644
--- a/locales/cs/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/cs/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Skrýt obojí
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Přesunout do složky...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Nová složka
.accesskey = N
diff --git a/locales/cs/browser/browser/zen-workspaces.ftl b/locales/cs/browser/browser/zen-workspaces.ftl
index 140984833..529d3514c 100644
--- a/locales/cs/browser/browser/zen-workspaces.ftl
+++ b/locales/cs/browser/browser/zen-workspaces.ftl
@@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create =
zen-panel-ui-folder-create =
.label = Vytvořit složku
zen-panel-ui-live-folder-create =
- .label = Live Folder
+ .label = Živá složka
zen-panel-ui-new-empty-split =
.label = Nové rozdělení
zen-workspaces-panel-context-delete =
@@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile =
zen-workspaces-panel-unload =
.label = Uspat prostor
zen-workspaces-panel-unload-others =
- .label = Unload All Other Spaces
+ .label = Uvolnit všechny ostatní prostory
zen-workspaces-how-to-reorder-title = Jak změnit pořadí prostorů
zen-workspaces-how-to-reorder-desc = Pořadí prostorů změníte přetažením jejich ikon dole v postranním panelu
zen-workspaces-change-theme =
diff --git a/locales/cy/browser/browser/preferences/zen-preferences.ftl b/locales/cy/browser/browser/preferences/zen-preferences.ftl
index 541c1735c..080a9aa69 100644
--- a/locales/cy/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/cy/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toglo DOM
zen-devtools-toggle-accessibility-shortcut = Toglo Hygyrchedd
zen-close-all-unpinned-tabs-shortcut = Cau Pob Tab Heb ei Binio
zen-new-unsynced-window-shortcut = Ffenestr Wag Newydd
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/cy/browser/browser/zen-general.ftl b/locales/cy/browser/browser/zen-general.ftl
index 9b8202002..aa8a8074e 100644
--- a/locales/cy/browser/browser/zen-general.ftl
+++ b/locales/cy/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Mae URL y tab wedi'i binio wedi'i newid i'r URL gyfred
zen-tabs-renamed = Mae'r tab wedi cael ei ailenwi'n llwyddiannus!
zen-background-tab-opened-toast = Tab cefndir newydd wedi'i agor!
zen-workspace-renamed-toast = Mae'r Man Gwaith wedi cael ei ailenwi'n llwyddiannus!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Modd Cryno
.tooltiptext = Togglo Modd Cryno
diff --git a/locales/cy/browser/browser/zen-split-view.ftl b/locales/cy/browser/browser/zen-split-view.ftl
index 2c1ac6ee6..e0aa8889e 100644
--- a/locales/cy/browser/browser/zen-split-view.ftl
+++ b/locales/cy/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Tab Hollt (angen sawl tab wedi'u dewis)
- *[other] Hollti { $tabCount } Tab
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = H
zen-split-link =
diff --git a/locales/cy/browser/browser/zen-vertical-tabs.ftl b/locales/cy/browser/browser/zen-vertical-tabs.ftl
index 27fb40f5c..688e6aa86 100644
--- a/locales/cy/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/cy/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Cuddio'r ddau
.accesskey = C
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Ffolder Newydd
.accesskey = N
diff --git a/locales/da/browser/browser/preferences/zen-preferences.ftl b/locales/da/browser/browser/preferences/zen-preferences.ftl
index 8d0f4e290..c710dc69c 100644
--- a/locales/da/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/da/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Vis/skjul DOM
zen-devtools-toggle-accessibility-shortcut = Vis/skjul Tilgængelighed
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/da/browser/browser/zen-general.ftl b/locales/da/browser/browser/zen-general.ftl
index 6f835c8c7..b8181d220 100644
--- a/locales/da/browser/browser/zen-general.ftl
+++ b/locales/da/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Den fastgjorte fane-URL blev erstattet med den aktuell
zen-tabs-renamed = Fanen blev omdøbt!
zen-background-tab-opened-toast = Ny baggrundsfane åbnet!
zen-workspace-renamed-toast = Arbejdsområde blev omdøbt!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Kompakt tilstand
.tooltiptext = Kompakt tilstand til/fra
diff --git a/locales/da/browser/browser/zen-split-view.ftl b/locales/da/browser/browser/zen-split-view.ftl
index 80323f2b9..5dd6024ab 100644
--- a/locales/da/browser/browser/zen-split-view.ftl
+++ b/locales/da/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Opdel fane (flere faner skal vælges)
- *[other] Opdel { $tabCount } faner
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = S
zen-split-link =
diff --git a/locales/da/browser/browser/zen-vertical-tabs.ftl b/locales/da/browser/browser/zen-vertical-tabs.ftl
index 80af30f7f..77325e82f 100644
--- a/locales/da/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/da/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Skjul begge
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Ny mappe
.accesskey = N
diff --git a/locales/de/browser/browser/preferences/zen-preferences.ftl b/locales/de/browser/browser/preferences/zen-preferences.ftl
index e17936377..86aff9c81 100644
--- a/locales/de/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/de/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM umschalten
zen-devtools-toggle-accessibility-shortcut = Barrierefreiheit umschalten
zen-close-all-unpinned-tabs-shortcut = Alle nicht angehefteten Tabs schließen
zen-new-unsynced-window-shortcut = Neues leeres Fenster
+zen-duplicate-tab-shortcut = Tab duplizieren
diff --git a/locales/de/browser/browser/zen-general.ftl b/locales/de/browser/browser/zen-general.ftl
index ad0ad3fce..66b8d4849 100644
--- a/locales/de/browser/browser/zen-general.ftl
+++ b/locales/de/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Die URL des angehefteten Tabs wurde aktualisiert!
zen-tabs-renamed = Tab umbenannt!
zen-background-tab-opened-toast = Neuer Tab im Hintergrund geöffnet!
zen-workspace-renamed-toast = Arbeitsbereich umbenannt!
+zen-split-view-limit-toast = Diese Split View kann keine weiteren Panels aufnehmen!
zen-toggle-compact-mode-button =
.label = Kompakter Modus
.tooltiptext = Kompakten Modus umschalten
diff --git a/locales/de/browser/browser/zen-split-view.ftl b/locales/de/browser/browser/zen-split-view.ftl
index d466fbbd5..d230a24cb 100644
--- a/locales/de/browser/browser/zen-split-view.ftl
+++ b/locales/de/browser/browser/zen-split-view.ftl
@@ -5,9 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [-1] Aufteilung aufheben
- [1] Tab aufteilen (wähle mehrere Tabs aus)
- *[other] { $tabCount } Tabs aufteilen
+ [-1] Tab abtrennen
+ [1] Split View hinzufügen...
+ *[other] { $tabCount } Tabs zusammenführen
}
.accesskey = S
zen-split-link =
diff --git a/locales/de/browser/browser/zen-vertical-tabs.ftl b/locales/de/browser/browser/zen-vertical-tabs.ftl
index 4b38283b1..633973af8 100644
--- a/locales/de/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/de/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Beides ausblenden
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = In Ordner verschieben...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Neuer Ordner
.accesskey = N
diff --git a/locales/el/browser/browser/preferences/zen-preferences.ftl b/locales/el/browser/browser/preferences/zen-preferences.ftl
index 968896da6..d46b987d2 100644
--- a/locales/el/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/el/browser/browser/preferences/zen-preferences.ftl
@@ -43,11 +43,11 @@ category-zen-workspaces =
.tooltiptext = { pane-zen-tabs-title }
pane-settings-workspaces-title = Χώροι Εργασίας
zen-tabs-select-recently-used-on-close =
- .label = When closing a tab, switch to the most recently used tab instead of the next tab
+ .label = Στο κλείσιμο καρτέλας, αλλαγή στην πιο πρόσφατα χρησιμοποιημένη καρτέλα αντί για την επόμενη καρτέλα
zen-tabs-close-on-back-with-no-history =
.label = Κλείσιμο καρτέλας και αλλαγή στην καρτέλα ιδιοκτήτη (ή στην πιο πρόσφατα χρησιμοποιούμενη καρτέλα) όταν επιστρέφεις χωρίς ιστορικό
zen-settings-workspaces-sync-unpinned-tabs =
- .label = Sync only pinned tabs in workspaces
+ .label = Συγχρονισμός μόνο καρφιτσωμένων καρτελών στους χώρους εργασίας
zen-tabs-cycle-by-attribute =
.label = Ctrl+Tab επιλέγει κυκλικά μόνο από τις καρτέλες στα Απαραίτητα η στο Χώρο Εργασίας
zen-tabs-cycle-ignore-pending-tabs =
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Εναλλαγή DOM
zen-devtools-toggle-accessibility-shortcut = Εναλλαγή Προσβασιμότητας
zen-close-all-unpinned-tabs-shortcut = Κλείσιμο όλων των μη καρφιτσωμένων καρτελών
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Διπλασιασμός Καρτέλας
diff --git a/locales/el/browser/browser/zen-general.ftl b/locales/el/browser/browser/zen-general.ftl
index 0ef357e09..2966c4ca8 100644
--- a/locales/el/browser/browser/zen-general.ftl
+++ b/locales/el/browser/browser/zen-general.ftl
@@ -7,8 +7,8 @@ unified-extensions-description = Οι επεκτάσεις χρησιμοποι
tab-context-zen-reset-pinned-tab =
.label =
{ $isEssential ->
- [true] Reset Essential Tab
- *[false] Reset Pinned Tab
+ [true] Επαναφορά Απαραίτητης Καρτέλας
+ *[false] Επαναφορά Καρφιτσωμένης Καρτέλας
}
.accesskey = R
tab-context-zen-add-essential =
@@ -21,8 +21,8 @@ tab-context-zen-remove-essential =
tab-context-zen-replace-pinned-url-with-current =
.label =
{ $isEssential ->
- [true] Replace Essential URL with Current
- *[false] Replace Pinned URL with Current
+ [true] Αντικατάσταση Απαραίτητης διεύθυνσής με την τωρινή
+ *[false] Αντικατάσταση Καρφιτσωμένης διεύθυνσής με την τωρινή
}
.accesskey = C
tab-context-zen-edit-title =
@@ -41,7 +41,7 @@ pictureinpicture-minimize-btn =
.tooltip = Ελαχιστοποίηση
zen-panel-ui-gradient-generator-custom-color = Προσαρμοσμένο Χρώμα
zen-copy-current-url-confirmation = Αντιγράφηκε το τρέχον URL!
-zen-copy-current-url-as-markdown-confirmation = Copied current URL as Markdown!
+zen-copy-current-url-as-markdown-confirmation = Η τωρινή διεύθυνσή αντιγράφηκε ως Markdown!
zen-general-cancel-label =
.label = Ακύρωση
zen-general-confirm =
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Το URL της καρφιτσωμένης καρτέ
zen-tabs-renamed = Η καρτέλα μετονομάστηκε επιτυχώς!
zen-background-tab-opened-toast = Άνοιξε νέα καρτέλα στο παρασκήνιο!
zen-workspace-renamed-toast = Ο χώρος εργασίας μετονομάστηκε επιτυχώς!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Συμπαγής Λειτουργία
.tooltiptext = Εναλλαγή Συμπαγούς Λειτουργίας
@@ -123,4 +124,4 @@ zen-window-sync-migration-dialog-message = Το Zen άρα στην ίδια σ
zen-window-sync-migration-dialog-learn-more = Περισσότερα
zen-window-sync-migration-dialog-accept = Κατάλαβα
zen-appmenu-new-blank-window =
- .label = New blank window
+ .label = Νέο κενό παράθυρο
diff --git a/locales/el/browser/browser/zen-menubar.ftl b/locales/el/browser/browser/zen-menubar.ftl
index 32e7f3032..5e0256174 100644
--- a/locales/el/browser/browser/zen-menubar.ftl
+++ b/locales/el/browser/browser/zen-menubar.ftl
@@ -19,4 +19,4 @@ zen-menubar-appearance-light =
zen-menubar-appearance-dark =
.label = Σκοτεινό
zen-menubar-new-blank-window =
- .label = New Blank Window
+ .label = Νέο Κενό Παράθυρο
diff --git a/locales/el/browser/browser/zen-split-view.ftl b/locales/el/browser/browser/zen-split-view.ftl
index 11ba4ae59..70e1a3735 100644
--- a/locales/el/browser/browser/zen-split-view.ftl
+++ b/locales/el/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Διαίρεση Καρτέλας (απαιτούνται πολλαπλές επιλεγμένες καρτέλες)
- *[other] Διαίρεση { $tabCount } Καρτελών
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = S
zen-split-link =
diff --git a/locales/el/browser/browser/zen-vertical-tabs.ftl b/locales/el/browser/browser/zen-vertical-tabs.ftl
index 4ee3103d6..3d4c81e91 100644
--- a/locales/el/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/el/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Απόκρυψη όλων
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Δημιουργία Φακέλου
.accesskey = N
@@ -38,7 +41,7 @@ tabbrowser-reset-pin-button =
}
zen-tab-sublabel =
{ $tabSubtitle ->
- [zen-default-pinned] Back to pinned url
- [zen-default-pinned-cmd] Separate from pinned tab
+ [zen-default-pinned] Πίσω στην καρφιτσωμένη διεύθυνσή
+ [zen-default-pinned-cmd] Διαχωρισμός από την καρφιτσωμένη καρτέλα
*[other] { $tabSubtitle }
}
diff --git a/locales/en-GB/browser/browser/preferences/zen-preferences.ftl b/locales/en-GB/browser/browser/preferences/zen-preferences.ftl
index 6c2471ead..a7e3f3c3f 100644
--- a/locales/en-GB/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/en-GB/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/en-GB/browser/browser/zen-general.ftl b/locales/en-GB/browser/browser/zen-general.ftl
index 5319fcadd..479798b15 100644
--- a/locales/en-GB/browser/browser/zen-general.ftl
+++ b/locales/en-GB/browser/browser/zen-general.ftl
@@ -48,6 +48,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL.
zen-tabs-renamed = Tab has been successfully renamed!
zen-background-tab-opened-toast = New background tab opened!
zen-workspace-renamed-toast = Workspace has been successfully renamed!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Compact Mode
.tooltiptext = Toggle Compact Mode
diff --git a/locales/en-GB/browser/browser/zen-split-view.ftl b/locales/en-GB/browser/browser/zen-split-view.ftl
index 97d65b70a..844d6dcbd 100644
--- a/locales/en-GB/browser/browser/zen-split-view.ftl
+++ b/locales/en-GB/browser/browser/zen-split-view.ftl
@@ -5,7 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Join Tab (multiple selected tabs needed)
+ [-1] Split out tab
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/en-GB/browser/browser/zen-vertical-tabs.ftl b/locales/en-GB/browser/browser/zen-vertical-tabs.ftl
index 41494167b..cddebc1ee 100644
--- a/locales/en-GB/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/en-GB/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Hide both
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = New Folder
.accesskey = N
diff --git a/locales/en-US/browser/browser/zen-general.ftl b/locales/en-US/browser/browser/zen-general.ftl
index f88f215fd..d1229b04f 100644
--- a/locales/en-US/browser/browser/zen-general.ftl
+++ b/locales/en-US/browser/browser/zen-general.ftl
@@ -58,6 +58,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL!
zen-tabs-renamed = Tab has been successfully renamed!
zen-background-tab-opened-toast = New background tab opened!
zen-workspace-renamed-toast = Workspace has been successfully renamed!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Compact Mode
diff --git a/locales/en-US/browser/browser/zen-split-view.ftl b/locales/en-US/browser/browser/zen-split-view.ftl
index 8e9aaaed5..ee1e7081f 100644
--- a/locales/en-US/browser/browser/zen-split-view.ftl
+++ b/locales/en-US/browser/browser/zen-split-view.ftl
@@ -6,7 +6,7 @@ tab-zen-split-tabs =
.label =
{ $tabCount ->
[-1] Split out tab
- [1] Join Tab (multiple selected tabs needed)
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/en-US/browser/browser/zen-vertical-tabs.ftl b/locales/en-US/browser/browser/zen-vertical-tabs.ftl
index f54a0d3b0..73e4a2a03 100644
--- a/locales/en-US/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/en-US/browser/browser/zen-vertical-tabs.ftl
@@ -19,6 +19,10 @@ zen-toolbar-context-compact-mode-hide-both =
.label = Hide both
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
+
zen-toolbar-context-new-folder =
.label = New Folder
.accesskey = N
diff --git a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
index fe1f7c7f7..7e81a58a4 100644
--- a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Alternar DOM
zen-devtools-toggle-accessibility-shortcut = Alternar accesibilidad
zen-close-all-unpinned-tabs-shortcut = Cerrar todas las pestañas sin fijar
zen-new-unsynced-window-shortcut = Nueva ventana no sincronizada
+zen-duplicate-tab-shortcut = Duplicar pestaña
diff --git a/locales/es-ES/browser/browser/zen-general.ftl b/locales/es-ES/browser/browser/zen-general.ftl
index 7410c1077..b9fb5237f 100644
--- a/locales/es-ES/browser/browser/zen-general.ftl
+++ b/locales/es-ES/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = La URL de la pestaña fijada se ha reemplazado por la
zen-tabs-renamed = ¡La pestaña se ha renombrado con éxito!
zen-background-tab-opened-toast = ¡Nueva pestaña abierta en segundo plano!
zen-workspace-renamed-toast = ¡El espacio de trabajo ha sido renombrado con éxito!
+zen-split-view-limit-toast = ¡No se pueden añadir más paneles a la vista dividida!
zen-toggle-compact-mode-button =
.label = Modo compacto
.tooltiptext = Alternar modo compacto
diff --git a/locales/es-ES/browser/browser/zen-split-view.ftl b/locales/es-ES/browser/browser/zen-split-view.ftl
index 915fdba54..2d3f297c0 100644
--- a/locales/es-ES/browser/browser/zen-split-view.ftl
+++ b/locales/es-ES/browser/browser/zen-split-view.ftl
@@ -5,9 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [-1] Deshacer división
- [1] Vista dividida (seleccione varias pestañas)
- *[other] Añadir { $tabCount } pestañas a la vista dividida
+ [-1] Separar pestaña
+ [1] Añadir vista dividida...
+ *[other] Unir { $tabCount } pestañas
}
.accesskey = S
zen-split-link =
diff --git a/locales/es-ES/browser/browser/zen-vertical-tabs.ftl b/locales/es-ES/browser/browser/zen-vertical-tabs.ftl
index ddefab297..5d892fcde 100644
--- a/locales/es-ES/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/es-ES/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Ocultar ambas
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Mover a la carpeta...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Nueva carpeta
.accesskey = N
diff --git a/locales/et/browser/browser/preferences/zen-preferences.ftl b/locales/et/browser/browser/preferences/zen-preferences.ftl
index 7918c3927..c15f1b56d 100644
--- a/locales/et/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/et/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Lülita DOM sisse/välja
zen-devtools-toggle-accessibility-shortcut = Lülita ligipääsetavuse sektsioon sisse/välja
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/et/browser/browser/zen-general.ftl b/locales/et/browser/browser/zen-general.ftl
index 1c55e454d..7ba7cbd2d 100644
--- a/locales/et/browser/browser/zen-general.ftl
+++ b/locales/et/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL.
zen-tabs-renamed = Kaart on edukalt ümber nimetatud!
zen-background-tab-opened-toast = Taustal avati uus kaart!
zen-workspace-renamed-toast = Tööruum on edukalt ümber nimetatud!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Compact Mode
.tooltiptext = Lülita kompaktne režiim sisse/välja
diff --git a/locales/et/browser/browser/zen-split-view.ftl b/locales/et/browser/browser/zen-split-view.ftl
index 626e4a33a..01814d861 100644
--- a/locales/et/browser/browser/zen-split-view.ftl
+++ b/locales/et/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Jaota kaart (mitu kaarti peab olema valitud)
- *[other] Jaota { $tabCount } kaarti
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = J
zen-split-link =
diff --git a/locales/et/browser/browser/zen-vertical-tabs.ftl b/locales/et/browser/browser/zen-vertical-tabs.ftl
index 79e19799d..c4ecdab54 100644
--- a/locales/et/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/et/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Peida mõlemad
.accesskey = P
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Uus kaust
.accesskey = U
diff --git a/locales/eu/browser/browser/preferences/zen-preferences.ftl b/locales/eu/browser/browser/preferences/zen-preferences.ftl
index 48e927caa..728fc5f2e 100644
--- a/locales/eu/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/eu/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Blank Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/eu/browser/browser/zen-general.ftl b/locales/eu/browser/browser/zen-general.ftl
index 06d5c5810..c2754b4f4 100644
--- a/locales/eu/browser/browser/zen-general.ftl
+++ b/locales/eu/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Oraingo estekak ordezkatu du ainguratutako fitxarena!
zen-tabs-renamed = Fitxaren izena ongi aldatu da!
zen-background-tab-opened-toast = Fitxa berri bat zabaldu da bigarren planoan!
zen-workspace-renamed-toast = Lan-eremuaren izena ongi aldatu da!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Modu Trinkoa
.tooltiptext = Modu Trinkoa Aktibatu/Desaktibatu
diff --git a/locales/eu/browser/browser/zen-split-view.ftl b/locales/eu/browser/browser/zen-split-view.ftl
index a83fc33d2..4430fab34 100644
--- a/locales/eu/browser/browser/zen-split-view.ftl
+++ b/locales/eu/browser/browser/zen-split-view.ftl
@@ -6,7 +6,7 @@ tab-zen-split-tabs =
.label =
{ $tabCount ->
[-1] Split out tab
- [1] Join Tab (multiple selected tabs needed)
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/eu/browser/browser/zen-vertical-tabs.ftl b/locales/eu/browser/browser/zen-vertical-tabs.ftl
index ff8a3775c..9989c7666 100644
--- a/locales/eu/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/eu/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Hide both
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = New Folder
.accesskey = N
diff --git a/locales/fa/browser/browser/preferences/zen-preferences.ftl b/locales/fa/browser/browser/preferences/zen-preferences.ftl
index f28962a53..8f63791ca 100644
--- a/locales/fa/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/fa/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/fa/browser/browser/zen-general.ftl b/locales/fa/browser/browser/zen-general.ftl
index 281a24d0b..f4b3f238d 100644
--- a/locales/fa/browser/browser/zen-general.ftl
+++ b/locales/fa/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL.
zen-tabs-renamed = Tab has been successfully renamed!
zen-background-tab-opened-toast = New background tab opened!
zen-workspace-renamed-toast = Workspace has been successfully renamed!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Compact Mode
.tooltiptext = Toggle Compact Mode
diff --git a/locales/fa/browser/browser/zen-split-view.ftl b/locales/fa/browser/browser/zen-split-view.ftl
index bfcdba4dd..bfc0e2ca8 100644
--- a/locales/fa/browser/browser/zen-split-view.ftl
+++ b/locales/fa/browser/browser/zen-split-view.ftl
@@ -5,7 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Join Tab (multiple selected tabs needed)
+ [-1] Split out tab
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/fa/browser/browser/zen-vertical-tabs.ftl b/locales/fa/browser/browser/zen-vertical-tabs.ftl
index 41494167b..cddebc1ee 100644
--- a/locales/fa/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/fa/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Hide both
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = New Folder
.accesskey = N
diff --git a/locales/fi/browser/browser/preferences/zen-preferences.ftl b/locales/fi/browser/browser/preferences/zen-preferences.ftl
index be58fe2cd..7f518ecc6 100644
--- a/locales/fi/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/fi/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Vaihda DOM:ia
zen-devtools-toggle-accessibility-shortcut = Vaihda Esteettömyystilaan
zen-close-all-unpinned-tabs-shortcut = Sulje kaikki kiinnittämättömät välilehdet
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/fi/browser/browser/zen-general.ftl b/locales/fi/browser/browser/zen-general.ftl
index c3afa728a..7ddce52f2 100644
--- a/locales/fi/browser/browser/zen-general.ftl
+++ b/locales/fi/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL.
zen-tabs-renamed = Välilehti on nimetty uudelleen!
zen-background-tab-opened-toast = Uusi taustavälilehti avattu!
zen-workspace-renamed-toast = Työtila on nimetty uudelleen!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Kompakti Tila
.tooltiptext = Ota käyttöön Kompakti tila
diff --git a/locales/fi/browser/browser/zen-split-view.ftl b/locales/fi/browser/browser/zen-split-view.ftl
index bbc3dbeda..a1e905819 100644
--- a/locales/fi/browser/browser/zen-split-view.ftl
+++ b/locales/fi/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Split Välilehti (tarvitaan useita valittuja välilehtiä)
- *[other] Split { $tabCount } Välilehdet
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = S
zen-split-link =
diff --git a/locales/fi/browser/browser/zen-vertical-tabs.ftl b/locales/fi/browser/browser/zen-vertical-tabs.ftl
index ed852a2fa..c12141fde 100644
--- a/locales/fi/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/fi/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Piilota molemmat
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Uusi kansio
.accesskey = N
diff --git a/locales/fr/browser/browser/preferences/zen-preferences.ftl b/locales/fr/browser/browser/preferences/zen-preferences.ftl
index 89d3fddc8..f2deb00b8 100644
--- a/locales/fr/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/fr/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Afficher l’onglet DOM
zen-devtools-toggle-accessibility-shortcut = Afficher l’onglet Accessibilité
zen-close-all-unpinned-tabs-shortcut = Fermer tous les onglets non épinglés
zen-new-unsynced-window-shortcut = Nouvelle fenêtre vierge
+zen-duplicate-tab-shortcut = Dupliquer l'onglet
diff --git a/locales/fr/browser/browser/zen-general.ftl b/locales/fr/browser/browser/zen-general.ftl
index 51f0bc559..41d53b68f 100644
--- a/locales/fr/browser/browser/zen-general.ftl
+++ b/locales/fr/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = L’adresse de l'onglet épinglé a été remplacée p
zen-tabs-renamed = L’onglet a été renommé avec succès !
zen-background-tab-opened-toast = Nouvel onglet ouvert en arrière-plan !
zen-workspace-renamed-toast = L'espace de travail a été renommé avec succès !
+zen-split-view-limit-toast = Impossible d'ajouter d'autres panneaux à la vue fractionnée !
zen-toggle-compact-mode-button =
.label = Mode compact
.tooltiptext = Activer/Désactiver le mode compact
diff --git a/locales/fr/browser/browser/zen-split-view.ftl b/locales/fr/browser/browser/zen-split-view.ftl
index 4b2db603f..a0041cedd 100644
--- a/locales/fr/browser/browser/zen-split-view.ftl
+++ b/locales/fr/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Fractionner (sélectionner plusieurs onglets)
- *[other] Fractionner { $tabCount } onglets
+ [-1] Séparer l'onglet
+ [1] Ajouter une vue fractionnée...
+ *[other] Fusionner { $tabCount } onglets
}
.accesskey = S
zen-split-link =
diff --git a/locales/fr/browser/browser/zen-vertical-tabs.ftl b/locales/fr/browser/browser/zen-vertical-tabs.ftl
index 2355634e1..ee6ac4683 100644
--- a/locales/fr/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/fr/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Masquer les deux
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Déplacer vers le dossier...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Nouveau dossier
.accesskey = N
diff --git a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
index 0b07ca8df..10f96fedd 100644
--- a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Scoránaigh DOM
zen-devtools-toggle-accessibility-shortcut = Scoránaigh Inrochtaineacht
zen-close-all-unpinned-tabs-shortcut = Dún Gach Cluaisín Gan Phionáil
zen-new-unsynced-window-shortcut = Fuinneog Nua Neamhshioncrónaithe
+zen-duplicate-tab-shortcut = Cluaisín Dúblach
diff --git a/locales/ga-IE/browser/browser/zen-general.ftl b/locales/ga-IE/browser/browser/zen-general.ftl
index 9b8963a6b..7b73f797e 100644
--- a/locales/ga-IE/browser/browser/zen-general.ftl
+++ b/locales/ga-IE/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Tá URL an chluaisín phinnáilte curtha in ionad an U
zen-tabs-renamed = Athainmníodh an cluaisín go rathúil!
zen-background-tab-opened-toast = Tá cluaisín cúlra nua oscailte!
zen-workspace-renamed-toast = Athainmníodh an spás oibre go rathúil!
+zen-split-view-limit-toast = Ní féidir níos mó painéil a chur leis an radharc scoilte!
zen-toggle-compact-mode-button =
.label = Mód Dlúth
.tooltiptext = Mód Dlúth a Athrú
diff --git a/locales/ga-IE/browser/browser/zen-split-view.ftl b/locales/ga-IE/browser/browser/zen-split-view.ftl
index 8fc871cdb..f99a79e01 100644
--- a/locales/ga-IE/browser/browser/zen-split-view.ftl
+++ b/locales/ga-IE/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Scoilt Cluaisín (tá gá le roinnt cluaisíní roghnaithe)
- *[other] Scoilt { $tabCount } Cluaisíní
+ [-1] Cluaisín scoilte
+ [1] Amharc scoilte a chur leis...
+ *[other] Ceangail le { $tabCount } Cluaisíní
}
.accesskey = S
zen-split-link =
diff --git a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl
index 9e7631a79..d107deb12 100644
--- a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Folaigh an dá cheann
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Bog go Fillteán...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Fillteán Nua
.accesskey = N
diff --git a/locales/he/browser/browser/preferences/zen-preferences.ftl b/locales/he/browser/browser/preferences/zen-preferences.ftl
index 69eca12ed..fc21b7eb8 100644
--- a/locales/he/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/he/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = הפעל/כבה DOM
zen-devtools-toggle-accessibility-shortcut = הפעל/כבה נגישות
zen-close-all-unpinned-tabs-shortcut = סגירת כל הלשוניות שאינן מוצמדות
zen-new-unsynced-window-shortcut = חלון לא מסונכרן חדש
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/he/browser/browser/zen-general.ftl b/locales/he/browser/browser/zen-general.ftl
index a5a01774a..0cf72f91c 100644
--- a/locales/he/browser/browser/zen-general.ftl
+++ b/locales/he/browser/browser/zen-general.ftl
@@ -48,6 +48,7 @@ zen-pinned-tab-replaced = כתובת הלשונית המוצמדת הוחלפה
zen-tabs-renamed = שם הלשונית השתנה בהצלחה!
zen-background-tab-opened-toast = לשונית נפתחה ברקע!
zen-workspace-renamed-toast = שם מרחב העבודה השתנה בהצלחה!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = מצב חסכוני
.tooltiptext = הפעלת/כיבוי מצב חסכוני
diff --git a/locales/he/browser/browser/zen-split-view.ftl b/locales/he/browser/browser/zen-split-view.ftl
index 4a0f06957..96042d9b5 100644
--- a/locales/he/browser/browser/zen-split-view.ftl
+++ b/locales/he/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] פיצול לשונית (נדרש מספר לשוניות מסומנות)
- *[other] פיצול { $tabCount } לשוניות
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = ד
zen-split-link =
diff --git a/locales/he/browser/browser/zen-vertical-tabs.ftl b/locales/he/browser/browser/zen-vertical-tabs.ftl
index 8365a562d..28121137b 100644
--- a/locales/he/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/he/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = הסתרת שני הסרגלים
.accesskey = י
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = תיקייה חדשה
.accesskey = מ
diff --git a/locales/hu/browser/browser/preferences/zen-preferences.ftl b/locales/hu/browser/browser/preferences/zen-preferences.ftl
index 4637f208e..02da4b7a0 100644
--- a/locales/hu/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/hu/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM kapcsolása
zen-devtools-toggle-accessibility-shortcut = Hozzáférhetőség kapcsolása
zen-close-all-unpinned-tabs-shortcut = Összes rögzítetlen lap bezárása
zen-new-unsynced-window-shortcut = Új szinkronizálatlan ablak
+zen-duplicate-tab-shortcut = Lap duplikálása
diff --git a/locales/hu/browser/browser/zen-general.ftl b/locales/hu/browser/browser/zen-general.ftl
index dd9279f42..93f887358 100644
--- a/locales/hu/browser/browser/zen-general.ftl
+++ b/locales/hu/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = A rögzített lap URL címe helyébe az aktuális URL
zen-tabs-renamed = A lap sikeresen át lett nevezve!
zen-background-tab-opened-toast = Új lap megnyitva!
zen-workspace-renamed-toast = A munkakörnyezet sikeresen át lett nevezve!
+zen-split-view-limit-toast = Nem lehet további paneleket hozzáadni az osztott nézethez!
zen-toggle-compact-mode-button =
.label = Kompakt mód
.tooltiptext = Kompakt mód ki-/bekapcsolása
diff --git a/locales/hu/browser/browser/zen-split-view.ftl b/locales/hu/browser/browser/zen-split-view.ftl
index 350e3e4e3..9f4b81858 100644
--- a/locales/hu/browser/browser/zen-split-view.ftl
+++ b/locales/hu/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Felosztott lapok (válassz ki több lapot)
- *[other] { $tabCount } lap felosztása
+ [-1] Lap kivétele
+ [1] Osztott nézethez adás...
+ *[other] { $tabCount } lap összevonása
}
.accesskey = S
zen-split-link =
diff --git a/locales/hu/browser/browser/zen-vertical-tabs.ftl b/locales/hu/browser/browser/zen-vertical-tabs.ftl
index dd14881b7..63c85ee0c 100644
--- a/locales/hu/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/hu/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Mindkettő elrejtése
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Áthelyezés mappába...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Új mappa
.accesskey = N
diff --git a/locales/id/browser/browser/preferences/zen-preferences.ftl b/locales/id/browser/browser/preferences/zen-preferences.ftl
index dd9b7c3c8..7f5e29879 100644
--- a/locales/id/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/id/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Ubah DOM
zen-devtools-toggle-accessibility-shortcut = Ubah Aksesibilitas
zen-close-all-unpinned-tabs-shortcut = Tutup Semua Tab yang Tidak Disematkan
zen-new-unsynced-window-shortcut = Jendela Kosong Baru
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/id/browser/browser/zen-general.ftl b/locales/id/browser/browser/zen-general.ftl
index e352fc1fd..860c3deed 100644
--- a/locales/id/browser/browser/zen-general.ftl
+++ b/locales/id/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = URL awal dari tab yang disematkan telah diganti dengan
zen-tabs-renamed = Tab telah berhasil diubah namanya!
zen-background-tab-opened-toast = Tab baru telah terbuka di latar belakang!
zen-workspace-renamed-toast = Ruang Kerja telah berhasil diubah namanya!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Mode Ringkas
.tooltiptext = Aktifkan/Sembunyikan Mode Ringkas
diff --git a/locales/id/browser/browser/zen-split-view.ftl b/locales/id/browser/browser/zen-split-view.ftl
index 9184dc5cd..c1785a709 100644
--- a/locales/id/browser/browser/zen-split-view.ftl
+++ b/locales/id/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Belah Tab (pilih beberapa tab dulu)
- *[other] Belah { $tabCount } Tab
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = S
zen-split-link =
diff --git a/locales/id/browser/browser/zen-vertical-tabs.ftl b/locales/id/browser/browser/zen-vertical-tabs.ftl
index 369fdb910..b8a94f2a5 100644
--- a/locales/id/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/id/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Sembunyikan keduanya
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Folder Baru
.accesskey = N
diff --git a/locales/is/browser/browser/preferences/zen-preferences.ftl b/locales/is/browser/browser/preferences/zen-preferences.ftl
index 8e3de3969..db2e11183 100644
--- a/locales/is/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/is/browser/browser/preferences/zen-preferences.ftl
@@ -18,7 +18,7 @@ sync-engine-workspaces =
.accesskey = V
zen-glance-title = Skyndisýn
zen-glance-header = Almennar stillingar fyrir skyndisýn
-zen-glance-description = Fáðu fljótlegt heildarsýn yfir tenglana þína án þess að þurfa að opna þá í nýjum flipum
+zen-glance-description = Fáðu fljótlegt heildaryfirlit á tenglana þína án þess að þurfa að opna þá í nýjum flipum
zen-glance-trigger-label = Virkjunaraðferð
zen-glance-enabled =
.label = Virkja Skyndisýn
@@ -30,7 +30,7 @@ zen-glance-trigger-shift-click =
.label = Shift + smella
zen-glance-trigger-meta-click =
.label = Meta (Slaufa) + smella
-zen-look-and-feel-compact-view-header = Sýna í þjappaðri sýn
+zen-look-and-feel-compact-view-header = Sýna í þjöppuðu yfirliti
zen-look-and-feel-compact-view-description = Aðeins birta verkfærastikurnar sem þú notar!
zen-look-and-feel-compact-view-enabled =
.label = Virkja þjappað viðmót í { -brand-short-name }
@@ -181,7 +181,7 @@ zenCKSOption-group-mediaAndDisplay = Myndefni og birting
zenCKSOption-group-zen-compact-mode = Þjappað viðmót
zenCKSOption-group-zen-workspace = Vinnusvæði
zenCKSOption-group-zen-other = Aðrir eiginleikar Zen
-zenCKSOption-group-zen-split-view = Klofningarsýn
+zenCKSOption-group-zen-split-view = Klofið yfirlit
zenCKSOption-group-devTools = Forritunarverkfæri
zen-key-quick-restart = Fljótleg endurræsing
zen-window-new-shortcut = Nýr gluggi
@@ -283,11 +283,11 @@ zen-workspace-shortcut-forward = Vinnusvæði áfram
zen-workspace-shortcut-backward = Vinnusvæði afturábak
zen-sidebar-shortcut-toggle = Víxla breidd hliðarspjalds
zen-pinned-tab-shortcut-reset = Endursetja festan flipa á festa slóð
-zen-split-view-shortcut-grid = Víxla reitaskiptri klofningarsýn
-zen-split-view-shortcut-vertical = Víxla lóðréttri klofningarsýn
-zen-split-view-shortcut-horizontal = Víxla láréttri klofningarsýn
-zen-split-view-shortcut-unsplit = Hætta klofningarsýn
-zen-new-empty-split-view-shortcut = Ný auð klofningarsýn
+zen-split-view-shortcut-grid = Víxla reitaskiptu klofnu yfirliti
+zen-split-view-shortcut-vertical = Víxla lóðréttu klofnu yfirliti
+zen-split-view-shortcut-horizontal = Víxla láréttu klofnu yfirliti
+zen-split-view-shortcut-unsplit = Loka klofnu yfirliti
+zen-new-empty-split-view-shortcut = Nýtt autt klofið yfirlit
zen-key-select-tab-1 = Velja flipa #1
zen-key-select-tab-2 = Velja flipa #2
zen-key-select-tab-3 = Velja flipa #3
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Víxla DOM af/á
zen-devtools-toggle-accessibility-shortcut = Víxla auðvelduðu aðgengi af/á
zen-close-all-unpinned-tabs-shortcut = Loka öllum ófestum flipum
zen-new-unsynced-window-shortcut = Nýr auður gluggi
+zen-duplicate-tab-shortcut = Tvítaka flipa
diff --git a/locales/is/browser/browser/zen-general.ftl b/locales/is/browser/browser/zen-general.ftl
index fa7468dbc..39f8aa763 100644
--- a/locales/is/browser/browser/zen-general.ftl
+++ b/locales/is/browser/browser/zen-general.ftl
@@ -48,6 +48,7 @@ zen-pinned-tab-replaced = URL-slóð festa flipans hefur verið skipt út með f
zen-tabs-renamed = Tókst að endurnefna flipann!
zen-background-tab-opened-toast = Nýr bakgrunnsflipi opnaður!
zen-workspace-renamed-toast = Tókst að endurnefna vinnusvæðið!
+zen-split-view-limit-toast = Get ekki bætt fleiri spjöldum á klofið yfirlit!
zen-toggle-compact-mode-button =
.label = Þjappað viðmót
.tooltiptext = Víxla þjöppuðu viðmóti
diff --git a/locales/is/browser/browser/zen-split-view.ftl b/locales/is/browser/browser/zen-split-view.ftl
index 47e317d79..04158c866 100644
--- a/locales/is/browser/browser/zen-split-view.ftl
+++ b/locales/is/browser/browser/zen-split-view.ftl
@@ -5,13 +5,14 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Skipta tengli (margir valdir flipar nauðsynlegir)
- *[other] Skipta { $tabCount } flipum
+ [-1] Kljúfa út flipa
+ [1] Bæta við klofnu yfirliti...
+ *[other] Sameina { $tabCount } flipa
}
.accesskey = S
zen-split-link =
.label = Kljúfa tengil í nýjan flipa
.accesskey = S
-zen-split-view-modifier-header = Klofningarsýn
+zen-split-view-modifier-header = Klofið yfirlit
zen-split-view-modifier-activate-reallocation =
.label = Virkja umröðun
diff --git a/locales/is/browser/browser/zen-vertical-tabs.ftl b/locales/is/browser/browser/zen-vertical-tabs.ftl
index 422618c21..15fa498b3 100644
--- a/locales/is/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/is/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Fela bæði
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Færa í möppu...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Ný mappa
.accesskey = N
diff --git a/locales/it/browser/browser/preferences/zen-preferences.ftl b/locales/it/browser/browser/preferences/zen-preferences.ftl
index a1ab688e8..91ddbba1b 100644
--- a/locales/it/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/it/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Attiva/Disattiva DOM
zen-devtools-toggle-accessibility-shortcut = Attiva/Disattiva Accessibilità
zen-close-all-unpinned-tabs-shortcut = Chiudi Tutte Le Schede Non Bloccate
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/it/browser/browser/zen-general.ftl b/locales/it/browser/browser/zen-general.ftl
index 9e06ec892..b4b052db6 100644
--- a/locales/it/browser/browser/zen-general.ftl
+++ b/locales/it/browser/browser/zen-general.ftl
@@ -48,6 +48,7 @@ zen-pinned-tab-replaced = L'URL della scheda bloccata è stato sostituito con l'
zen-tabs-renamed = La scheda è stata rinominata con successo!
zen-background-tab-opened-toast = Nuova scheda aperta in background!
zen-workspace-renamed-toast = Il Workspace è stato rinominato con successo!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Modalità compatta
.tooltiptext = Attiva/disattiva Modalità compatta
diff --git a/locales/it/browser/browser/zen-split-view.ftl b/locales/it/browser/browser/zen-split-view.ftl
index 31a8ad7a5..27af93a9b 100644
--- a/locales/it/browser/browser/zen-split-view.ftl
+++ b/locales/it/browser/browser/zen-split-view.ftl
@@ -5,7 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Split Tab (sono necessarie più schede selezionate)
+ [-1] Split out tab
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/it/browser/browser/zen-vertical-tabs.ftl b/locales/it/browser/browser/zen-vertical-tabs.ftl
index d5c8357e4..ca8bf28a1 100644
--- a/locales/it/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/it/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Nascondi entrambi
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Nuova cartella
.accesskey = N
diff --git a/locales/ja/browser/browser/preferences/zen-preferences.ftl b/locales/ja/browser/browser/preferences/zen-preferences.ftl
index 33aa65fc3..feab7607a 100644
--- a/locales/ja/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ja/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOMの切り替え
zen-devtools-toggle-accessibility-shortcut = アクセシビリティの切り替え
zen-close-all-unpinned-tabs-shortcut = ピン留めされていないすべてのタブを閉じる
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = タブを複製
diff --git a/locales/ja/browser/browser/zen-general.ftl b/locales/ja/browser/browser/zen-general.ftl
index 7f272d724..81f90c814 100644
--- a/locales/ja/browser/browser/zen-general.ftl
+++ b/locales/ja/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = 固定したタブのURLが現在のURLに置き換え
zen-tabs-renamed = タブの名前は無事に変更されました!
zen-background-tab-opened-toast = 新しい背景タブが開きました!
zen-workspace-renamed-toast = ワークスペースの名前が変更されました!
+zen-split-view-limit-toast = 分割ビューにこれ以上パネルを追加できません!
zen-toggle-compact-mode-button =
.label = コンパクトモード
.tooltiptext = コンパクトモードの切り替え
diff --git a/locales/ja/browser/browser/zen-split-view.ftl b/locales/ja/browser/browser/zen-split-view.ftl
index d5c224f25..85df2f982 100644
--- a/locales/ja/browser/browser/zen-split-view.ftl
+++ b/locales/ja/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] タブを分割する(2つ以上のタブを選択してください)
- *[other] 選択したタブを{ $tabCount }つに分割する
+ [-1] 分割タブ
+ [1] 分割ビューを追加...
+ *[other] { $tabCount } 個のタブを結合するs
}
.accesskey = S
zen-split-link =
diff --git a/locales/ja/browser/browser/zen-vertical-tabs.ftl b/locales/ja/browser/browser/zen-vertical-tabs.ftl
index c759ab05d..dc726b4bb 100644
--- a/locales/ja/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ja/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = サイドバーとツールバーを隠す
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = フォルダに移動する…
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = 新しいフォルダ
.accesskey = N
@@ -33,12 +36,12 @@ tabbrowser-unload-tab-button =
tabbrowser-reset-pin-button =
.tooltiptext =
{ $tabCount ->
- [one] タブをリセットしてピン留め
- *[other] タブをリセットして{ $tabCount }つのタブをピン留め
+ [one] タブをリセットして固定する
+ *[other] タブをリセットして{ $tabCount }つのタブを固定する
}
zen-tab-sublabel =
{ $tabSubtitle ->
- [zen-default-pinned] ピン止めされた URL に戻る
- [zen-default-pinned-cmd] ピン止めされたタブから切り離す
+ [zen-default-pinned] 固定された URL に戻る
+ [zen-default-pinned-cmd] 固定されたタブから切り離す
*[other] { $tabSubtitle }
}
diff --git a/locales/ko/browser/browser/preferences/zen-preferences.ftl b/locales/ko/browser/browser/preferences/zen-preferences.ftl
index 143922cf1..a1f34396e 100644
--- a/locales/ko/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ko/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM 탭 전환
zen-devtools-toggle-accessibility-shortcut = 접근성 탭 전환
zen-close-all-unpinned-tabs-shortcut = 모든 고정되지 않은 탭 닫기
zen-new-unsynced-window-shortcut = 새 비동기화 창
+zen-duplicate-tab-shortcut = 탭 복제
diff --git a/locales/ko/browser/browser/zen-general.ftl b/locales/ko/browser/browser/zen-general.ftl
index 3c99a323a..dd2018713 100644
--- a/locales/ko/browser/browser/zen-general.ftl
+++ b/locales/ko/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = 고정 URL이 현재 URL로 변경되었습니다!
zen-tabs-renamed = 탭의 이름이 성공적으로 변경되었습니다!
zen-background-tab-opened-toast = 새 백그라운드 탭이 열렸습니다!
zen-workspace-renamed-toast = 워크스페이스 이름이 변경되었습니다!
+zen-split-view-limit-toast = 패널을 더 추가할 수 없습니다!
zen-toggle-compact-mode-button =
.label = 사이드바 축소 모드
.tooltiptext = 사이드바 축소 토글
diff --git a/locales/ko/browser/browser/zen-split-view.ftl b/locales/ko/browser/browser/zen-split-view.ftl
index e742efdf2..ac933dac1 100644
--- a/locales/ko/browser/browser/zen-split-view.ftl
+++ b/locales/ko/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] 탭 나누기 (여러 탭이 선택되어 있어야 함)
- *[other] 탭 { $tabCount }개 나누기
+ [-1] 탭 나누기
+ [1] 나눠진 탭 추가...
+ *[other] { $tabCount }개 탭 합치기
}
.accesskey = S
zen-split-link =
diff --git a/locales/ko/browser/browser/zen-vertical-tabs.ftl b/locales/ko/browser/browser/zen-vertical-tabs.ftl
index 269f6a93b..90b619006 100644
--- a/locales/ko/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ko/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = 둘 다 숨기기
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = 폴더로 옮기기...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = 새 폴더
.accesskey = N
diff --git a/locales/lt/browser/browser/preferences/zen-preferences.ftl b/locales/lt/browser/browser/preferences/zen-preferences.ftl
index 7a9822f54..47df9d551 100644
--- a/locales/lt/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/lt/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Perjungti DOM
zen-devtools-toggle-accessibility-shortcut = Perjungti prieinamumą
zen-close-all-unpinned-tabs-shortcut = Užverti visas neprisegtas korteles
zen-new-unsynced-window-shortcut = Naujas tuščias langas
+zen-duplicate-tab-shortcut = Dubliuoti kortelę
diff --git a/locales/lt/browser/browser/zen-general.ftl b/locales/lt/browser/browser/zen-general.ftl
index 376ff37ff..17f8c20b2 100644
--- a/locales/lt/browser/browser/zen-general.ftl
+++ b/locales/lt/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Prisegtos kortelės URL pakeistas dabartiniu URL.
zen-tabs-renamed = Kortelė sėkmingai pervadinta.
zen-background-tab-opened-toast = Nauja fonos kortelė atverta.
zen-workspace-renamed-toast = Darbo sritis sėkmingai pervadintas.
+zen-split-view-limit-toast = Negalima įtraukti daugiau skydelių į suskaidytą rodinį.
zen-toggle-compact-mode-button =
.label = Kompaktinis režimas
.tooltiptext = Perjungti kompaktinį režimą
diff --git a/locales/lt/browser/browser/zen-split-view.ftl b/locales/lt/browser/browser/zen-split-view.ftl
index 1e309f3dd..dd0d361bd 100644
--- a/locales/lt/browser/browser/zen-split-view.ftl
+++ b/locales/lt/browser/browser/zen-split-view.ftl
@@ -5,11 +5,12 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Skaidyti kortelę (reikia kelių pasirinktų kortelių)
- [one] Skaidyti { $tabCount } kortelę
- [few] Skaidyti { $tabCount } korteles
- [many] Skaidyti { $tabCount } kortelės
- *[other] Skaidyti { $tabCount } kortelių
+ [-1] Išskaidyti kortelę
+ [1] Įtraukti skaidymo rodinį
+ [one] Sujungti { $tabCount } kortelę
+ [few] Sujungti { $tabCount } korteles
+ [many] Sujungti { $tabCount } kortelės
+ *[other] Sujungti { $tabCount } kortelių
}
.accesskey = S
zen-split-link =
diff --git a/locales/lt/browser/browser/zen-vertical-tabs.ftl b/locales/lt/browser/browser/zen-vertical-tabs.ftl
index 52542643a..4c8929735 100644
--- a/locales/lt/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/lt/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Slėpti abi
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Perkelti į aplanką...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Naujas aplankas
.accesskey = N
diff --git a/locales/nb/browser/browser/preferences/zen-preferences.ftl b/locales/nb/browser/browser/preferences/zen-preferences.ftl
index d34e4a570..0feb70cca 100644
--- a/locales/nb/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/nb/browser/browser/preferences/zen-preferences.ftl
@@ -316,4 +316,5 @@ zen-devtools-toggle-storage-shortcut = Veksle Lagring
zen-devtools-toggle-dom-shortcut = Veksle DOM
zen-devtools-toggle-accessibility-shortcut = Veksle Tilgjengelighet
zen-close-all-unpinned-tabs-shortcut = Lukk alle ufestede faner
-zen-new-unsynced-window-shortcut = Nytt usynkronisert vindu
+zen-new-unsynced-window-shortcut = Nytt tomt vindu
+zen-duplicate-tab-shortcut = Dupliser fane
diff --git a/locales/nb/browser/browser/zen-general.ftl b/locales/nb/browser/browser/zen-general.ftl
index 6255689e7..97afeee60 100644
--- a/locales/nb/browser/browser/zen-general.ftl
+++ b/locales/nb/browser/browser/zen-general.ftl
@@ -2,26 +2,26 @@
# 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/.
-zen-panel-ui-current-profile-text = nåværende profil
-unified-extensions-description = Utvidelser er brukt for å bringe mer ekstra funksjonalitet til { -brand-short-name }.
+zen-panel-ui-current-profile-text = gjeldende profil
+unified-extensions-description = Utvidelser brukes for å bringe ekstra funksjonalitet til { -brand-short-name }.
tab-context-zen-reset-pinned-tab =
.label =
{ $isEssential ->
- [true] Nullstill essensiell fane
+ [true] Nullstill Essential fane
*[false] Nullstill festet fane
}
.accesskey = R
tab-context-zen-add-essential =
- .label = Legg til i essensielle
+ .label = Legg til i Essentials
.accesskey = E
tab-context-zen-add-essential-badge = { $num } / { $max }
tab-context-zen-remove-essential =
- .label = Fjern fra essensielle
+ .label = Fjern fra Essentials
.accesskey = R
tab-context-zen-replace-pinned-url-with-current =
.label =
{ $isEssential ->
- [true] Erstatt essensiell nettadresse med gjeldende
+ [true] Erstatt Essential nettadresse med gjeldende
*[false] Erstatt festet nettadresse med gjeldende
}
.accesskey = C
@@ -30,7 +30,7 @@ tab-context-zen-edit-title =
tab-context-zen-edit-icon =
.label = Endre ikon...
zen-themes-corrupted = Din { -brand-short-name }-mods fil er skadet. De har blitt tilbakestilt til standardtemaet.
-zen-shortcuts-corrupted = { -brand-short-name } snarvei-filen din er skadet. De har blitt tilbakestilt til standard snarveier.
+zen-shortcuts-corrupted = { -brand-short-name } snarvei-filen din er skadet. De har blitt tilbakestilt til standard-snarveiene.
# note: Do not translate the "
" tags in the following string
zen-new-urlbar-notification =
Det nye nettadressefeltet har blitt aktivert, som tar vekk behovet for nye fanesider.
@@ -46,13 +46,14 @@ zen-general-cancel-label =
.label = Avbryt
zen-general-confirm =
.label = Bekreft
-zen-pinned-tab-replaced = Nettadressen til den festede fanen har blitt erstattet med gjeldende nettadresse!
+zen-pinned-tab-replaced = Festet fanes nettadresse har blit erstattet med gjeldende nettadresse!
zen-tabs-renamed = Fanen har fått nytt navn!
zen-background-tab-opened-toast = Ny bakgrunnsfane åpnet!
zen-workspace-renamed-toast = Arbeidsområdet har fått nytt navn!
+zen-split-view-limit-toast = Kan ikke legge til flere paneler i delt visning!
zen-toggle-compact-mode-button =
- .label = Kompaktmodus
- .tooltiptext = Veksle kompaktmodus
+ .label = Kompakt modus
+ .tooltiptext = Veksle kompakt modus
# note: Do not translate the "
" tags in the following string
@@ -69,7 +70,7 @@ zen-site-data-settings = Innstillinger
zen-generic-manage = Behandle
zen-generic-more = Mer
zen-generic-next = Neste
-zen-essentials-promo-label = Legg til i essensielle
+zen-essentials-promo-label = Legg til i Essentials
zen-essentials-promo-sublabel = Hold favorittfanene dine bare et klikk unna
# These labels will be used for the site data panel settings
zen-site-data-setting-allow = Tillat
diff --git a/locales/nb/browser/browser/zen-split-view.ftl b/locales/nb/browser/browser/zen-split-view.ftl
index 8010baa96..93bf95ad6 100644
--- a/locales/nb/browser/browser/zen-split-view.ftl
+++ b/locales/nb/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Del fane (flere valgte faner trengs)
- *[other] Del { $tabCount } faner
+ [-1] Fordelt fane
+ [1] Legg til delt visning
+ *[other] Spleis { $tabCount } faner
}
.accesskey = S
zen-split-link =
diff --git a/locales/nb/browser/browser/zen-vertical-tabs.ftl b/locales/nb/browser/browser/zen-vertical-tabs.ftl
index 434f68633..c5e89d3e1 100644
--- a/locales/nb/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/nb/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Skjul begge
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Flytt til mappe...
+ .accesskey = Flytt
zen-toolbar-context-new-folder =
.label = Ny mappe
.accesskey = N
diff --git a/locales/nb/browser/browser/zen-welcome.ftl b/locales/nb/browser/browser/zen-welcome.ftl
index 43f4ea7f9..e29b123af 100644
--- a/locales/nb/browser/browser/zen-welcome.ftl
+++ b/locales/nb/browser/browser/zen-welcome.ftl
@@ -6,7 +6,7 @@ zen-welcome-title-line1 = Velkommen til
zen-welcome-title-line2 = et roligere internett
zen-welcome-import-title = En ny start, samme bokmerker
zen-welcome-import-description-1 = Bokmerker, historikken og passordene dine er som en sti av brødsmuler gjennom internettet — ikke la dem ligge igjen!
-zen-welcome-import-description-2 = Overfør dem enkelt fra en annen nettleser og fortsett akkuratt der du slapp.
+zen-welcome-import-description-2 = Overfør dem enkelt fra en annen nettleser og fortsett akkurat der du slapp.
zen-welcome-import-button = Importer nå
zen-welcome-set-default-browser = Sett { -brand-short-name } som din standard nettleser
zen-welcome-dont-set-default-browser = IKKE sett { -brand-short-name } som din standard nettleser
diff --git a/locales/nl/browser/browser/preferences/zen-preferences.ftl b/locales/nl/browser/browser/preferences/zen-preferences.ftl
index 281e9755e..1db60e73f 100644
--- a/locales/nl/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/nl/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM togglen
zen-devtools-toggle-accessibility-shortcut = Toegankelijkheid togglen
zen-close-all-unpinned-tabs-shortcut = Alle niet-vastgezette tabbladen sluiten
zen-new-unsynced-window-shortcut = Nieuw leeg venster
+zen-duplicate-tab-shortcut = Tabblad dupliceren
diff --git a/locales/nl/browser/browser/zen-general.ftl b/locales/nl/browser/browser/zen-general.ftl
index 0f6bb7a16..045faced3 100644
--- a/locales/nl/browser/browser/zen-general.ftl
+++ b/locales/nl/browser/browser/zen-general.ftl
@@ -14,7 +14,7 @@ tab-context-zen-reset-pinned-tab =
tab-context-zen-add-essential =
.label = Toevoegen aan Essentials
.accesskey = E
-tab-context-zen-add-essential-badge = { $num } / { $max } plekken gevuld
+tab-context-zen-add-essential-badge = { $num } / { $max } plekken bezet
tab-context-zen-remove-essential =
.label = Verwijderen uit Essentials
.accesskey = R
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Vastgemaakte tabblad URL is vervangen met de huidige U
zen-tabs-renamed = Tabblad is succesvol hernoemd!
zen-background-tab-opened-toast = Nieuw achtergrondtabblad geopend!
zen-workspace-renamed-toast = Werkruimte succesvol is hernoemd!
+zen-split-view-limit-toast = Kan geen panelen meer toevoegen aan de gesplitste weergave!
zen-toggle-compact-mode-button =
.label = Compacte modus
.tooltiptext = Compacte modus togglen
diff --git a/locales/nl/browser/browser/zen-menubar.ftl b/locales/nl/browser/browser/zen-menubar.ftl
index f42fbea90..7757e34f2 100644
--- a/locales/nl/browser/browser/zen-menubar.ftl
+++ b/locales/nl/browser/browser/zen-menubar.ftl
@@ -19,4 +19,4 @@ zen-menubar-appearance-light =
zen-menubar-appearance-dark =
.label = Donker
zen-menubar-new-blank-window =
- .label = New Blank Window
+ .label = Nieuw blanco venster
diff --git a/locales/nl/browser/browser/zen-split-view.ftl b/locales/nl/browser/browser/zen-split-view.ftl
index 9f0121fba..e700a9f78 100644
--- a/locales/nl/browser/browser/zen-split-view.ftl
+++ b/locales/nl/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Splits tabblad (meerdere geselecteerde tabbladen vereist)
- *[other] Splits { $tabCount } tabbladen
+ [-1] Splits tabbladen op
+ [1] Voeg gesplitste weergave toe...
+ *[other] Voeg { $tabCount } tabbladen samen
}
.accesskey = S
zen-split-link =
diff --git a/locales/nl/browser/browser/zen-vertical-tabs.ftl b/locales/nl/browser/browser/zen-vertical-tabs.ftl
index b46aaaca8..bd2250a67 100644
--- a/locales/nl/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/nl/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Beide verbergen
.accesskey = U
+zen-toolbar-context-move-to-folder =
+ .label = Verplaats naar map...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Nieuwe map
.accesskey = N
@@ -38,7 +41,7 @@ tabbrowser-reset-pin-button =
}
zen-tab-sublabel =
{ $tabSubtitle ->
- [zen-default-pinned] Back to pinned url
- [zen-default-pinned-cmd] Separate from pinned tab
+ [zen-default-pinned] Terug naar vastgezette URL
+ [zen-default-pinned-cmd] Afsplitsen van vastgezette tabblad
*[other] { $tabSubtitle }
}
diff --git a/locales/nl/browser/browser/zen-workspaces.ftl b/locales/nl/browser/browser/zen-workspaces.ftl
index 2d2529937..11ba1aad7 100644
--- a/locales/nl/browser/browser/zen-workspaces.ftl
+++ b/locales/nl/browser/browser/zen-workspaces.ftl
@@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create =
zen-panel-ui-folder-create =
.label = Map aanmaken
zen-panel-ui-live-folder-create =
- .label = Live Folder
+ .label = Live map
zen-panel-ui-new-empty-split =
.label = Nieuwe splitsing
zen-workspaces-panel-context-delete =
@@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile =
zen-workspaces-panel-unload =
.label = Ruimte ontladen
zen-workspaces-panel-unload-others =
- .label = Unload All Other Spaces
+ .label = Alle andere ruimtes ontladen
zen-workspaces-how-to-reorder-title = Hoe ruimtes te herschikken
zen-workspaces-how-to-reorder-desc = Sleep het ruimte icoon onderaan de zijbalk om ze te herschikken
zen-workspaces-change-theme =
diff --git a/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl b/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl
index a9765ae24..61552982c 100644
--- a/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/nn-NO/browser/browser/zen-general.ftl b/locales/nn-NO/browser/browser/zen-general.ftl
index fed8bc947..f4cd42a80 100644
--- a/locales/nn-NO/browser/browser/zen-general.ftl
+++ b/locales/nn-NO/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL.
zen-tabs-renamed = Tab has been successfully renamed!
zen-background-tab-opened-toast = New background tab opened!
zen-workspace-renamed-toast = Workspace has been successfully renamed!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Compact Mode
.tooltiptext = Toggle Compact Mode
diff --git a/locales/nn-NO/browser/browser/zen-split-view.ftl b/locales/nn-NO/browser/browser/zen-split-view.ftl
index 743688eed..4430fab34 100644
--- a/locales/nn-NO/browser/browser/zen-split-view.ftl
+++ b/locales/nn-NO/browser/browser/zen-split-view.ftl
@@ -5,7 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Join Tab (multiple selected tabs needed)
+ [-1] Split out tab
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl b/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl
index 41494167b..cddebc1ee 100644
--- a/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Hide both
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = New Folder
.accesskey = N
diff --git a/locales/pl/browser/browser/preferences/zen-preferences.ftl b/locales/pl/browser/browser/preferences/zen-preferences.ftl
index cb32bb957..32fb99b1b 100644
--- a/locales/pl/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/pl/browser/browser/preferences/zen-preferences.ftl
@@ -98,7 +98,7 @@ zen-vertical-tabs-newtab-top-button-up =
.label = Przenieś przycisk nowej karty na górę
zen-vertical-tabs-expand-tabs-by-default = Rozwiń karty domyślnie
zen-vertical-tabs-dont-expand-tabs-by-default = Nie rozwijaj domyślnie kart
-zen-vertical-tabs-expand-tabs-on-hover = Rozwiń zakładki po najechaniu kursorem (nie działa w trybie kompaktowym)
+zen-vertical-tabs-expand-tabs-on-hover = Rozwiń karty po najechaniu kursorem (nie działa w trybie kompaktowym)
zen-vertical-tabs-expand-tabs-header = Jak rozwinąć karty
zen-vertical-tabs-expand-tabs-description = Wybierz sposób rozwijania kart na pasku bocznym
zen-theme-marketplace-header = Modyfikacje Zen
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Włącz DOM
zen-devtools-toggle-accessibility-shortcut = Włącz Dostępność
zen-close-all-unpinned-tabs-shortcut = Zamknij wszystkie nieprzypięte karty
zen-new-unsynced-window-shortcut = Nowe niesynchronizowane okno
+zen-duplicate-tab-shortcut = Duplikuj kartę
diff --git a/locales/pl/browser/browser/zen-general.ftl b/locales/pl/browser/browser/zen-general.ftl
index 43b723f1e..3d041a34f 100644
--- a/locales/pl/browser/browser/zen-general.ftl
+++ b/locales/pl/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = URL przypiętej karty został zastąpiony bieżącym a
zen-tabs-renamed = Nazwa karty została pomyślnie zmieniona!
zen-background-tab-opened-toast = Nowa karta została otworzona w tle!
zen-workspace-renamed-toast = Zmieniono nazwę przestrzeni roboczej!
+zen-split-view-limit-toast = Nie można dodać kolejnych paneli do widoku podzielonego!
zen-toggle-compact-mode-button =
.label = Tryb kompaktowy
.tooltiptext = Przełącz tryb kompaktowy
diff --git a/locales/pl/browser/browser/zen-split-view.ftl b/locales/pl/browser/browser/zen-split-view.ftl
index 54b7f4722..a706f90eb 100644
--- a/locales/pl/browser/browser/zen-split-view.ftl
+++ b/locales/pl/browser/browser/zen-split-view.ftl
@@ -6,7 +6,7 @@ tab-zen-split-tabs =
.label =
{ $tabCount ->
[-1] Oddziel kartę
- [1] Złącz kartę (wymagane jest zaznaczenie wielu kart)
+ [1] Utwórz widok podzielony
[few] Złącz { $tabCount } karty
*[other] Złącz { $tabCount } kart
}
diff --git a/locales/pl/browser/browser/zen-vertical-tabs.ftl b/locales/pl/browser/browser/zen-vertical-tabs.ftl
index 23c158b23..5b5cb6824 100644
--- a/locales/pl/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/pl/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
zen-toolbar-context-tabs-right =
- .label = Zakładki po prawej
+ .label = Karty po prawej
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Tryb kompaktowy
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Ukryj oba
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Przenieś do folderu...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Nowy folder
.accesskey = N
diff --git a/locales/pl/browser/browser/zen-workspaces.ftl b/locales/pl/browser/browser/zen-workspaces.ftl
index 9b2cfc70d..143622b49 100644
--- a/locales/pl/browser/browser/zen-workspaces.ftl
+++ b/locales/pl/browser/browser/zen-workspaces.ftl
@@ -58,7 +58,7 @@ zen-move-tab-to-workspace-button =
zen-workspaces-panel-context-reorder =
.label = Reorganizuj przestrzenie
zen-workspace-creation-profile = Profil
- .tooltiptext = Profile są wykorzystywane do oddzielenia ciasteczek i danych stron pomiędzy przestrzeniami.
+ .tooltiptext = Profile służą do rozdzielania plików cookie i danych witryny między przestrzeniami.
zen-workspace-creation-header = Utwórz przestrzeń
zen-workspace-creation-label = Przestrzenie są wykorzystywane do zorganizowania kart i sesji.
zen-workspaces-delete-workspace-title = Usunąć przestrzeń?
diff --git a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl
index 14bc467d5..8bc0fee98 100644
--- a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Ativar/Desativar DOM
zen-devtools-toggle-accessibility-shortcut = Ativar/Desativar Acessibilidade
zen-close-all-unpinned-tabs-shortcut = Fechar Todas as Abas Não Fixadas
zen-new-unsynced-window-shortcut = Nova Janela Dessincronizada
+zen-duplicate-tab-shortcut = Duplicar Aba
diff --git a/locales/pt-BR/browser/browser/zen-general.ftl b/locales/pt-BR/browser/browser/zen-general.ftl
index f8ba80093..d1a05e002 100644
--- a/locales/pt-BR/browser/browser/zen-general.ftl
+++ b/locales/pt-BR/browser/browser/zen-general.ftl
@@ -48,6 +48,7 @@ zen-pinned-tab-replaced = A URL da guia fixada foi substituída pela URL atual!
zen-tabs-renamed = A guia foi renomeada com sucesso!
zen-background-tab-opened-toast = Nova guia em segundo plano aberta!
zen-workspace-renamed-toast = A área de trabalho foi renomeada com sucesso!
+zen-split-view-limit-toast = Não é possível adicionar mais painéis à visualização dividida!
zen-toggle-compact-mode-button =
.label = Modo Compacto
.tooltiptext = Alternar Modo Compacto
diff --git a/locales/pt-BR/browser/browser/zen-split-view.ftl b/locales/pt-BR/browser/browser/zen-split-view.ftl
index 83351cef1..9006d5896 100644
--- a/locales/pt-BR/browser/browser/zen-split-view.ftl
+++ b/locales/pt-BR/browser/browser/zen-split-view.ftl
@@ -5,8 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [-1] Dividir aba
- [1] Juntar Aba (necessário várias abas selecionadas)
+ [-1] Dividir Aba
+ [1] Adicionar divisão...
*[other] Juntar { $tabCount } Abas
}
.accesskey = S.O.
diff --git a/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl b/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl
index 19aeefae9..152f25918 100644
--- a/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Esconder os dois
.accesskey = A
+zen-toolbar-context-move-to-folder =
+ .label = Mover para Pasta...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Nova Pasta
.accesskey = N
diff --git a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl
index 4bb041172..8ed17f431 100644
--- a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl
@@ -43,11 +43,11 @@ category-zen-workspaces =
.tooltiptext = { pane-zen-tabs-title }
pane-settings-workspaces-title = Espaços de Trabalho
zen-tabs-select-recently-used-on-close =
- .label = When closing a tab, switch to the most recently used tab instead of the next tab
+ .label = Ao fechar um separador, mudar para o separador usado mais recentemente, em vez do próximo separador
zen-tabs-close-on-back-with-no-history =
.label = Fechar separador e mudar para o seu separador proprietário (ou para o mais recente) quando retroceder
zen-settings-workspaces-sync-unpinned-tabs =
- .label = Sync only pinned tabs in workspaces
+ .label = Sincronizar apenas separadores fixados em espaços de trabalho
zen-tabs-cycle-by-attribute =
.label = Ctrl+Tab percorre apenas nos separadores Essenciais e de Espaço de trabalho
zen-tabs-cycle-ignore-pending-tabs =
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Alternar DOM
zen-devtools-toggle-accessibility-shortcut = Alternar Acessibilidade
zen-close-all-unpinned-tabs-shortcut = Fechar Todos os Separadores Não Fixados
zen-new-unsynced-window-shortcut = Nova janela sem sincronização
+zen-duplicate-tab-shortcut = Duplicar Separador
diff --git a/locales/pt-PT/browser/browser/zen-general.ftl b/locales/pt-PT/browser/browser/zen-general.ftl
index 609ad22f4..c92bfecfe 100644
--- a/locales/pt-PT/browser/browser/zen-general.ftl
+++ b/locales/pt-PT/browser/browser/zen-general.ftl
@@ -7,8 +7,8 @@ unified-extensions-description = As extensões são usadas para trazer funcional
tab-context-zen-reset-pinned-tab =
.label =
{ $isEssential ->
- [true] Reset Essential Tab
- *[false] Reset Pinned Tab
+ [true] Repor Separador Essencial
+ *[false] Repor Separador Fixado
}
.accesskey = R
tab-context-zen-add-essential =
@@ -21,8 +21,8 @@ tab-context-zen-remove-essential =
tab-context-zen-replace-pinned-url-with-current =
.label =
{ $isEssential ->
- [true] Replace Essential URL with Current
- *[false] Replace Pinned URL with Current
+ [true] Substituir URL Essencial com o Atual
+ *[false] Substituir URL Fixado com o Atual
}
.accesskey = C
tab-context-zen-edit-title =
@@ -41,7 +41,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimizar
zen-panel-ui-gradient-generator-custom-color = Cor personalizada
zen-copy-current-url-confirmation = URL atual copiado!
-zen-copy-current-url-as-markdown-confirmation = Copied current URL as Markdown!
+zen-copy-current-url-as-markdown-confirmation = URL atual copiado em Markdown!
zen-general-cancel-label =
.label = Cancelar
zen-general-confirm =
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = O URL do separador fixado foi substituído pelo URL at
zen-tabs-renamed = Nome do separador alterado com sucesso!
zen-background-tab-opened-toast = Novo separador aberto em segundo plano!
zen-workspace-renamed-toast = Nome do espaço de trabalho alterado com sucesso!
+zen-split-view-limit-toast = Não é possível adicionar mais painéis à vista dividida!
zen-toggle-compact-mode-button =
.label = Modo Compacto
.tooltiptext = Alternar Modo Compacto
@@ -123,4 +124,4 @@ zen-window-sync-migration-dialog-message = Agora, o Zen sincroniza as janelas no
zen-window-sync-migration-dialog-learn-more = Saber Mais
zen-window-sync-migration-dialog-accept = Entendido
zen-appmenu-new-blank-window =
- .label = New blank window
+ .label = Nova janela sem sincronização
diff --git a/locales/pt-PT/browser/browser/zen-menubar.ftl b/locales/pt-PT/browser/browser/zen-menubar.ftl
index 0c6919501..c0ac59017 100644
--- a/locales/pt-PT/browser/browser/zen-menubar.ftl
+++ b/locales/pt-PT/browser/browser/zen-menubar.ftl
@@ -19,4 +19,4 @@ zen-menubar-appearance-light =
zen-menubar-appearance-dark =
.label = Escuro
zen-menubar-new-blank-window =
- .label = New Blank Window
+ .label = Nova Janela sem Sincronização
diff --git a/locales/pt-PT/browser/browser/zen-split-view.ftl b/locales/pt-PT/browser/browser/zen-split-view.ftl
index 5983f03f8..e6e9e73f6 100644
--- a/locales/pt-PT/browser/browser/zen-split-view.ftl
+++ b/locales/pt-PT/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Dividir Separadores (selecione vários separadores)
- *[other] Dividir { $tabCount } Separadores
+ [-1] Dividir separador
+ [1] Adicionar vista dividida...
+ *[other] Juntar { $tabCount } Separadores
}
.accesskey = S
zen-split-link =
diff --git a/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl b/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl
index bc873641d..190b4e630 100644
--- a/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Ocultar ambas
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Mover para Pasta...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Nova Pasta
.accesskey = N
@@ -28,7 +31,7 @@ tabbrowser-unload-tab-button =
.tooltiptext =
{ $tabCount ->
[one] Hibernar e mudar para o separador
- *[other] Hibernar { $tabCount } separadores mudar para o primeiro
+ *[other] Hibernar { $tabCount } separadores e mudar para o primeiro
}
tabbrowser-reset-pin-button =
.tooltiptext =
@@ -37,8 +40,8 @@ tabbrowser-reset-pin-button =
*[other] Restaurar e fixar { $tabCount } separadores
}
zen-tab-sublabel =
- { $tabSubtitle ->
- [zen-default-pinned] Back to pinned url
- [zen-default-pinned-cmd] Separate from pinned tab
+ rl{ $tabSubtitle ->
+ [zen-default-pinned] Voltar para URL fixado
+ [zen-default-pinned-cmd] Separar do separador fixado
*[other] { $tabSubtitle }
}
diff --git a/locales/pt-PT/browser/browser/zen-workspaces.ftl b/locales/pt-PT/browser/browser/zen-workspaces.ftl
index c6e36e7f8..985a837c1 100644
--- a/locales/pt-PT/browser/browser/zen-workspaces.ftl
+++ b/locales/pt-PT/browser/browser/zen-workspaces.ftl
@@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create =
zen-panel-ui-folder-create =
.label = Criar Pasta
zen-panel-ui-live-folder-create =
- .label = Live Folder
+ .label = Pasta Viva
zen-panel-ui-new-empty-split =
.label = Nova Divisão
zen-workspaces-panel-context-delete =
@@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile =
zen-workspaces-panel-unload =
.label = Descarregar Espaço
zen-workspaces-panel-unload-others =
- .label = Unload All Other Spaces
+ .label = Descarregar Todos os Outros Espaços
zen-workspaces-how-to-reorder-title = Como reordenar espaços
zen-workspaces-how-to-reorder-desc = Arraste os ícones de espaço na parte inferior da barra lateral para os reordenar
zen-workspaces-change-theme =
diff --git a/locales/ro/browser/browser/preferences/zen-preferences.ftl b/locales/ro/browser/browser/preferences/zen-preferences.ftl
index da9d313b4..ed26f72b8 100644
--- a/locales/ro/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ro/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/ro/browser/browser/zen-general.ftl b/locales/ro/browser/browser/zen-general.ftl
index 21d9a7475..709b4575f 100644
--- a/locales/ro/browser/browser/zen-general.ftl
+++ b/locales/ro/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL!
zen-tabs-renamed = Tab has been successfully renamed!
zen-background-tab-opened-toast = New background tab opened!
zen-workspace-renamed-toast = Workspace has been successfully renamed!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Compact Mode
.tooltiptext = Toggle Compact Mode
diff --git a/locales/ro/browser/browser/zen-split-view.ftl b/locales/ro/browser/browser/zen-split-view.ftl
index 743688eed..4430fab34 100644
--- a/locales/ro/browser/browser/zen-split-view.ftl
+++ b/locales/ro/browser/browser/zen-split-view.ftl
@@ -5,7 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Join Tab (multiple selected tabs needed)
+ [-1] Split out tab
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/ro/browser/browser/zen-vertical-tabs.ftl b/locales/ro/browser/browser/zen-vertical-tabs.ftl
index ff8a3775c..9989c7666 100644
--- a/locales/ro/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ro/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Hide both
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = New Folder
.accesskey = N
diff --git a/locales/ru/browser/browser/preferences/zen-preferences.ftl b/locales/ru/browser/browser/preferences/zen-preferences.ftl
index 78388440c..4942900e9 100644
--- a/locales/ru/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ru/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Переключить DOM
zen-devtools-toggle-accessibility-shortcut = Включить/выключить специальные возможности
zen-close-all-unpinned-tabs-shortcut = Закрыть все не закреплённые вкладки
zen-new-unsynced-window-shortcut = Новое пустое окно
+zen-duplicate-tab-shortcut = Дублировать вкладку
diff --git a/locales/ru/browser/browser/zen-general.ftl b/locales/ru/browser/browser/zen-general.ftl
index f23c9f228..af51df15e 100644
--- a/locales/ru/browser/browser/zen-general.ftl
+++ b/locales/ru/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Адрес закреплённой вкладки з
zen-tabs-renamed = Вкладка успешно переименована!
zen-background-tab-opened-toast = Открыта новая фоновая вкладка!
zen-workspace-renamed-toast = Пространство успешно переименовано!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Компактный режим
.tooltiptext = Переключить компактный режим
diff --git a/locales/ru/browser/browser/zen-split-view.ftl b/locales/ru/browser/browser/zen-split-view.ftl
index 580394f91..b89b20b46 100644
--- a/locales/ru/browser/browser/zen-split-view.ftl
+++ b/locales/ru/browser/browser/zen-split-view.ftl
@@ -5,10 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Разделить вкладку (выберите несколько вкладок)
- [one] Разделить { $tabCount } вкладку
- [few] Разделить { $tabCount } вкладки
- *[other] Разделить { $tabCount } вкладок
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = Ы
zen-split-link =
diff --git a/locales/ru/browser/browser/zen-vertical-tabs.ftl b/locales/ru/browser/browser/zen-vertical-tabs.ftl
index 8f5b9decf..6a9227289 100644
--- a/locales/ru/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ru/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Скрыть оба
.accesskey = Н
+zen-toolbar-context-move-to-folder =
+ .label = Переместить в папку...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Новая папка
.accesskey = Т
diff --git a/locales/sk/browser/browser/preferences/zen-preferences.ftl b/locales/sk/browser/browser/preferences/zen-preferences.ftl
index a88a6104d..91d5cd501 100644
--- a/locales/sk/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/sk/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Prepnúť DOM
zen-devtools-toggle-accessibility-shortcut = Prepnúť prístupnosť
zen-close-all-unpinned-tabs-shortcut = Zatvoriť všetky nepripnuté karty
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/sk/browser/browser/zen-general.ftl b/locales/sk/browser/browser/zen-general.ftl
index 8b99903bc..2768b6852 100644
--- a/locales/sk/browser/browser/zen-general.ftl
+++ b/locales/sk/browser/browser/zen-general.ftl
@@ -48,6 +48,7 @@ zen-pinned-tab-replaced = URL pripnutej karty bola nahradená aktuálnou URL!
zen-tabs-renamed = Karta bola úspešne premenovaná!
zen-background-tab-opened-toast = Nová karta otvorená na pozadí!
zen-workspace-renamed-toast = Pracovný priestor bol úspešne premenovaný!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Kompaktný Režim
.tooltiptext = Prepnúť Kompaktný Režim
diff --git a/locales/sk/browser/browser/zen-split-view.ftl b/locales/sk/browser/browser/zen-split-view.ftl
index 3c7f07d8b..802a8db0f 100644
--- a/locales/sk/browser/browser/zen-split-view.ftl
+++ b/locales/sk/browser/browser/zen-split-view.ftl
@@ -5,7 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Join Tab (multiple selected tabs needed)
+ [-1] Split out tab
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/sk/browser/browser/zen-vertical-tabs.ftl b/locales/sk/browser/browser/zen-vertical-tabs.ftl
index 42ea7be3a..03fab80b1 100644
--- a/locales/sk/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/sk/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Skryť oboje
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Nový Priečinok
.accesskey = N
diff --git a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
index fd3b8b586..5734cbcc6 100644
--- a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Växla DOM
zen-devtools-toggle-accessibility-shortcut = Växla tillgänglighetsinställningar
zen-close-all-unpinned-tabs-shortcut = Stäng alla flikar som inte är fästa
zen-new-unsynced-window-shortcut = Nytt tomt fönster
+zen-duplicate-tab-shortcut = Duplicera flik
diff --git a/locales/sv-SE/browser/browser/zen-general.ftl b/locales/sv-SE/browser/browser/zen-general.ftl
index 61acc0b1c..db279ce9e 100644
--- a/locales/sv-SE/browser/browser/zen-general.ftl
+++ b/locales/sv-SE/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Den fästa flikens URL har ersatts med den aktuella UR
zen-tabs-renamed = Fliken har fått nytt namn!
zen-background-tab-opened-toast = Ny bakgrundsflik öppnad!
zen-workspace-renamed-toast = Arbetsytan har fått ett nytt namn!
+zen-split-view-limit-toast = Kan inte lägga till fler paneler till delad vy!
zen-toggle-compact-mode-button =
.label = Kompakt läge
.tooltiptext = Växla kompakt läge
diff --git a/locales/sv-SE/browser/browser/zen-split-view.ftl b/locales/sv-SE/browser/browser/zen-split-view.ftl
index 9a2208714..6aacf61f4 100644
--- a/locales/sv-SE/browser/browser/zen-split-view.ftl
+++ b/locales/sv-SE/browser/browser/zen-split-view.ftl
@@ -5,9 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [-1] Avdela flikar
- [1] Delad flik (flera valda flikar behövs)
- *[other] Delad { $tabCount } flikar
+ [-1] Dela upp flik
+ [1] Lägg till delad vy...
+ *[other] Gå med i { $tabCount } flikar
}
.accesskey = S
zen-split-link =
diff --git a/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl b/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl
index c474bd227..5d8e94fc6 100644
--- a/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Dölj båda
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Flytta till mapp...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Ny mapp
.accesskey = N
diff --git a/locales/th/browser/browser/preferences/zen-preferences.ftl b/locales/th/browser/browser/preferences/zen-preferences.ftl
index e960be53a..809b5601a 100644
--- a/locales/th/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/th/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/th/browser/browser/zen-general.ftl b/locales/th/browser/browser/zen-general.ftl
index 4fc7e513a..c8f27e979 100644
--- a/locales/th/browser/browser/zen-general.ftl
+++ b/locales/th/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL.
zen-tabs-renamed = Tab has been successfully renamed!
zen-background-tab-opened-toast = New background tab opened!
zen-workspace-renamed-toast = Workspace has been successfully renamed!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = โหมดกะทัดรัด
.tooltiptext = Toggle Compact Mode
diff --git a/locales/th/browser/browser/zen-split-view.ftl b/locales/th/browser/browser/zen-split-view.ftl
index 743688eed..4430fab34 100644
--- a/locales/th/browser/browser/zen-split-view.ftl
+++ b/locales/th/browser/browser/zen-split-view.ftl
@@ -5,7 +5,8 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Join Tab (multiple selected tabs needed)
+ [-1] Split out tab
+ [1] Add split view...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
diff --git a/locales/th/browser/browser/zen-vertical-tabs.ftl b/locales/th/browser/browser/zen-vertical-tabs.ftl
index cc392cbea..f808dd82d 100644
--- a/locales/th/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/th/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = ซ่อนทั้งคู่
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = สร้างโฟลเดอร์ใหม่
.accesskey = N
diff --git a/locales/tr/browser/browser/preferences/zen-preferences.ftl b/locales/tr/browser/browser/preferences/zen-preferences.ftl
index 591473b78..9fe0debf3 100644
--- a/locales/tr/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/tr/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM'u aç/kapat
zen-devtools-toggle-accessibility-shortcut = Erişilebilirliği aç/kapat
zen-close-all-unpinned-tabs-shortcut = Sabitlenmemiş tüm sekmeleri kapat
zen-new-unsynced-window-shortcut = Yeni boş pencere
+zen-duplicate-tab-shortcut = Sekmeyi çoğalt
diff --git a/locales/tr/browser/browser/zen-general.ftl b/locales/tr/browser/browser/zen-general.ftl
index ffe49dd44..111178b6b 100644
--- a/locales/tr/browser/browser/zen-general.ftl
+++ b/locales/tr/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Sabitlenmiş sekmenin URL’si, mevcut URL ile değiş
zen-tabs-renamed = Sekme başarıyla yeniden adlandırıldı!
zen-background-tab-opened-toast = Yeni arka plan sekmesi açıldı!
zen-workspace-renamed-toast = Çalışma alanı başarıyla yeniden adlandırıldı!
+zen-split-view-limit-toast = Bölünmüş görünüme daha fazla panel eklenemiyor!
zen-toggle-compact-mode-button =
.label = Kompakt mod
.tooltiptext = Kompakt modu aç/kapat
diff --git a/locales/tr/browser/browser/zen-split-view.ftl b/locales/tr/browser/browser/zen-split-view.ftl
index ac0cd0fef..c70955488 100644
--- a/locales/tr/browser/browser/zen-split-view.ftl
+++ b/locales/tr/browser/browser/zen-split-view.ftl
@@ -5,9 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [-1] Sekmeleri birleştir
- [1] Sekmeyi böl (birden fazla seçilmiş sekme gerekir)
- *[other] { $tabCount } Sekmeyi Böl
+ [-1] Sekmeyi ayır
+ [1] Bölünmüş görünüme ekle...
+ *[other] { $tabCount } sekmeyi birleştir
}
.accesskey = S
zen-split-link =
diff --git a/locales/tr/browser/browser/zen-vertical-tabs.ftl b/locales/tr/browser/browser/zen-vertical-tabs.ftl
index f80af01e3..47f635615 100644
--- a/locales/tr/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/tr/browser/browser/zen-vertical-tabs.ftl
@@ -6,7 +6,7 @@ zen-toolbar-context-tabs-right =
.label = Sekmeler sağda olsun
.accesskey = R
zen-toolbar-context-compact-mode =
- .label = Kompakt Mod
+ .label = Kompakt mod
zen-toolbar-context-compact-mode-enable =
.label = Kompakt modu aktifleştir
.accesskey = D
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = İkisini de gizle
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Klasöre taşı...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Yeni klasör
.accesskey = N
diff --git a/locales/uk/browser/browser/preferences/zen-preferences.ftl b/locales/uk/browser/browser/preferences/zen-preferences.ftl
index 4a93aa684..3dcce31ba 100644
--- a/locales/uk/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/uk/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Увімк. / Вимк. DOM
zen-devtools-toggle-accessibility-shortcut = Увімк. / Вимк. доступ
zen-close-all-unpinned-tabs-shortcut = Закрити всі відкріплені вкладки
zen-new-unsynced-window-shortcut = Нове несинхронізоване вікно
+zen-duplicate-tab-shortcut = Дублювати вкладку
diff --git a/locales/uk/browser/browser/zen-general.ftl b/locales/uk/browser/browser/zen-general.ftl
index 89c949c3f..a727b433b 100644
--- a/locales/uk/browser/browser/zen-general.ftl
+++ b/locales/uk/browser/browser/zen-general.ftl
@@ -50,6 +50,7 @@ zen-pinned-tab-replaced = URL-адресу закріпленої вкладки
zen-tabs-renamed = Вкладку успішно перейменовано!
zen-background-tab-opened-toast = Відкрито нову фонову вкладку!
zen-workspace-renamed-toast = Робочий простір успішно перейменовано!
+zen-split-view-limit-toast = Неможливо додати більше панелей до розділеного перегляду!
zen-toggle-compact-mode-button =
.label = Компактний режим
.tooltiptext = Увімк. / Вимк. компактний режим
diff --git a/locales/uk/browser/browser/zen-split-view.ftl b/locales/uk/browser/browser/zen-split-view.ftl
index 5c970da09..77ea3247f 100644
--- a/locales/uk/browser/browser/zen-split-view.ftl
+++ b/locales/uk/browser/browser/zen-split-view.ftl
@@ -5,8 +5,10 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Розділити вкладку (потрібно кілька виділених вкладок)
- *[other] Розділити { $tabCount } вкладки
+ [-1] Відокремити вкладку
+ [1] Додати розділений перегляд...
+ [few] Об’єднати { $tabCount } вкладки
+ *[other] Об’єднати { $tabCount } вкладок
}
.accesskey = S
zen-split-link =
diff --git a/locales/uk/browser/browser/zen-vertical-tabs.ftl b/locales/uk/browser/browser/zen-vertical-tabs.ftl
index 97bb9312b..bc42a7fed 100644
--- a/locales/uk/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/uk/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Приховувати обидві
.accesskey = Н
+zen-toolbar-context-move-to-folder =
+ .label = Перемістити до теки...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Нова тека
.accesskey = N
diff --git a/locales/vi/browser/browser/preferences/zen-preferences.ftl b/locales/vi/browser/browser/preferences/zen-preferences.ftl
index 3539717bd..cc89ed45d 100644
--- a/locales/vi/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/vi/browser/browser/preferences/zen-preferences.ftl
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Bật/Tắt DOM
zen-devtools-toggle-accessibility-shortcut = Bật/Tắt trợ năng
zen-close-all-unpinned-tabs-shortcut = Đóng tất cả thẻ chưa ghim
zen-new-unsynced-window-shortcut = Cửa sổ trống mới
+zen-duplicate-tab-shortcut = Duplicate Tab
diff --git a/locales/vi/browser/browser/zen-general.ftl b/locales/vi/browser/browser/zen-general.ftl
index 22b6e477f..71e6413c8 100644
--- a/locales/vi/browser/browser/zen-general.ftl
+++ b/locales/vi/browser/browser/zen-general.ftl
@@ -48,6 +48,7 @@ zen-pinned-tab-replaced = URL của thẻ đã ghim đã được thay thế b
zen-tabs-renamed = Thẻ đã được đổi tên!
zen-background-tab-opened-toast = Một thẻ mới đã được mở dưới nền!
zen-workspace-renamed-toast = Không gian làm việc đã được đổi tên!
+zen-split-view-limit-toast = Can't add more panels to the split view!
zen-toggle-compact-mode-button =
.label = Chế độ thu gọn
.tooltiptext = Bật Chế độ thu gọn
diff --git a/locales/vi/browser/browser/zen-split-view.ftl b/locales/vi/browser/browser/zen-split-view.ftl
index 7a6fbb796..ec563698d 100644
--- a/locales/vi/browser/browser/zen-split-view.ftl
+++ b/locales/vi/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] Chia tab (cần nhiều tab được chọn)
- *[other] Chia { $tabCount } tab
+ [-1] Split out tab
+ [1] Add split view...
+ *[other] Join { $tabCount } Tabs
}
.accesskey = S
zen-split-link =
diff --git a/locales/vi/browser/browser/zen-vertical-tabs.ftl b/locales/vi/browser/browser/zen-vertical-tabs.ftl
index 4f3287af3..ae63b8b3b 100644
--- a/locales/vi/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/vi/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Ẩn cả hai
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = Move to Folder...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = Thư mục mới
.accesskey = N
diff --git a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl
index 48730f6e2..da82d2771 100644
--- a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl
@@ -181,7 +181,7 @@ zenCKSOption-group-mediaAndDisplay = 媒体与显示
zenCKSOption-group-zen-compact-mode = 简洁模式
zenCKSOption-group-zen-workspace = 工作区
zenCKSOption-group-zen-other = Zen 的其它功能
-zenCKSOption-group-zen-split-view = 拆分视图
+zenCKSOption-group-zen-split-view = 分屏视图
zenCKSOption-group-devTools = 开发者工具
zen-key-quick-restart = 快速重启
zen-window-new-shortcut = 新建窗口
@@ -283,10 +283,10 @@ zen-workspace-shortcut-forward = 下一个工作区
zen-workspace-shortcut-backward = 上一个工作区
zen-sidebar-shortcut-toggle = 折叠/展开侧边栏
zen-pinned-tab-shortcut-reset = 重置固定标签页至其固定的 URL
-zen-split-view-shortcut-grid = 切换网格拆分视图
-zen-split-view-shortcut-vertical = 切换垂直拆分视图
-zen-split-view-shortcut-horizontal = 切换水平拆分视图
-zen-split-view-shortcut-unsplit = 关闭拆分视图
+zen-split-view-shortcut-grid = 切换网格分屏视图
+zen-split-view-shortcut-vertical = 切换垂直分屏视图
+zen-split-view-shortcut-horizontal = 切换水平分屏视图
+zen-split-view-shortcut-unsplit = 关闭分屏视图
zen-new-empty-split-view-shortcut = 新建空白分屏视图
zen-key-select-tab-1 = 选择标签页 #1
zen-key-select-tab-2 = 选择标签页 #2
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = 切换 DOM
zen-devtools-toggle-accessibility-shortcut = 切换无障碍环境
zen-close-all-unpinned-tabs-shortcut = 关闭所有未固定的标签页
zen-new-unsynced-window-shortcut = 新建空白窗口
+zen-duplicate-tab-shortcut = 克隆标签页
diff --git a/locales/zh-CN/browser/browser/zen-general.ftl b/locales/zh-CN/browser/browser/zen-general.ftl
index cdc66cb76..0f2a108fc 100644
--- a/locales/zh-CN/browser/browser/zen-general.ftl
+++ b/locales/zh-CN/browser/browser/zen-general.ftl
@@ -48,6 +48,7 @@ zen-pinned-tab-replaced = 固定标签页的网址已更新为当前页面网址
zen-tabs-renamed = 标签页重命名成功!
zen-background-tab-opened-toast = 新的后台标签页已打开 !
zen-workspace-renamed-toast = 工作区重命名成功!
+zen-split-view-limit-toast = 无法在分屏视图中添加更多面板!
zen-toggle-compact-mode-button =
.label = 简洁模式
.tooltiptext = 切换简洁模式
diff --git a/locales/zh-CN/browser/browser/zen-split-view.ftl b/locales/zh-CN/browser/browser/zen-split-view.ftl
index 92e65dd2f..eb2e38c01 100644
--- a/locales/zh-CN/browser/browser/zen-split-view.ftl
+++ b/locales/zh-CN/browser/browser/zen-split-view.ftl
@@ -6,13 +6,13 @@ tab-zen-split-tabs =
.label =
{ $tabCount ->
[-1] 取消分屏标签页
- [1] 分屏标签页(需要选择多个标签页)
+ [1] 添加分屏视图
*[other] 分屏 { $tabCount } 个标签页
}
.accesskey = S
zen-split-link =
.label = 拆分链接到新标签页
.accesskey = S
-zen-split-view-modifier-header = 拆分视图
+zen-split-view-modifier-header = 分屏视图
zen-split-view-modifier-activate-reallocation =
.label = 激活重新分配
diff --git a/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl b/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl
index b8268f043..1ef740980 100644
--- a/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = 两者都隐藏
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = 移动到文件夹…
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = 新建文件夹
.accesskey = N
diff --git a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl
index ed55f391d..0b7a4eb24 100644
--- a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl
@@ -8,9 +8,9 @@ category-zen-looks =
zen-warning-language = 更改預設的語言可能會讓網站更容易的追蹤你。
zen-vertical-tabs-layout-header = 瀏覽器版面配置
zen-vertical-tabs-layout-description = 選擇最適合您的版面
-zen-layout-single-toolbar = 單一工具列
-zen-layout-multiple-toolbar = 多個工具列
-zen-layout-collapsed-toolbar = 摺疊工具列
+zen-layout-single-toolbar = 單一側邊欄
+zen-layout-multiple-toolbar = 側邊欄及頂部工具列
+zen-layout-collapsed-toolbar = 摺疊側邊欄
sync-currently-syncing-workspaces = 工作區
sync-engine-workspaces =
.label = 工作區
@@ -18,7 +18,7 @@ sync-engine-workspaces =
.accesskey = W
zen-glance-title = Glance
zen-glance-header = Glance 一般設定
-zen-glance-description = 無需打開新分頁,即可快速預覽
+zen-glance-description = 無需打開新分頁,即可快速預覽連結
zen-glance-trigger-label = 觸發方式
zen-glance-enabled =
.label = 啟用 Glance
@@ -43,9 +43,9 @@ category-zen-workspaces =
.tooltiptext = { pane-zen-tabs-title }
pane-settings-workspaces-title = 工作區
zen-tabs-select-recently-used-on-close =
- .label = 關閉分頁後,切換至最近造訪過的分頁而非下一個相鄰分頁
+ .label = 關閉分頁後,切換至最近造訪的分頁而非下一個相鄰分頁
zen-tabs-close-on-back-with-no-history =
- .label = 在沒有返回紀錄時,關閉分頁並切換回其來源分頁(或最近使用的分頁)
+ .label = 若沒有上一頁紀錄,返回時關閉分頁並切換為其來源分頁(或最近造訪的分頁)
zen-settings-workspaces-sync-unpinned-tabs =
.label = 僅對工作區中的釘選分頁進行同步
zen-tabs-cycle-by-attribute =
@@ -54,9 +54,9 @@ zen-tabs-cycle-ignore-pending-tabs =
.label = 使用 Ctrl+Tab 切換分頁時,忽略卸載的分頁
zen-tabs-cycle-by-attribute-warning = Ctrl+Tab 將按最近使用順序循環,因為該設定已啟用
zen-look-and-feel-compact-toolbar-themed =
- .label = 將主題顏色套用至折疊工具欄
+ .label = 將主題顏色套用至緊湊模式時的工具欄
zen-workspace-continue-where-left-off =
- .label = 繼續上次的工作階段
+ .label = 從上次最後造訪的分頁繼續開始
pane-zen-pinned-tab-manager-title = 釘選分頁
zen-pinned-tab-manager-header = 釘選分頁的一般設定
zen-pinned-tab-manager-description = 釘選分頁的額外行為
@@ -64,7 +64,7 @@ zen-pinned-tab-manager-restore-pinned-tabs-to-pinned-url =
.label = 啟動時恢復釘選分頁至其初始的網址
zen-pinned-tab-manager-container-specific-essentials-enabled =
.label = 啟用容器專屬 Essentials 功能
-zen-pinned-tab-manager-close-shortcut-behavior-label = 關閉分頁快捷鍵的行為
+zen-pinned-tab-manager-close-shortcut-behavior-label = 使用快捷鍵關閉分頁時,
zen-pinned-tab-manager-reset-unload-switch-close-shortcut-option =
.label = 重置網址,卸載並切換到下一個分頁
zen-pinned-tab-manager-unload-switch-close-shortcut-option =
@@ -83,7 +83,7 @@ zen-settings-workspaces-description = 透過工作區,您能同時擁有多個
zen-settings-workspaces-enabled =
.label = 啟用工作區
zen-settings-workspaces-hide-default-container-indicator =
- .label = 隱藏分頁欄中的容器指標
+ .label = 在分頁欄中隱藏工作區預設的容器指標
zen-key-unsaved = 快捷鍵未儲存!請重新輸入並按下 "Escape" 鍵來儲存快捷鍵。
zen-key-conflict = 與 { $group } -> { $shortcut } 衝突
pane-zen-theme-title = 主題設定
@@ -164,7 +164,7 @@ pane-settings-CKS-title = { -brand-short-name } 快捷鍵
category-zen-marketplace =
.tooltiptext = Zen 模組
zen-settings-CKS-header = 自定義您的快捷鍵
-zen-settings-CKS-description = 依據您的愛好來更改預設的快捷鍵以近一步改善你的瀏覽體驗
+zen-settings-CKS-description = 依據您的愛好來更改預設的快捷鍵以進一步改善瀏覽體驗
zen-settings-CKS-disable-firefox =
.label = 停用 { -brand-short-name } 的預設快捷鍵
zen-settings-CKS-duplicate-shortcut =
@@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = 開啟 DOM
zen-devtools-toggle-accessibility-shortcut = 開啟輔助功能
zen-close-all-unpinned-tabs-shortcut = 關閉所有未釘選的分頁
zen-new-unsynced-window-shortcut = 開新簡白視窗
+zen-duplicate-tab-shortcut = 複製分頁
diff --git a/locales/zh-TW/browser/browser/zen-general.ftl b/locales/zh-TW/browser/browser/zen-general.ftl
index d73909f24..2f32fe5eb 100644
--- a/locales/zh-TW/browser/browser/zen-general.ftl
+++ b/locales/zh-TW/browser/browser/zen-general.ftl
@@ -21,8 +21,8 @@ tab-context-zen-remove-essential =
tab-context-zen-replace-pinned-url-with-current =
.label =
{ $isEssential ->
- [true] 以當前URL替換Essentials
- *[false] 以當前URL替換釘選分頁
+ [true] 以當前網址替換Essentials
+ *[false] 以當前網址替換釘選分頁
}
.accesskey = C
tab-context-zen-edit-title =
@@ -39,7 +39,7 @@ pictureinpicture-minimize-btn =
.tooltip = 最小化
zen-panel-ui-gradient-generator-custom-color = 自訂顏色
zen-copy-current-url-confirmation = 網址已複製到剪貼簿!
-zen-copy-current-url-as-markdown-confirmation = 已以Markdown格式複製當前URL!
+zen-copy-current-url-as-markdown-confirmation = 已以Markdown格式複製當前網址!
zen-general-cancel-label =
.label = 取消
zen-general-confirm =
@@ -48,9 +48,10 @@ zen-pinned-tab-replaced = 釘選分頁網址已替換為當前網址!
zen-tabs-renamed = 已成功重新命名分頁!
zen-background-tab-opened-toast = 已在背景開啟新分頁!
zen-workspace-renamed-toast = 已成功重新命名工作區!
+zen-split-view-limit-toast = 無法加入更多分頁至分割畫面!
zen-toggle-compact-mode-button =
- .label = 簡潔模式
- .tooltiptext = 切換簡潔模式
+ .label = 緊湊模式
+ .tooltiptext = 切換緊湊模式
# note: Do not translate the "
" tags in the following string
diff --git a/locales/zh-TW/browser/browser/zen-split-view.ftl b/locales/zh-TW/browser/browser/zen-split-view.ftl
index f4d7e4837..7072401a8 100644
--- a/locales/zh-TW/browser/browser/zen-split-view.ftl
+++ b/locales/zh-TW/browser/browser/zen-split-view.ftl
@@ -5,8 +5,9 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
- [1] 分割畫面頁籤 (需要選擇多個分頁)
- *[other] 分割 { $tabCount } 個分頁
+ [-1] 將分頁移出分割畫面
+ [1] 新增分割畫面...
+ *[other] 將 { $tabCount } 個分頁組成分割畫面
}
.accesskey = S
zen-split-link =
diff --git a/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl b/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl
index dd94e1d15..9cc2509bd 100644
--- a/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl
@@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = 兩者皆隱藏
.accesskey = H
+zen-toolbar-context-move-to-folder =
+ .label = 移至分頁夾...
+ .accesskey = M
zen-toolbar-context-new-folder =
.label = 新增分頁夾
.accesskey = N
diff --git a/locales/zh-TW/browser/browser/zen-workspaces.ftl b/locales/zh-TW/browser/browser/zen-workspaces.ftl
index 33fd84550..c0a20939b 100644
--- a/locales/zh-TW/browser/browser/zen-workspaces.ftl
+++ b/locales/zh-TW/browser/browser/zen-workspaces.ftl
@@ -6,13 +6,13 @@ zen-panel-ui-workspaces-text = 工作區
zen-panel-ui-spaces-label =
.label = 工作區
zen-panel-ui-workspaces-create =
- .label = 建立工作區
+ .label = 新增工作區
zen-panel-ui-folder-create =
- .label = 建立分頁夾
+ .label = 新增分頁夾
zen-panel-ui-live-folder-create =
- .label = 建立動態分頁夾
+ .label = 新增動態分頁夾
zen-panel-ui-new-empty-split =
- .label = 新分頁分割
+ .label = 新增分割畫面
zen-workspaces-panel-context-delete =
.label = 刪除工作區
.accesskey = D
@@ -54,7 +54,7 @@ zen-workspace-creation-name =
.placeholder = 工作區名稱
zen-move-tab-to-workspace-button =
.label = 移動至…
- .tooltiptext = 將此視窗所有頁面移至單一工作區
+ .tooltiptext = 將此視窗所有分頁移至單一工作區
zen-workspaces-panel-context-reorder =
.label = 排序工作區
zen-workspace-creation-profile = 設定檔
diff --git a/package-lock.json b/package-lock.json
index b794c5098..ed796cc6f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,7 +11,7 @@
"devDependencies": {
"@babel/preset-typescript": "^7.27.0",
"@zen-browser/prettier": "^3.9.3",
- "@zen-browser/surfer": "^1.13.4",
+ "@zen-browser/surfer": "^1.14.6",
"formal-git": "^1.2.9",
"globals": "^16.3.0",
"husky": "^9.1.7",
@@ -868,9 +868,9 @@
}
},
"node_modules/@zen-browser/surfer": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.13.4.tgz",
- "integrity": "sha512-rpwceHYN3k1kaZP+IhAiZ5ksLgedqGv8uo8kqACFR4dDX/DO5P7XoCQtooOPrEyrxcI7uu/gI/xtuldfOBKUkQ==",
+ "version": "1.14.6",
+ "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.6.tgz",
+ "integrity": "sha512-hgTKadIJ/9/9dizHn4229ZZHQckd7D4OR6e7HVkcmtuq1Jke3OAn6SH7u7NjvzvYy35Mb2sXjVUvZEG1ITIfgg==",
"dev": true,
"license": "MPL-2.0",
"dependencies": {
diff --git a/package.json b/package.json
index f5dff7d7a..705e3e515 100644
--- a/package.json
+++ b/package.json
@@ -47,7 +47,7 @@
"devDependencies": {
"@babel/preset-typescript": "^7.27.0",
"@zen-browser/prettier": "^3.9.3",
- "@zen-browser/surfer": "^1.13.4",
+ "@zen-browser/surfer": "^1.14.6",
"formal-git": "^1.2.9",
"globals": "^16.3.0",
"husky": "^9.1.7",
diff --git a/prefs/zen/glance.yaml b/prefs/zen/glance.yaml
index 299e616c7..5788dbca1 100644
--- a/prefs/zen/glance.yaml
+++ b/prefs/zen/glance.yaml
@@ -15,7 +15,7 @@
value: "alt" # ctrl, alt, shift
- name: zen.glance.animation-duration
- value: 300 # in milliseconds
+ value: 350 # in milliseconds
- name: zen.glance.deactivate-docshell-during-animation
- value: true
+ value: false
diff --git a/prefs/zen/split-view.yaml b/prefs/zen/split-view.yaml
index aa02b6def..9448fa486 100644
--- a/prefs/zen/split-view.yaml
+++ b/prefs/zen/split-view.yaml
@@ -15,7 +15,7 @@
value: true
- name: zen.splitView.drag-over-split-delayMC
- value: 350
+ value: 500
- name: zen.splitView.drag-over-split-threshold
- value: 25
+ value: 40
diff --git a/prefs/zen/view.yaml b/prefs/zen/view.yaml
index 1f36da3f0..f5a54e27c 100644
--- a/prefs/zen/view.yaml
+++ b/prefs/zen/view.yaml
@@ -32,7 +32,10 @@
value: false
- name: zen.view.grey-out-inactive-windows
+ cpptype: bool
value: true
+ mirror: always
+ type: static
- name: zen.view.show-newtab-button-top
value: true
diff --git a/scripts/download_pgo_extended_corpus.py b/scripts/download_pgo_extended_corpus.py
new file mode 100644
index 000000000..f8a06190a
--- /dev/null
+++ b/scripts/download_pgo_extended_corpus.py
@@ -0,0 +1,59 @@
+# 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/.
+
+import yaml
+import os
+import requests
+import tarfile
+import hashlib
+
+EXTENDED_CORPUS_KEY="pgo-extended-corpus"
+TASKCLUSTER_PATH=os.path.join("taskcluster", "kinds", "fetch", "benchmarks.yml")
+
+def download_corpus(corpus_url, expected_sha256, output_path):
+ response = requests.get(corpus_url, stream=True)
+ response.raise_for_status()
+
+ os.makedirs(output_path, exist_ok=True)
+ archive_path = os.path.join(output_path, "corpus.tar.gz")
+
+ with open(archive_path, "wb") as f:
+ for chunk in response.iter_content(chunk_size=8192):
+ f.write(chunk)
+
+ # Verify the SHA256 checksum
+ sha256 = hashlib.sha256()
+ with open(archive_path, "rb") as f:
+ for chunk in iter(lambda: f.read(8192), b""):
+ sha256.update(chunk)
+ if sha256.hexdigest() != expected_sha256:
+ os.remove(archive_path)
+ raise ValueError("SHA256 checksum does not match expected value.")
+
+ print("Checksum verified ({}). Extracting corpus...".format(expected_sha256))
+ with tarfile.open(archive_path, "r:gz") as tar:
+ tar.extractall(path=output_path)
+
+ # rename "JetStream-[id]" to just "JetStream"
+ for item in os.listdir(output_path):
+ if item.startswith("JetStream-"):
+ os.rename(os.path.join(output_path, item), os.path.join(output_path, "JetStream"))
+ break
+
+ # Clean up the downloaded archive
+ os.remove(archive_path)
+ print(f"Corpus downloaded and extracted to: {output_path}")
+
+def main():
+ print("\n------------------------------------\n")
+ print("Fetching PGO extended corpus information from Taskcluster...")
+ with open(TASKCLUSTER_PATH, "r", encoding="utf-8") as f:
+ benchmarks = yaml.safe_load(f)
+ corpus_url = benchmarks[EXTENDED_CORPUS_KEY]
+ fetch_info = corpus_url["fetch"]
+ download_corpus(fetch_info["url"], fetch_info["sha256"], "pgo-extended-corpus")
+ print("\n------------------------------------\n")
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/mar_sign.sh b/scripts/mar_sign.sh
index fb47c6a80..48cde3858 100644
--- a/scripts/mar_sign.sh
+++ b/scripts/mar_sign.sh
@@ -17,13 +17,16 @@ generate_certs() {
openssl genrsa -out private_key.pem 4096
# 2. Generate self-signed certificate (required for PKCS#12 bundling)
+ # RFC 5280 "no well-defined expiration" sentinel: 99991231235959Z
openssl req -new -x509 \
-key private_key.pem \
-out cert.pem \
- -subj "/CN=MAR Signing"
+ -subj "/CN=MAR Signing" \
+ -not_before 20000101000000Z \
+ -not_after 99991231235959Z
- # 3. Export public key as SPKI DER (for embedding in updater)
- openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der
+ # 3. Export certificate as DER (for embedding in updater)
+ openssl x509 -in cert.pem -outform DER -out public_key.der
cd ..
mkdir -p "$CERT_PATH_DIR"
@@ -35,9 +38,10 @@ generate_certs() {
base64 -w 0 "$CERT_PATH_DIR"/cert.pem > "$CERT_PATH_DIR"/env/ZEN_SIGNING_CERT_PEM_BASE64
base64 -w 0 "$CERT_PATH_DIR"/private_key.pem > "$CERT_PATH_DIR"/env/ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64
- # Verify public key
- openssl rsa -in "$CERT_PATH_DIR"/public_key.der \
- -pubin -inform DER -text -noout
+ # Make sure no private keys or certs are left
+ # in the public_key.der file, which is the only one that
+ # should be distributed and embedded in the updater
+ openssl x509 -in "$CERT_PATH_DIR"/public_key.der -inform DER -noout -text > /dev/null
rm -rf temp
}
@@ -47,10 +51,22 @@ import_cert() {
echo "Error: public_key.der not found. Run with -g first." >&2
exit 1
fi
- echo "Importing certificate into $UPDATER_CERT_DIR/release_primary.der"
- cp "$CERT_PATH_DIR/public_key.der" "$UPDATER_CERT_DIR/release_primary.der"
- echo "Importing certificate into $UPDATER_CERT_DIR/release_secondary.der"
- cp "$CERT_PATH_DIR/public_key.der" "$UPDATER_CERT_DIR/release_secondary.der"
+ files=(
+ "$UPDATER_CERT_DIR/release_primary.der"
+ "$UPDATER_CERT_DIR/release_secondary.der"
+ "$UPDATER_CERT_DIR/dep1.der"
+ "$UPDATER_CERT_DIR/dep2.der"
+ "$UPDATER_CERT_DIR/xpcshellCertificate.der"
+ )
+ for file in "${files[@]}"; do
+ if [ ! -f "$file" ]; then
+ echo "Error: $file not found. Make sure the updater certificates exist." >&2
+ exit 1
+ fi
+ rm -f "$file"
+ echo "Copying $CERT_PATH_DIR/public_key.der to $file"
+ cp "$CERT_PATH_DIR/public_key.der" "$file"
+ done
echo "Done. Rebuild the updater to embed the new certificate."
}
@@ -113,12 +129,12 @@ update_manifests() {
manifest="linux_update_manifest_aarch64"
elif [[ "$mar_file" == "windows.mar" ]]; then
manifest=".github/workflows/object/windows-x64-signed-x86_64/update_manifest"
- if [ ! -f "$manifest" ]; then
+ if [ ! -d "$manifest" ]; then
manifest="windows_update_manifest_x86_64"
fi
elif [[ "$mar_file" == "windows-arm64.mar" ]]; then
manifest=".github/workflows/object/windows-x64-signed-arm64/update_manifest"
- if [ ! -f "$manifest" ]; then
+ if [ ! -d "$manifest" ]; then
manifest="windows_update_manifest_arm64"
fi
elif [[ "$mar_file" == "macos.mar" ]]; then
@@ -169,10 +185,17 @@ sign_mars() {
folders=(
linux.mar
linux-aarch64.mar
- windows.mar
- windows-arm64.mar
macos.mar
)
+
+ if [ -d ".github/workflows/object/windows-x64-signed-x86_64" ]; then
+ folders+=(".github/workflows/object/windows-x64-signed-x86_64")
+ folders+=(".github/workflows/object/windows-x64-signed-arm64")
+ else
+ folders+=("windows.mar")
+ folders+=("windows-arm64.mar")
+ fi
+
# each folder will contain the .mar files for that platform, and the signature will be written in-place
for folder in "${folders[@]}"; do
if [ -d "$folder" ]; then
diff --git a/scripts/mar_verify.sh b/scripts/mar_verify.sh
new file mode 100755
index 000000000..f9b5d670b
--- /dev/null
+++ b/scripts/mar_verify.sh
@@ -0,0 +1,280 @@
+#!/usr/bin/env bash
+# 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/.
+#
+# Pre-release verification for MAR artifacts.
+#
+# Run this AFTER `scripts/mar_sign.sh -s` and BEFORE publishing a release.
+# It confirms that every MAR we are about to ship is present, non-empty,
+# signed with the cert whose public half lives at build/signing/public_key.der,
+# and that the accompanying update.xml manifest reflects the signed file's
+# current sha512 / size. Exits non-zero on the first verification failure so
+# CI halts before we overwrite a good release with a broken one.
+
+set -euo pipefail
+
+CERT_PATH_DIR="build/signing"
+PUBLIC_KEY_DER="$CERT_PATH_DIR/public_key.der"
+VERIFY_NSS_DIR="$CERT_PATH_DIR/nss_verify"
+LINUX_EXTRACT_DIR="$CERT_PATH_DIR/extracted_linux"
+LINUX_ARCHIVE="zen.linux-x86_64.tar.xz/zen.linux-x86_64.tar.xz"
+
+FAILURES=0
+
+fail() {
+ echo " [FAIL] $*" >&2
+ FAILURES=$((FAILURES + 1))
+}
+
+ok() {
+ echo " [ OK ] $*"
+}
+
+cleanup_verify_db() {
+ rm -rf "$VERIFY_NSS_DIR"
+ rm -rf "$LINUX_EXTRACT_DIR"
+}
+trap cleanup_verify_db EXIT
+
+if [ -z "${SIGNMAR:-}" ]; then
+ echo "Error: SIGNMAR environment variable is not set." >&2
+ exit 1
+fi
+if [ ! -f "$SIGNMAR" ]; then
+ echo "Error: signmar not found at $SIGNMAR." >&2
+ exit 1
+fi
+chmod +x "$SIGNMAR"
+
+if [ ! -f "$PUBLIC_KEY_DER" ]; then
+ echo "Error: $PUBLIC_KEY_DER not found. Run 'mar_sign.sh -g' first." >&2
+ exit 1
+fi
+
+EXPECTED_MAR_CHANNEL="${RELEASE_BRANCH:-}"
+if [ -z "$EXPECTED_MAR_CHANNEL" ]; then
+ echo "Error: RELEASE_BRANCH environment variable is not set (expected 'release' or 'twilight')." >&2
+ exit 1
+fi
+
+# Build a throwaway NSS database that trusts only the signing cert, so
+# signmar -v can verify signatures without the private key being present.
+setup_verify_db() {
+ rm -rf "$VERIFY_NSS_DIR"
+ mkdir -p "$VERIFY_NSS_DIR"
+ local pass="$VERIFY_NSS_DIR/password.txt"
+ : > "$pass"
+ certutil -N -d "$VERIFY_NSS_DIR" -f "$pass"
+ certutil -A -d "$VERIFY_NSS_DIR" -n "mar_sig" -t "CT,C,C" -i "$PUBLIC_KEY_DER"
+}
+
+# Each entry: "||"
+declare -a pairs=(
+ "linux.mar/linux.mar|linux_update_manifest_x86_64|linux-x86_64"
+ "linux-aarch64.mar/linux-aarch64.mar|linux_update_manifest_aarch64|linux-aarch64"
+ "macos.mar/macos.mar|macos_update_manifest|macos"
+)
+
+if [ -d ".github/workflows/object/windows-x64-signed-x86_64" ]; then
+ pairs+=(
+ ".github/workflows/object/windows-x64-signed-x86_64/windows.mar|.github/workflows/object/windows-x64-signed-x86_64/update_manifest|windows-x86_64"
+ ".github/workflows/object/windows-x64-signed-arm64/windows-arm64.mar|.github/workflows/object/windows-x64-signed-arm64/update_manifest|windows-arm64"
+ )
+else
+ pairs+=(
+ "windows.mar/windows.mar|windows_update_manifest_x86_64|windows-x86_64"
+ "windows-arm64.mar/windows-arm64.mar|windows_update_manifest_arm64|windows-arm64"
+ )
+fi
+
+hash_file() {
+ if command -v sha512sum >/dev/null 2>&1; then
+ sha512sum "$1" | awk '{print $1}'
+ else
+ shasum -a 512 "$1" | awk '{print $1}'
+ fi
+}
+
+size_file() {
+ wc -c < "$1" | tr -d ' '
+}
+
+verify_signature() {
+ local mar="$1"
+ if "$SIGNMAR" -d "$VERIFY_NSS_DIR" -n "mar_sig" -v "$mar" >/dev/null 2>&1; then
+ ok "Signature valid: $mar"
+ else
+ fail "Signature INVALID (or missing) for $mar"
+ fi
+}
+
+# Cache signmar -T output per MAR so we only pay for it once per file.
+mar_info() {
+ local mar="$1"
+ "$SIGNMAR" -T "$mar" 2>&1
+}
+
+verify_signature_count() {
+ local mar="$1"
+ local info count
+ info=$(mar_info "$mar")
+ # signmar -T prints one "Signature block found with 1 signature" line per signature block.
+ count=$(echo "$info" | grep -cE '^[[:space:]]*Signature block found with [0-9]+ signature' || true)
+ if [ "$count" != "1" ]; then
+ fail "$mar has $count signatures, expected exactly 1"
+ else
+ ok "$mar has exactly 1 signature"
+ fi
+}
+
+verify_mar_channel() {
+ local mar="$1"
+ local info channel
+ info=$(mar_info "$mar")
+ # Accept either "MAR channel name:" or "MAR channel ID:" — the label
+ # has drifted between Mozilla releases.
+ channel=$(echo "$info" \
+ | grep -iE 'MAR channel (name|id)[[:space:]]*:' \
+ | head -1 \
+ | sed -E 's/.*MAR channel (name|id)[[:space:]]*:[[:space:]]*//I' \
+ | tr -d '[:space:]')
+ if [ -z "$channel" ]; then
+ fail "$mar: could not read MAR channel from product info block"
+ return
+ fi
+ if [ "$channel" != "$EXPECTED_MAR_CHANNEL" ]; then
+ fail "$mar: MAR channel is '$channel', expected '$EXPECTED_MAR_CHANNEL' (RELEASE_BRANCH)"
+ else
+ ok "$mar: MAR channel = $channel"
+ fi
+}
+
+verify_update_settings() {
+ echo ""
+ echo "Checking update-settings.ini in $LINUX_ARCHIVE..."
+ if [ ! -f "$LINUX_ARCHIVE" ]; then
+ fail "Linux build archive not found at $LINUX_ARCHIVE"
+ return
+ fi
+
+ rm -rf "$LINUX_EXTRACT_DIR"
+ mkdir -p "$LINUX_EXTRACT_DIR"
+ if ! tar -xf "$LINUX_ARCHIVE" -C "$LINUX_EXTRACT_DIR"; then
+ fail "Failed to extract $LINUX_ARCHIVE"
+ return
+ fi
+
+ local ini
+ ini=$(find "$LINUX_EXTRACT_DIR" -type f -name "update-settings.ini" | head -1)
+ if [ -z "$ini" ]; then
+ fail "update-settings.ini not found inside $LINUX_ARCHIVE"
+ return
+ fi
+
+ local accepted
+ accepted=$(grep -oP '^ACCEPTED_MAR_CHANNEL_IDS[[:space:]]*=[[:space:]]*\K.*' "$ini" \
+ | head -1 | tr -d '\r')
+ if [ -z "$accepted" ]; then
+ fail "ACCEPTED_MAR_CHANNEL_IDS not set in $ini"
+ return
+ fi
+
+ # ACCEPTED_MAR_CHANNEL_IDS is a comma-separated list; membership is what
+ # the updater enforces, so we check membership rather than strict equality.
+ local found=0 entry
+ IFS=',' read -ra entries <<< "$accepted"
+ for entry in "${entries[@]}"; do
+ entry=$(echo "$entry" | tr -d '[:space:]')
+ if [ "$entry" = "$EXPECTED_MAR_CHANNEL" ]; then
+ found=1
+ break
+ fi
+ done
+
+ if [ "$found" = "1" ]; then
+ ok "update-settings.ini accepts MAR channel '$EXPECTED_MAR_CHANNEL' (ACCEPTED_MAR_CHANNEL_IDS=$accepted)"
+ else
+ fail "update-settings.ini ACCEPTED_MAR_CHANNEL_IDS='$accepted' does not include '$EXPECTED_MAR_CHANNEL'"
+ fi
+}
+
+verify_manifest() {
+ local mar="$1" manifest_dir="$2" label="$3"
+
+ if [ ! -d "$manifest_dir" ]; then
+ fail "$label: manifest directory $manifest_dir not found"
+ return
+ fi
+
+ local xmls
+ xmls=$(find "$manifest_dir" -type f -name "update.xml")
+ if [ -z "$xmls" ]; then
+ fail "$label: no update.xml files found under $manifest_dir"
+ return
+ fi
+
+ local actual_hash actual_size
+ actual_hash=$(hash_file "$mar")
+ actual_size=$(size_file "$mar")
+
+ while IFS= read -r xml; do
+ local xhash xsize xurl
+ xhash=$(grep -oP 'hashValue="\K[^"]+' "$xml" | head -1 || true)
+ xsize=$(grep -oP 'size="\K[^"]+' "$xml" | head -1 || true)
+ xurl=$(grep -oP 'URL="\K[^"]+' "$xml" | head -1 || true)
+ if [ -z "$xhash" ] || [ -z "$xsize" ]; then
+ fail "$label: $xml is missing hashValue or size"
+ continue
+ fi
+ if [ -z "$xurl" ]; then
+ fail "$label: $xml is missing URL attribute"
+ continue
+ fi
+ if ! grep -q 'hashFunction="sha512"' "$xml"; then
+ fail "$label: $xml hashFunction is not sha512"
+ continue
+ fi
+ if [ "$xhash" != "$actual_hash" ]; then
+ fail "$label: hashValue mismatch in $xml"
+ echo " manifest: $xhash" >&2
+ echo " actual: $actual_hash" >&2
+ continue
+ fi
+ if [ "$xsize" != "$actual_size" ]; then
+ fail "$label: size mismatch in $xml (manifest=$xsize, actual=$actual_size)"
+ continue
+ fi
+ ok "$label: $(basename "$xml") matches $mar (size=$actual_size)"
+ done <<< "$xmls"
+}
+
+setup_verify_db
+verify_update_settings
+
+for entry in "${pairs[@]}"; do
+ IFS='|' read -r mar manifest label <<< "$entry"
+ echo ""
+ echo "Verifying $label: $mar"
+
+ if [ ! -f "$mar" ]; then
+ fail "$label: MAR file $mar not found"
+ continue
+ fi
+ if [ ! -s "$mar" ]; then
+ fail "$label: MAR file $mar is empty"
+ continue
+ fi
+
+ verify_signature "$mar"
+ verify_signature_count "$mar"
+ verify_mar_channel "$mar"
+ verify_manifest "$mar" "$manifest" "$label"
+done
+
+echo ""
+if [ "$FAILURES" -gt 0 ]; then
+ echo "Pre-release verification FAILED with $FAILURES issue(s)." >&2
+ exit 1
+fi
+echo "Pre-release verification passed."
diff --git a/src/browser/base/content/browser-box-inc-xhtml.patch b/src/browser/base/content/browser-box-inc-xhtml.patch
index 938d1881c..6f5f7ee91 100644
--- a/src/browser/base/content/browser-box-inc-xhtml.patch
+++ b/src/browser/base/content/browser-box-inc-xhtml.patch
@@ -1,32 +1,40 @@
diff --git a/browser/base/content/browser-box.inc.xhtml b/browser/base/content/browser-box.inc.xhtml
-index d58fcdf99843d110b708f3fbf9fb317787fadfcf..ba37068c52b24c6ebcb835c59b43ca2f1621a001 100644
+index d58fcdf99843d110b708f3fbf9fb317787fadfcf..cfc2aad902641609c3804e615c4cb66ce65299b7 100644
--- a/browser/base/content/browser-box.inc.xhtml
+++ b/browser/base/content/browser-box.inc.xhtml
-@@ -3,6 +3,9 @@
+@@ -3,12 +3,22 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
++#include navigator-toolbox.inc.xhtml
+
+
+
-@@ -25,7 +28,13 @@
-
-
-
+
+
+
+
+
+
+
-+
-
++
++
+
+
+-
+#include zen-tabbrowser-elements.inc.xhtml
-@@ -34,3 +43,5 @@
+@@ -34,3 +44,5 @@
diff --git a/src/browser/base/content/browser-xhtml.patch b/src/browser/base/content/browser-xhtml.patch
index 9abce4268..0dfd8f916 100644
--- a/src/browser/base/content/browser-xhtml.patch
+++ b/src/browser/base/content/browser-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
-index b42287485c2baeabe831b0d54c6f09330b0caabd..6426bb6742401470e4e48b4049cd365e2a5952e8 100644
+index b42287485c2baeabe831b0d54c6f09330b0caabd..e404c2e028e24eb4fa9b97f143ba476c1b1461fd 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -19,6 +19,7 @@
@@ -21,12 +21,12 @@ index b42287485c2baeabe831b0d54c6f09330b0caabd..6426bb6742401470e4e48b4049cd365e
# All sets except for popupsets (commands, keys, and stringbundles)
-@@ -135,9 +138,11 @@
+@@ -135,9 +138,10 @@
+-#include navigator-toolbox.inc.xhtml
+
- #include navigator-toolbox.inc.xhtml
#include browser-box.inc.xhtml
+
diff --git a/src/browser/base/content/zen-assets.inc.xhtml b/src/browser/base/content/zen-assets.inc.xhtml
index b88b74cfe..f67426009 100644
--- a/src/browser/base/content/zen-assets.inc.xhtml
+++ b/src/browser/base/content/zen-assets.inc.xhtml
@@ -39,15 +39,3 @@
# file so that ESLint works correctly:
# tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
-
-# Scripts used all over the browser
-
-
-
-
-
-
-s
-
-
-
diff --git a/src/browser/base/content/zen-preloaded.inc.xhtml b/src/browser/base/content/zen-preloaded.inc.xhtml
index d7893b9e6..dd7e3e9e0 100644
--- a/src/browser/base/content/zen-preloaded.inc.xhtml
+++ b/src/browser/base/content/zen-preloaded.inc.xhtml
@@ -8,5 +8,3 @@
-
-
\ No newline at end of file
diff --git a/src/browser/components/preferences/main-js.patch b/src/browser/components/preferences/main-js.patch
index 16707c082..56517080b 100644
--- a/src/browser/components/preferences/main-js.patch
+++ b/src/browser/components/preferences/main-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
-index 8f8da3c4cabb4a05b50431b1feeff8f1f1abcf6e..97c651cb3728353b9a0d09d1aaa9ba87f8c05b57 100644
+index 8f8da3c4cabb4a05b50431b1feeff8f1f1abcf6e..e57102247eb739ed431bd838a3004b353342defb 100644
--- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js
@@ -2658,6 +2658,11 @@ function createStartupConfig(hidden = false) {
@@ -14,6 +14,15 @@ index 8f8da3c4cabb4a05b50431b1feeff8f1f1abcf6e..97c651cb3728353b9a0d09d1aaa9ba87
{
id: "windowsLaunchOnLogin",
l10nId: "windows-launch-on-login",
+@@ -2755,7 +2760,7 @@ SettingGroupManager.registerGroups({
+ },
+ defaultBrowser: createDefaultBrowserConfig(),
+ startup: createStartupConfig(
+- Services.prefs.getBoolPref("browser.settings-redesign.enabled", false)
++ false
+ ),
+ importBrowserData: {
+ l10nId: "preferences-data-migration-group",
@@ -5174,7 +5179,7 @@ function getBundleForLocales(newLocales) {
])
);
diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch
index 7d341f99a..84ecce245 100644
--- a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch
+++ b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
-index 71921cec2b6aa0f103856c31254fd6c4affefccb..fbb44402e3201a00eb37765d60829828d40e70ea 100644
+index 71921cec2b6aa0f103856c31254fd6c4affefccb..ed13d7e2aa5ff1199872fedbc26494aae463ace4 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -129,6 +129,9 @@ const TAB_EVENTS = [
@@ -350,3 +350,19 @@ index 71921cec2b6aa0f103856c31254fd6c4affefccb..fbb44402e3201a00eb37765d60829828
// Convert any open groups into saved groups.
let groupStateToSave = window.groups.find(
groupState => groupState.id == window.tabs[tIndex].groupId
+@@ -8076,7 +8139,6 @@ var SessionStoreInternal = {
+ timer.initWithCallback(
+ function () {
+ if (beats <= 0) {
+- this._log.debug(`looseTimer of ${delay} timed out`);
+ Glean.sessionRestore.shutdownFlushAllOutcomes.timed_out.add(1);
+ deferred.resolve();
+ }
+@@ -8552,6 +8614,7 @@ var SessionStoreInternal = {
+ if (
+ !savedTabGroupState.tabs.length ||
+ this.getSavedTabGroup(savedTabGroupState.id)
++ && false
+ ) {
+ return;
+ }
diff --git a/src/browser/components/tabbrowser/content/tab-js.patch b/src/browser/components/tabbrowser/content/tab-js.patch
index 06007dfe2..8ac45c8e5 100644
--- a/src/browser/components/tabbrowser/content/tab-js.patch
+++ b/src/browser/components/tabbrowser/content/tab-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
-index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78a831e8ee 100644
+index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..3ac8d2facb224ae39d2199f2c5ec08b77e0c1dfd 100644
--- a/browser/components/tabbrowser/content/tab.js
+++ b/browser/components/tabbrowser/content/tab.js
@@ -21,6 +21,7 @@
@@ -151,7 +151,18 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78
on_click(event) {
if (event.button != 0) {
return;
-@@ -620,11 +659,12 @@
+@@ -617,14 +656,23 @@
+ trigger: "alt_click",
+ });
+ }
++ if (
++ !event.target.classList.contains("tab-close-button") &&
++ !event.target.classList.contains("tab-icon-overlay") &&
++ !event.target.classList.contains("tab-audio-button") &&
++ !this.splitView
++ ) {
++ gZenViewSplitter.contextSplitTabs(this);
++ }
return;
}
@@ -165,7 +176,7 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78
gBrowser.multiSelectedTabsCount > 0 &&
!event.target.classList.contains("tab-close-button") &&
!event.target.classList.contains("tab-icon-overlay") &&
-@@ -636,8 +676,9 @@
+@@ -636,8 +684,9 @@
}
if (
@@ -177,7 +188,7 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78
) {
if (this.activeMediaBlocked) {
if (this.multiselected) {
-@@ -655,7 +696,7 @@
+@@ -655,7 +704,7 @@
return;
}
@@ -186,7 +197,7 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78
if (this.multiselected) {
gBrowser.removeMultiSelectedTabs(
lazy.TabMetrics.userTriggeredContext(
-@@ -675,6 +716,14 @@
+@@ -675,6 +724,14 @@
// (see tabbrowser-tabs 'click' handler).
gBrowser.tabContainer._blockDblClick = true;
}
@@ -201,7 +212,7 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78
}
on_dblclick(event) {
-@@ -698,6 +747,8 @@
+@@ -698,6 +755,8 @@
animate: true,
triggeringEvent: event,
});
diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch
index 1e24da5bd..1eb9d8636 100644
--- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch
+++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
-index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25b964ccbb 100644
+index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..d16fe62c8a67913dd1499b2665a22ff606d98f1e 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -413,6 +413,7 @@
@@ -466,7 +466,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
);
tabsFragment.appendChild(tabGroup.node);
}
-@@ -4598,9 +4729,22 @@
+@@ -4598,9 +4729,23 @@
// to remove the old selected tab.
if (tabToSelect) {
let leftoverTab = this.selectedTab;
@@ -483,13 +483,14 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
+ }
+ }
+ } else {
-+ gZenWorkspaces._keepSelectedTab = true;
++ gZenWorkspaces._keepSelectedTab = !window.__isNewZenWindow;
}
++ delete window.__isNewZenWindow;
+ this._hasAlreadyInitializedZenSessionStore = true;
if (tabs.length > 1 || !tabs[0].selected) {
this._updateTabsAfterInsert();
-@@ -4791,11 +4935,14 @@
+@@ -4791,11 +4936,14 @@
if (ownerTab) {
tab.owner = ownerTab;
}
@@ -505,7 +506,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
if (
!bulkOrderedOpen &&
((openerTab &&
-@@ -4807,7 +4954,7 @@
+@@ -4807,7 +4955,7 @@
let lastRelatedTab =
openerTab && this._lastRelatedTabMap.get(openerTab);
let previousTab = lastRelatedTab || openerTab || this.selectedTab;
@@ -514,7 +515,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
tabGroup = previousTab.group;
}
if (
-@@ -4823,7 +4970,7 @@
+@@ -4823,7 +4971,7 @@
previousTab.splitview
) + 1;
} else if (previousTab.visible) {
@@ -523,7 +524,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
} else if (previousTab == FirefoxViewHandler.tab) {
elementIndex = 0;
}
-@@ -4851,14 +4998,14 @@
+@@ -4851,14 +4999,14 @@
}
// Ensure index is within bounds.
if (tab.pinned) {
@@ -542,7 +543,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
if (pinned && !itemAfter?.pinned) {
itemAfter = null;
-@@ -4875,7 +5022,7 @@
+@@ -4875,7 +5023,7 @@
this.tabContainer._invalidateCachedTabs();
@@ -551,7 +552,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
if (
(this.isTab(itemAfter) && itemAfter.group == tabGroup) ||
this.isSplitViewWrapper(itemAfter)
-@@ -4906,7 +5053,11 @@
+@@ -4906,7 +5054,11 @@
const tabContainer = pinned
? this.tabContainer.pinnedTabsContainer
: this.tabContainer;
@@ -563,7 +564,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
}
if (tab.group?.collapsed) {
-@@ -4921,6 +5072,7 @@
+@@ -4921,6 +5073,7 @@
if (pinned) {
this._updateTabBarForPinnedTabs();
}
@@ -571,7 +572,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
TabBarVisibility.update();
}
-@@ -5469,6 +5621,7 @@
+@@ -5469,6 +5622,7 @@
telemetrySource,
} = {}
) {
@@ -579,7 +580,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
// When 'closeWindowWithLastTab' pref is enabled, closing all tabs
// can be considered equivalent to closing the window.
if (
-@@ -5558,6 +5711,7 @@
+@@ -5558,6 +5712,7 @@
if (lastToClose) {
this.removeTab(lastToClose, aParams);
}
@@ -587,7 +588,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
} catch (e) {
console.error(e);
}
-@@ -5603,6 +5757,13 @@
+@@ -5603,6 +5758,14 @@
return;
}
@@ -597,11 +598,12 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
+ this.selectedTab = newTab;
+ }
+ }
++ animate &&= !aTab.group?.hasAttribute("split-view-group");
+
let isVisibleTab = aTab.visible;
// We have to sample the tab width now, since _beginRemoveTab might
// end up modifying the DOM in such a way that aTab gets a new
-@@ -5610,6 +5771,9 @@
+@@ -5610,6 +5773,9 @@
// state).
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
let isLastTab = this.#isLastTabInWindow(aTab);
@@ -611,7 +613,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
if (
!this._beginRemoveTab(aTab, {
closeWindowFastpath: true,
-@@ -5621,13 +5785,14 @@
+@@ -5621,13 +5787,14 @@
telemetrySource,
})
) {
@@ -627,7 +629,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
let lockTabSizing =
!this.tabContainer.verticalMode &&
!aTab.pinned &&
-@@ -5658,7 +5823,13 @@
+@@ -5658,7 +5825,13 @@
// We're not animating, so we can cancel the animation stopwatch.
Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId);
aTab._closeTimeAnimTimerId = null;
@@ -642,7 +644,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
return;
}
-@@ -5792,7 +5963,7 @@
+@@ -5792,7 +5965,7 @@
closeWindowWithLastTab != null
? closeWindowWithLastTab
: !window.toolbar.visible ||
@@ -651,7 +653,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
if (closeWindow) {
// We've already called beforeunload on all the relevant tabs if we get here,
-@@ -5816,6 +5987,7 @@
+@@ -5816,6 +5989,7 @@
newTab = true;
}
@@ -659,7 +661,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
aTab._endRemoveArgs = [closeWindow, newTab];
// swapBrowsersAndCloseOther will take care of closing the window without animation.
-@@ -5856,13 +6028,7 @@
+@@ -5856,13 +6030,7 @@
aTab._mouseleave();
if (newTab) {
@@ -674,7 +676,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
} else {
TabBarVisibility.update();
}
-@@ -5995,6 +6161,7 @@
+@@ -5995,6 +6163,7 @@
this.tabs[i]._tPos = i;
}
@@ -682,7 +684,15 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
if (!this._windowIsClosing) {
// update tab close buttons state
this.tabContainer._updateCloseButtons();
-@@ -6225,6 +6392,7 @@
+@@ -6180,6 +6349,7 @@
+ memory_after: await getTotalMemoryUsage(),
+ time_to_unload_in_ms: timeElapsed,
+ });
++ return true;
+ }
+
+ /**
+@@ -6225,6 +6395,7 @@
}
let excludeTabs = new Set(aExcludeTabs);
@@ -690,7 +700,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
// If this tab has a successor, it should be selectable, since
// hiding or closing a tab removes that tab as a successor.
-@@ -6237,15 +6405,22 @@
+@@ -6237,15 +6408,22 @@
!excludeTabs.has(aTab.owner) &&
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
) {
@@ -715,7 +725,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
let tab = this.tabContainer.findNextTab(aTab, {
direction: 1,
filter: _tab => remainingTabs.includes(_tab),
-@@ -6259,7 +6434,7 @@
+@@ -6259,7 +6437,7 @@
}
if (tab) {
@@ -724,7 +734,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
}
// If no qualifying visible tab was found, see if there is a tab in
-@@ -6280,7 +6455,7 @@
+@@ -6280,7 +6458,7 @@
});
}
@@ -733,7 +743,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
}
_blurTab(aTab) {
-@@ -6291,7 +6466,7 @@
+@@ -6291,7 +6469,7 @@
* @returns {boolean}
* False if swapping isn't permitted, true otherwise.
*/
@@ -742,7 +752,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
// Do not allow transfering a private tab to a non-private window
// and vice versa.
if (
-@@ -6345,6 +6520,7 @@
+@@ -6345,6 +6523,7 @@
// fire the beforeunload event in the process. Close the other
// window if this was its last tab.
if (
@@ -750,7 +760,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
!remoteBrowser._beginRemoveTab(aOtherTab, {
adoptedByTab: aOurTab,
closeWindowWithLastTab: true,
-@@ -6356,7 +6532,7 @@
+@@ -6356,7 +6535,7 @@
// If this is the last tab of the window, hide the window
// immediately without animation before the docshell swap, to avoid
// about:blank being painted.
@@ -759,7 +769,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
if (closeWindow) {
let win = aOtherTab.ownerGlobal;
win.windowUtils.suppressAnimation(true);
-@@ -6484,11 +6660,13 @@
+@@ -6484,11 +6663,13 @@
}
// Finish tearing down the tab that's going away.
@@ -773,7 +783,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
this.setTabTitle(aOurTab);
-@@ -6690,10 +6868,10 @@
+@@ -6690,10 +6871,10 @@
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
}
@@ -786,7 +796,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
aTab.selected ||
aTab.closing ||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
-@@ -6753,7 +6931,8 @@
+@@ -6753,7 +6934,8 @@
* @param {object} [aOptions={}]
* Key-value pairs that will be serialized into the features string.
*/
@@ -796,7 +806,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
if (this.tabs.length == 1) {
return null;
}
-@@ -6770,7 +6949,7 @@
+@@ -6770,7 +6952,7 @@
// tell a new window to take the "dropped" tab
let args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
args.appendElement(aTab.splitview ?? aTab);
@@ -805,7 +815,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
private: PrivateBrowsingUtils.isWindowPrivate(window),
features: Object.entries(aOptions)
.map(([key, value]) => `${key}=${value}`)
-@@ -6778,6 +6957,8 @@
+@@ -6778,6 +6960,8 @@
openerWindow: window,
args,
});
@@ -814,7 +824,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
}
/**
-@@ -6890,7 +7071,7 @@
+@@ -6890,7 +7074,7 @@
* `true` if element is a ``
*/
isTabGroup(element) {
@@ -823,7 +833,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
}
/**
-@@ -6975,8 +7156,8 @@
+@@ -6975,8 +7159,8 @@
}
// Don't allow mixing pinned and unpinned tabs.
@@ -834,7 +844,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
} else {
tabIndex = Math.max(tabIndex, this.pinnedTabCount);
}
-@@ -7005,13 +7186,19 @@
+@@ -7005,13 +7189,19 @@
this.#handleTabMove(
element,
() => {
@@ -856,7 +866,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
let useAfter = false;
if (this.isTab(element)) {
useAfter = neighbor && tabIndex > element._tPos;
-@@ -7076,23 +7263,31 @@
+@@ -7076,23 +7266,31 @@
#moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) {
if (this.isTabGroupLabel(targetElement)) {
targetElement = targetElement.group;
@@ -894,7 +904,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
} else if (!element.pinned && targetElement && targetElement.pinned) {
// If the caller asks to move an unpinned element next to a pinned
// tab, move the unpinned element to be the first unpinned element
-@@ -7105,12 +7300,35 @@
+@@ -7105,12 +7303,35 @@
// move the tab group right before the first unpinned tab.
// 4. Moving a tab group and the first unpinned tab is grouped:
// move the tab group right before the first unpinned tab's tab group.
@@ -931,7 +941,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
// We want to include the splitview wrapper if it's the targetElement, but
// not in the case where we want to reverse tabs within the same splitview.
-@@ -7119,6 +7337,7 @@
+@@ -7119,6 +7340,7 @@
}
let getContainer = () =>
@@ -939,7 +949,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
element.pinned
? this.tabContainer.pinnedTabsContainer
: this.tabContainer;
-@@ -7127,11 +7346,15 @@
+@@ -7127,11 +7349,15 @@
element,
() => {
if (moveBefore) {
@@ -956,7 +966,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
}
},
metricsContext
-@@ -7205,10 +7428,10 @@
+@@ -7205,11 +7431,15 @@
* @param {TabMetricsContext} [metricsContext]
*/
moveTabToExistingGroup(aTab, aGroup, metricsContext) {
@@ -965,11 +975,17 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
throw new Error("Can only move a tab into a tab group");
}
- if (aTab.pinned) {
+- return;
+ if (aTab.pinned != !!aGroup.pinned) {
- return;
++ if (aGroup.pinned) {
++ this.pinTab(aTab);
++ } else {
++ this.unpinTab(aTab);
++ }
}
if (aTab.group && aTab.group.id === aGroup.id) {
-@@ -7281,6 +7504,7 @@
+ return;
+@@ -7281,6 +7511,7 @@
let state = {
tabIndex: tab._tPos,
@@ -977,7 +993,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
};
if (tab.visible) {
state.elementIndex = tab.elementIndex;
-@@ -7312,7 +7536,7 @@
+@@ -7312,7 +7543,7 @@
let changedSplitView =
previousTabState.splitViewId != currentTabState.splitViewId;
@@ -986,7 +1002,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
tab.dispatchEvent(
new CustomEvent("TabMove", {
bubbles: true,
-@@ -7354,6 +7578,10 @@
+@@ -7354,6 +7585,10 @@
moveActionCallback();
@@ -997,7 +1013,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
// Clear tabs cache after moving nodes because the order of tabs may have
// changed.
this.tabContainer._invalidateCachedTabs();
-@@ -7404,7 +7632,22 @@
+@@ -7404,7 +7639,22 @@
* @returns {object}
* The new tab in the current window, null if the tab couldn't be adopted.
*/
@@ -1021,7 +1037,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
// Swap the dropped tab with a new one we create and then close
// it in the other window (making it seem to have moved between
// windows). We also ensure that the tab we create to swap into has
-@@ -7447,6 +7690,8 @@
+@@ -7447,6 +7697,8 @@
}
params.skipLoad = true;
let newTab = this.addWebTab("about:blank", params);
@@ -1030,7 +1046,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
aTab.container.tabDragAndDrop.finishAnimateTabMove();
-@@ -8149,7 +8394,7 @@
+@@ -8149,7 +8401,7 @@
// preventDefault(). It will still raise the window if appropriate.
return;
}
@@ -1039,7 +1055,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
window.focus();
aEvent.preventDefault();
}
-@@ -8166,7 +8411,6 @@
+@@ -8166,7 +8418,6 @@
on_TabGroupCollapse(aEvent) {
aEvent.target.tabs.forEach(tab => {
@@ -1047,7 +1063,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
});
}
-@@ -8500,7 +8744,9 @@
+@@ -8500,7 +8751,9 @@
let filter = this._tabFilters.get(tab);
if (filter) {
@@ -1057,7 +1073,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
let listener = this._tabListeners.get(tab);
if (listener) {
-@@ -9306,6 +9552,7 @@
+@@ -9306,6 +9559,7 @@
aWebProgress.isTopLevel
) {
this.mTab.setAttribute("busy", "true");
@@ -1065,7 +1081,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
gBrowser._tabAttrModified(this.mTab, ["busy"]);
this.mTab._notselectedsinceload = !this.mTab.selected;
}
-@@ -9386,6 +9633,7 @@
+@@ -9386,6 +9640,7 @@
// known defaults. Note we use the original URL since about:newtab
// redirects to a prerendered page.
const shouldRemoveFavicon =
@@ -1073,7 +1089,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
!this.mBrowser.mIconURL &&
!ignoreBlank &&
!(originalLocation.spec in FAVICON_DEFAULTS);
-@@ -9560,13 +9808,6 @@
+@@ -9560,13 +9815,6 @@
this.mBrowser.originalURI = aRequest.originalURI;
}
@@ -1087,7 +1103,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25
}
let userContextId = this.mBrowser.getAttribute("usercontextid") || 0;
-@@ -10450,7 +10691,7 @@ var TabContextMenu = {
+@@ -10450,7 +10698,7 @@ var TabContextMenu = {
);
contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !this.multiselected;
diff --git a/src/browser/themes/shared/preferences/zen-preferences.css b/src/browser/themes/shared/preferences/zen-preferences.css
index f51d8fbad..f67ae39f7 100644
--- a/src/browser/themes/shared/preferences/zen-preferences.css
+++ b/src/browser/themes/shared/preferences/zen-preferences.css
@@ -498,7 +498,7 @@ groupbox h2 {
#category-ai-features,
#setting-control-supportFirefox,
.mission-message,
-html|setting-group[data-subcategory="layout"] {
+html|setting-group:is([data-subcategory="layout"], [groupid="support"]) {
display: none !important;
}
diff --git a/src/browser/themes/shared/tabbrowser/tabs-css.patch b/src/browser/themes/shared/tabbrowser/tabs-css.patch
index b75e177ea..c639f757b 100644
--- a/src/browser/themes/shared/tabbrowser/tabs-css.patch
+++ b/src/browser/themes/shared/tabbrowser/tabs-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
-index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d3409383217e2ca 100644
+index 203b546933842f4b0134188fda020c4db4dcd0d2..0d67deabac2984574636248a16e58d1669f2e1a4 100644
--- a/browser/themes/shared/tabbrowser/tabs.css
+++ b/browser/themes/shared/tabbrowser/tabs.css
@@ -24,7 +24,7 @@
@@ -97,7 +97,15 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938
&:is([soundplaying], [muted], [activemedia-blocked]) {
display: flex;
}
-@@ -1614,7 +1606,7 @@ tab-group {
+@@ -1048,7 +1040,6 @@ tab-split-view-wrapper[dragtarget] {
+ .tabbrowser-tab:is([image], [pinned]) > .tab-stack > .tab-content[attention]:not([selected]),
+ .tabbrowser-tab > .tab-stack > .tab-content[pinned][titlechanged]:not([selected]),
+ #tabbrowser-tabs[orient="vertical"] .tabbrowser-tab > .tab-stack > .tab-content[titlechanged]:not([selected]) {
+- background-image: radial-gradient(circle, var(--tab-attention-dot-color), var(--tab-attention-dot-color) 2px, transparent 2px);
+ background-position: center bottom 6.5px;
+ background-size: 4px 4px;
+ background-repeat: no-repeat;
+@@ -1614,7 +1605,7 @@ tab-group {
}
#tabbrowser-tabs[orient="vertical"][expanded] {
@@ -106,7 +114,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938
&[movingtab][movingtab-addToGroup]:not([movingtab-group], [movingtab-ungroup]) tab-group > .tabbrowser-tab:is(:active, [multiselected]) {
margin-inline-start: var(--space-medium);
}
-@@ -2089,7 +2081,7 @@ tab-group {
+@@ -2089,7 +2080,7 @@ tab-group {
}
}
@@ -115,7 +123,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938
#vertical-tabs-newtab-button {
appearance: none;
min-height: var(--tab-min-height);
-@@ -2100,7 +2092,7 @@ tab-group {
+@@ -2100,7 +2091,7 @@ tab-group {
margin-inline: var(--tab-inner-inline-margin);
#tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
@@ -124,7 +132,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938
}
&:hover {
-@@ -2124,7 +2116,7 @@ tab-group {
+@@ -2124,7 +2115,7 @@ tab-group {
* flex container. #tabs-newtab-button is a child of the arrowscrollbox where
* we don't want a gap (between tabs), so we have to add some margin.
*/
@@ -133,7 +141,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938
margin-block: var(--tab-block-margin);
}
-@@ -2312,7 +2304,6 @@ tab-group {
+@@ -2312,7 +2303,6 @@ tab-group {
&:not([expanded]) {
.tabbrowser-tab[pinned] {
@@ -141,7 +149,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938
}
.tab-background {
-@@ -2352,8 +2343,8 @@ tab-group {
+@@ -2352,8 +2342,8 @@ tab-group {
display: block;
position: absolute;
inset: auto;
@@ -152,7 +160,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938
&:-moz-window-inactive {
background-image:
-@@ -2438,9 +2429,6 @@ tab-group {
+@@ -2438,9 +2428,6 @@ tab-group {
:root:not([privatebrowsingmode]) :is(toolbarbutton, toolbarpaletteitem) ~ #tabbrowser-tabs,
:root[privatebrowsingmode] :is(toolbarbutton:not(#firefox-view-button), toolbarpaletteitem:not(#wrapper-firefox-view-button)) ~ #tabbrowser-tabs {
@@ -162,7 +170,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938
}
:root[privatebrowsingmode] :is(#firefox-view-button, #menu_openFirefoxView) {
-@@ -2472,7 +2460,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
+@@ -2472,7 +2459,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
list-style-image: url(chrome://global/skin/icons/plus.svg);
}
diff --git a/src/build/moz-configure/lto-pgo-configure.patch b/src/build/moz-configure/lto-pgo-configure.patch
index 5870f5f98..f91a32571 100644
--- a/src/build/moz-configure/lto-pgo-configure.patch
+++ b/src/build/moz-configure/lto-pgo-configure.patch
@@ -1,8 +1,16 @@
diff --git a/build/moz.configure/lto-pgo.configure b/build/moz.configure/lto-pgo.configure
-index df2b0bf0081edfdc2c7bccaefc780d2b0c6555ff..8619fc5fbf284c7a5660d5b7a77494404e448e44 100644
+index df2b0bf0081edfdc2c7bccaefc780d2b0c6555ff..53a3b55de7650799e3730372e72ad7b4bb2eea03 100644
--- a/build/moz.configure/lto-pgo.configure
+++ b/build/moz.configure/lto-pgo.configure
-@@ -256,7 +256,6 @@ option(
+@@ -234,6 +234,7 @@ def moz_pgo_rust(pgo, profile_use, profile_generate, c_compiler):
+ if c_compiler.type == "gcc":
+ die("Cannot use cross-language PGO with GCC.")
+
++ log.info("Enabling cross-language PGO for Rust")
+ return True
+
+
+@@ -256,7 +257,6 @@ option(
help="Indicate that ld64 is free of symbol aliasing bugs",
)
diff --git a/src/toolkit/themes/shared/design-system/src/toolbar-css.patch b/src/toolkit/themes/shared/design-system/src/toolbar-css.patch
new file mode 100644
index 000000000..6a3c8765b
--- /dev/null
+++ b/src/toolkit/themes/shared/design-system/src/toolbar-css.patch
@@ -0,0 +1,12 @@
+diff --git a/toolkit/themes/shared/design-system/src/toolbar.css b/toolkit/themes/shared/design-system/src/toolbar.css
+index 61667b3f778a66b74aa7b169cd646a8437a5dd42..d1a9e5ad121a44f182e7061a21f4bbe9540cae8c 100644
+--- a/toolkit/themes/shared/design-system/src/toolbar.css
++++ b/toolkit/themes/shared/design-system/src/toolbar.css
+@@ -61,7 +61,6 @@
+ --toolbar-field-color: inherit;
+
+ @media (prefers-color-scheme: light) {
+- --toolbar-bgcolor: var(--color-white);
+ }
+ }
+
diff --git a/src/tools/update-packaging/common-sh.patch b/src/tools/update-packaging/common-sh.patch
new file mode 100644
index 000000000..96aefa1cb
--- /dev/null
+++ b/src/tools/update-packaging/common-sh.patch
@@ -0,0 +1,13 @@
+diff --git a/tools/update-packaging/common.sh b/tools/update-packaging/common.sh
+index be2061b98cbba0d472e5f4d03cab2b058b249cb8..caa3379cd09efc2ded9686929fc658985a9dda51 100755
+--- a/tools/update-packaging/common.sh
++++ b/tools/update-packaging/common.sh
+@@ -94,8 +94,6 @@ check_for_add_if_not_update() {
+
+ if [[ "$(basename "$add_if_not_file_chk")" = "channel-prefs.js" || \
+ "$add_if_not_file_chk" =~ (^|/)ChannelPrefs\.framework/ || \
+- "$(basename "$add_if_not_file_chk")" = "update-settings.ini" || \
+- "$add_if_not_file_chk" =~ (^|/)UpdateSettings\.framework/ || \
+ "$(basename "$add_if_not_file_chk")" = "distribution.ini" ]]; then
+ ## "true"
+ return 0;
diff --git a/src/widget/cocoa/VibrancyManager-mm.patch b/src/widget/cocoa/VibrancyManager-mm.patch
index 214d2a3c1..00ea2b670 100644
--- a/src/widget/cocoa/VibrancyManager-mm.patch
+++ b/src/widget/cocoa/VibrancyManager-mm.patch
@@ -1,5 +1,5 @@
diff --git a/widget/cocoa/VibrancyManager.mm b/widget/cocoa/VibrancyManager.mm
-index 5df70a63afb235d2db11712276bb63f756222a0f..8ba0bf1b046f58d9776981e0872a78144bed5139 100644
+index 5df70a63afb235d2db11712276bb63f756222a0f..a2865aa2748433cbfd956ae46d197200fbbcfadd 100644
--- a/widget/cocoa/VibrancyManager.mm
+++ b/widget/cocoa/VibrancyManager.mm
@@ -11,6 +11,7 @@
@@ -10,7 +10,17 @@ index 5df70a63afb235d2db11712276bb63f756222a0f..8ba0bf1b046f58d9776981e0872a7814
using namespace mozilla;
-@@ -36,7 +37,23 @@ static NSVisualEffectMaterial VisualEffectMaterialForVibrancyType(
+@@ -29,6 +30,9 @@ static NSVisualEffectState VisualEffectStateForVibrancyType(
+ case VibrancyType::Sidebar:
+ break;
+ }
++ if (!StaticPrefs::zen_view_grey_out_inactive_windows()) {
++ return NSVisualEffectStateActive;
++ }
+ return NSVisualEffectStateFollowsWindowActiveState;
+ }
+
+@@ -36,7 +40,23 @@ static NSVisualEffectMaterial VisualEffectMaterialForVibrancyType(
VibrancyType aType) {
switch (aType) {
case VibrancyType::Sidebar:
@@ -35,7 +45,7 @@ index 5df70a63afb235d2db11712276bb63f756222a0f..8ba0bf1b046f58d9776981e0872a7814
case VibrancyType::Titlebar:
return NSVisualEffectMaterialTitlebar;
}
-@@ -76,6 +93,7 @@ static NSVisualEffectBlendingMode VisualEffectBlendingModeForVibrancyType(
+@@ -76,6 +96,7 @@ - (NSView*)hitTest:(NSPoint)aPoint {
- (void)prefChanged {
self.blendingMode = VisualEffectBlendingModeForVibrancyType(mType);
@@ -43,7 +53,7 @@ index 5df70a63afb235d2db11712276bb63f756222a0f..8ba0bf1b046f58d9776981e0872a7814
}
@end
-@@ -86,6 +104,7 @@ static void PrefChanged(const char* aPref, void* aClosure) {
+@@ -86,6 +107,7 @@ static void PrefChanged(const char* aPref, void* aClosure) {
static constexpr nsLiteralCString kObservedPrefs[] = {
"widget.macos.sidebar-blend-mode.behind-window"_ns,
"widget.macos.titlebar-blend-mode.behind-window"_ns,
diff --git a/src/zen/common/ZenPreloadedScripts.js b/src/zen/common/ZenPreloadedScripts.js
index 01fa01ddd..559d4c8e4 100644
--- a/src/zen/common/ZenPreloadedScripts.js
+++ b/src/zen/common/ZenPreloadedScripts.js
@@ -7,13 +7,52 @@
{
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenSpaceBookmarksStorage.js", this);
- ChromeUtils.importESModule("chrome://browser/content/ZenStartup.mjs", { global: "current" });
- ChromeUtils.importESModule("resource:///modules/zen/ZenSpaceManager.mjs", { global: "current" });
- ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenCompactMode.mjs", { global: "current" });
- ChromeUtils.importESModule("chrome://browser/content/ZenUIManager.mjs", { global: "current" });
- ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenMods.mjs", { global: "current" });
- ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs", { global: "current" });
- ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenSessionStore.mjs", { global: "current" });
+ let scripts = [
+ "chrome://browser/content/ZenStartup.mjs",
+ "resource:///modules/zen/ZenSpaceManager.mjs",
+ "chrome://browser/content/zen-components/ZenCompactMode.mjs",
+ "chrome://browser/content/ZenUIManager.mjs",
+ "chrome://browser/content/zen-components/ZenMods.mjs",
+ "chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs",
+ "chrome://browser/content/zen-components/ZenSessionStore.mjs",
+ "chrome://browser/content/zen-components/ZenMediaController.mjs",
+ "chrome://browser/content/zen-components/ZenGlanceManager.mjs",
+ "chrome://browser/content/zen-components/ZenPinnedTabManager.mjs",
+ "chrome://browser/content/zen-components/ZenViewSplitter.mjs",
+ "chrome://browser/content/zen-components/ZenFolders.mjs",
+ "chrome://browser/content/zen-components/ZenEmojiPicker.mjs",
+ "chrome://browser/content/zen-components/ZenLiveFoldersUI.mjs",
+ "chrome://browser/content/zen-components/ZenDownloadAnimation.mjs",
+ ];
+
+ for (let script of scripts) {
+ ChromeUtils.importESModule(script, { global: "current" });
+ }
+
+ let customZenElements = [
+ ["zen-folder", "chrome://browser/content/zen-components/ZenFolder.mjs"],
+ ["zen-workspace-creation", "resource:///modules/zen/ZenSpaceCreation.mjs"],
+ ["zen-workspace", "resource:///modules/zen/ZenSpace.mjs"],
+ ["zen-workspace-icons", "resource:///modules/zen/ZenSpaceIcons.mjs"]
+ ];
+
+ document.addEventListener(
+ "DOMContentLoaded",
+ () => {
+ // Only sync-import widgets once the document has loaded. If a widget is
+ // used before DOMContentLoaded it will be imported and upgraded when
+ // registering the customElements.setElementCreationCallback().
+ for (let [tag, script] of customZenElements) {
+ customElements.setElementCreationCallback(
+ tag,
+ function customElementCreationCallback() {
+ ChromeUtils.importESModule(script, { global: "current" });
+ }
+ );
+ }
+ },
+ { once: true }
+ );
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenDragAndDrop.js", this);
}
diff --git a/src/zen/common/modules/ZenStartup.mjs b/src/zen/common/modules/ZenStartup.mjs
index a0611a8df..dd37719f8 100644
--- a/src/zen/common/modules/ZenStartup.mjs
+++ b/src/zen/common/modules/ZenStartup.mjs
@@ -17,7 +17,6 @@ class ZenStartup {
init() {
this.openWatermark();
- this.#changeSidebarLocation();
this.#zenInitBrowserLayout();
}
@@ -147,21 +146,6 @@ class ZenStartup {
});
}
- #changeSidebarLocation() {
- const kElementsToAppend = ["sidebar-splitter", "sidebar-box"];
-
- const browser = document.getElementById("browser");
- browser.prepend(gNavToolbox);
-
- const sidebarPanelWrapper = document.getElementById("tabbrowser-tabbox");
- for (let id of kElementsToAppend) {
- const elem = document.getElementById(id);
- if (elem) {
- sidebarPanelWrapper.prepend(elem);
- }
- }
- }
-
#initUIComponents() {
const kUIComponents = ["ZenProgressBar"];
for (let component of kUIComponents) {
diff --git a/src/zen/common/modules/ZenUIManager.mjs b/src/zen/common/modules/ZenUIManager.mjs
index ff0af0495..5cd2ba2e8 100644
--- a/src/zen/common/modules/ZenUIManager.mjs
+++ b/src/zen/common/modules/ZenUIManager.mjs
@@ -101,10 +101,12 @@ window.gZenUIManager = {
) {
const yValues = rawKeyframes.y || [];
const xValues = rawKeyframes.x || [];
- const scaleValues = rawKeyframes.scale || [];
+ const scaleYValues = rawKeyframes.scaleY || [];
+ const scaleXValues = rawKeyframes.scaleX || [];
delete rawKeyframes.y;
delete rawKeyframes.x;
- delete rawKeyframes.scale;
+ delete rawKeyframes.scaleY;
+ delete rawKeyframes.scaleX;
rawKeyframes.transform = [];
if (
yValues.length !== 0 &&
@@ -116,14 +118,17 @@ window.gZenUIManager = {
const keyframeLength = Math.max(
yValues.length,
xValues.length,
- scaleValues.length
+ scaleYValues.length,
+ scaleXValues.length
);
for (let i = 0; i < keyframeLength; i++) {
const y = yValues[i] !== undefined ? `translateY(${yValues[i]}px)` : "";
const x = xValues[i] !== undefined ? `translateX(${xValues[i]}px)` : "";
- const scale =
- scaleValues[i] !== undefined ? `scale(${scaleValues[i]})` : "";
- rawKeyframes.transform.push(`${x} ${y} ${scale}`.trim());
+ const scaleY =
+ scaleYValues[i] !== undefined ? `scaleY(${scaleYValues[i]})` : "";
+ const scaleX =
+ scaleXValues[i] !== undefined ? `scaleX(${scaleXValues[i]})` : "";
+ rawKeyframes.transform.push(`${x} ${y} ${scaleX} ${scaleY}`.trim());
}
}
let keyframes = [];
@@ -259,7 +264,7 @@ window.gZenUIManager = {
);
gURLBar.style.setProperty(
"--zen-urlbar-width",
- `${Math.min(window.innerWidth / 2, 750)}px`
+ `${Math.min(window.innerWidth / 1.5, 750)}px`
);
gZenVerticalTabsManager.actualWindowButtons.removeAttribute(
"zen-has-hover"
diff --git a/src/zen/common/styles/zen-animations.css b/src/zen/common/styles/zen-animations.css
index 9b0185ada..8e5aaee3e 100644
--- a/src/zen/common/styles/zen-animations.css
+++ b/src/zen/common/styles/zen-animations.css
@@ -58,18 +58,15 @@
}
@keyframes zen-progress-bar-pulse {
- 0% {
- transform: scale(0.8) translate(-50%, -50%);
+ from {
+ transform: scale(0.85) translate(-50%, -50%);
opacity: 0.6;
}
- 50% {
+
+ to {
transform: scale(0.95) translate(-50%, -50%);
opacity: 1;
}
- 100% {
- transform: scale(0.8) translate(-50%, -50%);
- opacity: 0.6;
- }
}
@keyframes zen-progress-bar-long-load {
diff --git a/src/zen/common/styles/zen-browser-container.css b/src/zen/common/styles/zen-browser-container.css
index a8de2b24c..48701b785 100644
--- a/src/zen/common/styles/zen-browser-container.css
+++ b/src/zen/common/styles/zen-browser-container.css
@@ -18,7 +18,7 @@
}
&[transparent="true"] {
- background: light-dark(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1));
+ background: light-dark(rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.1));
}
}
diff --git a/src/zen/common/styles/zen-browser-ui.css b/src/zen/common/styles/zen-browser-ui.css
index f80f6c245..6618d653e 100644
--- a/src/zen/common/styles/zen-browser-ui.css
+++ b/src/zen/common/styles/zen-browser-ui.css
@@ -4,6 +4,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
+body,
#tabbrowser-tabpanels {
background: transparent !important;
}
diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css
index 0a29c1936..9eede5da4 100644
--- a/src/zen/common/styles/zen-omnibox.css
+++ b/src/zen/common/styles/zen-omnibox.css
@@ -268,7 +268,7 @@
background-color: var(--zen-urlbar-background-transparent, var(--zen-urlbar-background-base)) !important;
box-shadow: 0 30px 140px -15px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6)) !important;
backdrop-filter: none !important;
- outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.2)) !important;
+ outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2)) !important;
outline-offset: var(--zen-urlbar-outline-offset) !important;
/* stylelint-disable-next-line media-query-no-invalid */
@@ -300,7 +300,7 @@
:root[zen-single-toolbar="true"] {
--urlbar-icon-border-radius: 8px !important;
- --urlbar-inner-border-radius: var(--toolbarbutton-border-radius) !important;
+ --urlbar-inner-border-radius: 6px !important;
#identity-permission-box > *:not(#zen-site-data-icon-button) {
visibility: collapse;
@@ -517,7 +517,7 @@
margin-left: 0 !important;
margin-right: 12px !important;
padding: 6px !important;
- border-radius: 4px !important;
+ border-radius: 3px !important;
}
.urlbarView-userContext {
@@ -584,6 +584,11 @@
position: relative;
scale: 0.93;
transform-origin: right;
+ opacity: 0.7;
+
+ .urlbarView-row[selected] & {
+ opacity: 1;
+ }
&::after {
content: "";
@@ -635,7 +640,7 @@
}
&[selected] {
- --zen-selected-bg: color-mix(in srgb, var(--zen-primary-color) 55%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50%);
+ --zen-selected-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.1)));
--zen-selected-color: color-mix(in srgb, var(--zen-selected-bg), black 30%);
background-color: var(--zen-selected-bg) !important;
@@ -653,7 +658,7 @@
color: var(--zen-selected-color) !important;
}
- &:where([type="switchtab"], [type="dynamic"], [type^="history"], [type^="autofill_"], [type="top_site"]) .urlbarView-favicon,
+ &:where([type="switchtab"], [type="dynamic"], [type^="history"], [type^="autofill_"], [type="top_site"], [type="bookmark"]) .urlbarView-favicon,
& .urlbarView-shortcutContent {
fill: var(--zen-selected-color) !important;
background-color: rgba(255, 255, 255, 0.9) !important;
diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css
index 0962f4e4a..8ca990552 100644
--- a/src/zen/common/styles/zen-single-components.css
+++ b/src/zen/common/styles/zen-single-components.css
@@ -736,7 +736,7 @@
/* Loading progress bar */
#zen-loading-progress-bar {
- --zen-loading-progress-bar-color: color-mix(in srgb, var(--zen-primary-color), light-dark(rgba(0, 0, 0, 0.7), rgba(255, 255, 255, 0.7)) 70%);
+ --zen-loading-progress-bar-color: color-mix(in srgb, var(--zen-primary-color), light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)) 70%);
position: fixed;
@@ -745,6 +745,7 @@
:root:is([zen-no-padding="true"], [inDOMFullscreen="true"]) & {
top: 4px;
}
+
left: 50%;
transform: translate(-50%, -50%) scale(0);
background: var(--zen-loading-progress-bar-color);
@@ -757,8 +758,10 @@
transform .3s ease-in-out;
overflow: clip;
pointer-events: none;
- animation: zen-progress-bar-pulse 1.5s linear infinite forwards;
+ animation: zen-progress-bar-pulse 1s ease-in-out infinite forwards;
+ animation-direction: alternate;
transform-origin: 0 0;
+ contain: content;
&[long-load="true"] {
opacity: 1;
diff --git a/src/zen/common/styles/zen-theme.css b/src/zen/common/styles/zen-theme.css
index 85abf3bc3..56d40d3cd 100644
--- a/src/zen/common/styles/zen-theme.css
+++ b/src/zen/common/styles/zen-theme.css
@@ -70,18 +70,18 @@
--in-content-primary-button-background: color-mix(
in srgb,
- var(--zen-primary-color) 30%,
- var(--zen-branding-bg-reverse) 70%
+ var(--zen-primary-color) 40%,
+ var(--zen-branding-bg-reverse)
) !important;
--in-content-primary-button-background-hover: color-mix(
in srgb,
- var(--zen-primary-color) 35%,
- var(--zen-branding-bg-reverse) 65%
+ var(--zen-primary-color) 45%,
+ var(--zen-branding-bg-reverse)
) !important;
--in-content-primary-button-background-active: color-mix(
in srgb,
- var(--zen-primary-color) 40%,
- var(--zen-branding-bg-reverse) 60%
+ var(--zen-primary-color) 50%,
+ var(--zen-branding-bg-reverse)
) !important;
--in-content-primary-button-text-color: var(--zen-branding-bg) !important;
--in-content-primary-button-border-color: transparent !important;
@@ -214,7 +214,7 @@
--urlbar-margin-inline: 1px !important;
--tab-icon-overlay-stroke: light-dark(white, black) !important;
- --tab-close-button-padding: 5px !important;
+ --tab-close-button-padding: 4px !important;
--input-border-color: var(--zen-input-border-color) !important;
--zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), #171717);
@@ -250,7 +250,7 @@
--panel-separator-color: color-mix(in srgb, currentColor 15%, transparent) !important;
--zen-big-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
- --zen-active-tab-scale: 0.98;
+ --zen-active-tab-scale: 0.99;
/* Define tab hover background color */
--tab-hover-background-color: var(--toolbarbutton-hover-background);
@@ -258,11 +258,13 @@
/* Sidebar Notifications */
--zen-sidebar-notification-bg: color-mix(
in srgb,
- var(--zen-primary-color) 15%,
+ var(--zen-primary-color) 5%,
light-dark(white, black)
);
--zen-sidebar-notification-shadow: 0 0 6px light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.3));
+ --zen-sidebar-themed-icon-fill: light-dark(color-mix(in srgb, var(--zen-primary-color) 50%, black), color-mix(in srgb, var(--zen-colors-primary) 15%, #ebebeb));
+
--zen-native-inner-radius: var(
--zen-webview-border-radius,
/* Inner radius calculation:
diff --git a/src/zen/common/sys/ui/ZenProgressBar.sys.mjs b/src/zen/common/sys/ui/ZenProgressBar.sys.mjs
index e8fa8157e..511c68c37 100644
--- a/src/zen/common/sys/ui/ZenProgressBar.sys.mjs
+++ b/src/zen/common/sys/ui/ZenProgressBar.sys.mjs
@@ -10,6 +10,7 @@ export class ZenProgressBar extends ZenUIComponent {
#element = null;
#loadingTab = null;
#longLoadTimer = null;
+ #promise = null;
init() {
this.listenBrowserTabsProgress();
@@ -50,7 +51,7 @@ export class ZenProgressBar extends ZenUIComponent {
this.window.gZenUIManager.elementAnimate(
this.#element,
{
- opacity: [0, 0.6],
+ opacity: [0, 0.8],
},
{
duration: 400,
@@ -60,7 +61,8 @@ export class ZenProgressBar extends ZenUIComponent {
return this.#element;
}
- #checkBrowserProgress(webProgress) {
+ async #checkBrowserProgress(webProgress) {
+ await this.#promise;
const window = this.window;
const gBrowser = window.gBrowser;
const tab = gBrowser.getTabForBrowser(webProgress);
@@ -74,7 +76,7 @@ export class ZenProgressBar extends ZenUIComponent {
}
}
- #hideProgressBar() {
+ #hideProgressBar(aInstant = false) {
const progressBar = this.#element;
const window = this.window;
if (this.#longLoadTimer) {
@@ -86,12 +88,15 @@ export class ZenProgressBar extends ZenUIComponent {
if (!progressBar) {
return;
}
+ let { promise, resolve } = Promise.withResolvers();
+ this.#promise = promise;
const callback = () => {
delete progressBar._loadingTab;
progressBar.remove();
this.#element = null;
+ resolve();
};
- if (this.window.gReduceMotion) {
+ if (this.window.gReduceMotion || aInstant) {
callback();
return;
}
@@ -113,6 +118,11 @@ export class ZenProgressBar extends ZenUIComponent {
if (this.#loadingTab === aTab) {
return;
}
+ if (this.#element) {
+ return;
+ }
+ let { promise, resolve } = Promise.withResolvers();
+ this.#promise = promise;
this.#loadingTab = aTab;
const progressBar = this.#progressBar;
progressBar.removeAttribute("fade-out");
@@ -123,5 +133,6 @@ export class ZenProgressBar extends ZenUIComponent {
}
this.#longLoadTimer = null;
}, WAIT_BEFORE_SHOWING_LONG_LOAD);
+ resolve();
}
}
diff --git a/src/zen/drag-and-drop/ZenDragAndDrop.js b/src/zen/drag-and-drop/ZenDragAndDrop.js
index 0e87be0be..b752a266b 100644
--- a/src/zen/drag-and-drop/ZenDragAndDrop.js
+++ b/src/zen/drag-and-drop/ZenDragAndDrop.js
@@ -68,6 +68,7 @@
#maxTabsPerRow = 0;
#changeSpaceTimer = null;
#isAnimatingTabMove = false;
+ #firstHapticFeedbackPlayed = false;
#dragOverSplit = {};
@@ -119,6 +120,12 @@
init() {
super.init();
this.handle_windowDragEnter = this.handle_windowDragEnter.bind(this);
+ if (gZenWorkspaces.workspaceEnabled) {
+ gZenWorkspaces.workspaceIcons.addEventListener(
+ "dragover",
+ this.handle_spaceIconDragOver.bind(this)
+ );
+ }
window.addEventListener(
"dragleave",
this.handle_windowDragLeave.bind(this),
@@ -676,6 +683,31 @@
}
}
+ #onSpaceChanged(spaceChanged, dt) {
+ if (AppConstants.platform !== "macosx") {
+ // See the hack in #createDragImageForTabs for more details which
+ // explains why we need to do this on non-macOS platforms.
+ return;
+ }
+ let tabs = this.originalDragImageArgs[0].children;
+ const { isDarkMode, isExplicitMode } =
+ gZenThemePicker.getGradientForWorkspace(spaceChanged, {
+ getGradient: false,
+ });
+ for (let tab of tabs) {
+ if (isExplicitMode) {
+ tab.style.colorScheme = isDarkMode ? "dark" : "light";
+ } else {
+ tab.style.colorScheme = "";
+ }
+ }
+ requestAnimationFrame(() => {
+ requestAnimationFrame(() => {
+ dt.updateDragImage(...this.originalDragImageArgs);
+ });
+ });
+ }
+
#handle_sidebarDragOver(event) {
const dt = event.dataTransfer;
const draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
@@ -696,28 +728,7 @@
/* Disable wrapping */ true
)
.then(spaceChanged => {
- if (AppConstants.platform !== "macosx") {
- // See the hack in #createDragImageForTabs for more details which
- // explains why we need to do this on non-macOS platforms.
- return;
- }
- let tabs = this.originalDragImageArgs[0].children;
- const { isDarkMode, isExplicitMode } =
- gZenThemePicker.getGradientForWorkspace(spaceChanged, {
- getGradient: false,
- });
- for (let tab of tabs) {
- if (isExplicitMode) {
- tab.style.colorScheme = isDarkMode ? "dark" : "light";
- } else {
- tab.style.colorScheme = "";
- }
- }
- requestAnimationFrame(() => {
- requestAnimationFrame(() => {
- dt.updateDragImage(...this.originalDragImageArgs);
- });
- });
+ this.#onSpaceChanged(spaceChanged, dt);
});
this.#changeSpaceTimer = null;
}, this._dndSwitchSpaceDelay);
@@ -727,6 +738,27 @@
}
}
+ handle_spaceIconDragOver(event) {
+ const dt = event.dataTransfer;
+ const draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
+ if (draggedTab.hasAttribute("zen-essential")) {
+ return;
+ }
+ const target = event.target;
+ const spaceId = target.getAttribute("zen-workspace-id");
+ if (!spaceId) {
+ return;
+ }
+ this.clearDragOverVisuals();
+ const currentSpaceId = gZenWorkspaces.activeWorkspace;
+ if (spaceId === currentSpaceId || gZenWorkspaces._animatingChange) {
+ return;
+ }
+ gZenWorkspaces.changeWorkspaceWithID(spaceId).then(spaceChanged => {
+ this.#onSpaceChanged(spaceChanged, dt);
+ });
+ }
+
#handle_tabDragOverToSplit(event) {
if (!this._dndSplitEnabled) {
return;
@@ -976,6 +1008,12 @@
}
handle_drop_transition(dropElement, draggedTab, movingTabs, dropBefore) {
+ if (
+ dropElement?.hasAttribute("zen-empty-tab") &&
+ dropElement.group?.isZenFolder
+ ) {
+ dropElement = dropElement.group;
+ }
if (isTabGroupLabel(dropElement)) {
dropElement = dropElement.group;
}
@@ -1119,12 +1157,17 @@
// outside of a valid drop target.
ownerGlobal.gZenFolders.highlightGroupOnDragOver(null);
this.ZenDragAndDropService.onDragEnd();
- super.handle_dragend(event);
+ try {
+ super.handle_dragend(event);
+ } catch (e) {
+ console.error(e);
+ }
thisFromGlobal.clearDragOverVisuals();
ownerGlobal.gZenPinnedTabManager.removeTabContainersDragoverClass();
thisFromGlobal._clearDragOverSplit();
this.#maybeClearVerticalPinnedGridDragOver();
thisFromGlobal.originalDragImageArgs = [];
+ this.#firstHapticFeedbackPlayed = false;
window.removeEventListener(
"dragenter",
thisFromGlobal.handle_windowDragEnter,
@@ -1242,13 +1285,13 @@
// Only if there are no normal tabs to drop after
showIndicatorUnderNewTabButton =
lastTab.hasAttribute("zen-empty-tab");
- let useLastPinnd =
+ let useLastPinned =
(hoveringPeriphery ||
(showIndicatorUnderNewTabButton &&
!(pinnedTabsCount - gBrowser._numZenEssentials))) &&
Services.prefs.getBoolPref("zen.view.show-newtab-button-top");
dropElement =
- (useLastPinnd
+ (useLastPinned
? this._tabbrowserTabs.ariaFocusableItems.at(pinnedTabsCount)
: this._tabbrowserTabs.ariaFocusableItems.at(-1)) || lastTab;
}
@@ -1379,6 +1422,12 @@
dropBefore = true;
}
}
+ if (shouldPlayHapticFeedback && !this.#firstHapticFeedbackPlayed) {
+ // The first haptic feedback can often be too annoying,
+ // so we skip it, but play for subsequent dragovers.
+ this.#firstHapticFeedbackPlayed = true;
+ shouldPlayHapticFeedback = false;
+ }
if (shouldPlayHapticFeedback) {
// eslint-disable-next-line mozilla/valid-services
Services.zen.playHapticFeedback();
diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs
index d5a579c4a..fe2b7c2c7 100644
--- a/src/zen/folders/ZenFolders.mjs
+++ b/src/zen/folders/ZenFolders.mjs
@@ -65,9 +65,14 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
}
#initContextMenu() {
- const contextMenuItems = window.MozXULElement.parseXULToFragment(
- ``
- );
+ const contextMenuItems = window.MozXULElement.parseXULToFragment(`
+
+ `);
document.getElementById("context_moveTabToGroup").before(contextMenuItems);
const contextMenuItemsToolbar = window.MozXULElement.parseXULToFragment(
`
@@ -227,6 +232,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
document
.getElementById("zen-context-menu-new-folder-toolbar")
.addEventListener("command", onNewFolder);
+ this.#initMoveTabToFolder();
SessionStore.promiseInitialized.then(() => {
gBrowser.tabContainer.addEventListener(
"dragstart",
@@ -235,6 +241,67 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
});
}
+ #initMoveTabToFolder() {
+ const moveTabToFolderMenu = document.getElementById(
+ "context_zenMoveToFolder"
+ );
+ moveTabToFolderMenu.addEventListener("popupshowing", () => {
+ const separator = moveTabToFolderMenu.querySelector("menuseparator");
+ let tabs = TabContextMenu.contextTab?.multiselected
+ ? gBrowser.selectedTabs
+ : [TabContextMenu.contextTab];
+ let groups = gBrowser.tabGroups.filter(group => {
+ const isZenFolder = group?.isZenFolder;
+ const isLiveFolder = group?.isLiveFolder;
+ const spaceId = group?.getAttribute("zen-workspace-id");
+ if (
+ !isZenFolder ||
+ isLiveFolder ||
+ spaceId !== gZenWorkspaces.activeWorkspace
+ ) {
+ return false;
+ }
+ return !tabs.some(tab => tab.group === group);
+ });
+ separator.hidden = groups.length === 0;
+ for (const group of groups) {
+ const icon = group.iconURL;
+ const menuItem = document.createXULElement("menuitem");
+ menuItem.setAttribute("label", group.label);
+ menuItem.classList.add("context-zen-move-to-folder-item");
+ if (icon) {
+ menuItem.setAttribute("image", icon);
+ }
+ menuItem._group = group;
+ separator.before(menuItem);
+ }
+ });
+
+ moveTabToFolderMenu.addEventListener("popuphidden", () => {
+ const items = moveTabToFolderMenu.querySelectorAll(
+ ".context-zen-move-to-folder-item"
+ );
+ for (const item of items) {
+ delete item._group;
+ item.remove();
+ }
+ });
+
+ moveTabToFolderMenu.addEventListener("command", event => {
+ if (!event.target.classList.contains("context-zen-move-to-folder-item")) {
+ return;
+ }
+ const group = event.target._group;
+ if (!group) {
+ return;
+ }
+ let tabs = TabContextMenu.contextTab?.multiselected
+ ? gBrowser.selectedTabs
+ : [TabContextMenu.contextTab];
+ group.addTabs(tabs);
+ });
+ }
+
handleEvent(aEvent) {
let methodName = `on_${aEvent.type}`;
if (methodName in this) {
@@ -744,8 +811,14 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
const onKeyDown = event => {
// Arrow down and up to navigate through the list
- if (event.key === "ArrowDown" || event.key === "ArrowUp") {
+ if (
+ event.key === "ArrowDown" ||
+ event.key === "ArrowUp" ||
+ event.key === "Tab"
+ ) {
event.preventDefault();
+ let isUp =
+ event.key === "ArrowUp" || (event.key === "Tab" && event.shiftKey);
const items = Array.from(tabsList.children).filter(
item => !item.hidden
);
@@ -755,9 +828,9 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
let index = items.indexOf(
tabsList.querySelector(".folders-tabs-list-item[selected]")
);
- if (event.key === "ArrowDown") {
+ if (!isUp) {
index = (index + 1) % items.length;
- } else if (event.key === "ArrowUp") {
+ } else {
index = (index - 1 + items.length) % items.length;
}
items.forEach(item => item.removeAttribute("selected"));
diff --git a/src/zen/folders/zen-folders.css b/src/zen/folders/zen-folders.css
index cc82d727a..146e94364 100644
--- a/src/zen/folders/zen-folders.css
+++ b/src/zen/folders/zen-folders.css
@@ -177,7 +177,7 @@ zen-folder {
& > label {
width: 100% !important;
border: none !important;
- color: var(--sidebar-text-color) !important;
+ color: var(--toolbar-color) !important;
margin: 0 !important;
font-weight: 600;
align-self: center !important;
diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs
index cd6c8d5d2..9c738cd01 100644
--- a/src/zen/glance/ZenGlanceManager.mjs
+++ b/src/zen/glance/ZenGlanceManager.mjs
@@ -39,8 +39,9 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
ARC_HEIGHT_RATIO: 0.2, // Arc height = distance * ratio (capped at MAX_ARC_HEIGHT)
});
- #GLANCE_ANIMATION_DURATION =
- Services.prefs.getIntPref("zen.glance.animation-duration") / 1000;
+ #GLANCE_ANIMATION_DURATION = Services.prefs.getIntPref(
+ "zen.glance.animation-duration"
+ );
init() {
this.#setupEventListeners();
@@ -294,7 +295,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
{
duration: 0.2,
type: "spring",
- delay: this.#GLANCE_ANIMATION_DURATION - 0.2,
+ delay: this.#GLANCE_ANIMATION_DURATION / 1000 - 0.2,
bounce: 0,
}
);
@@ -450,7 +451,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
opacity: [1, 0.3],
},
{
- duration: this.#GLANCE_ANIMATION_DURATION,
+ duration: this.#GLANCE_ANIMATION_DURATION / 1000,
type: "spring",
bounce: 0.2,
}
@@ -536,13 +537,13 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
// nice fade-in effect to the content. But if it doesn't exist,
// we just fall back to always showing the browser directly.
if (data.elementData) {
- gZenUIManager.motion
- .animate(
+ gZenUIManager
+ .elementAnimate(
this.contentWrapper,
{ opacity: [0, 1] },
{
duration: this.#GLANCE_ANIMATION_DURATION / 4,
- easing: "easeInOut",
+ easing: "ease-in-out",
}
)
.then(() => {
@@ -559,12 +560,12 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
browserElement.zenModeActive = false;
browserElement.docShellIsActive = false;
}
- gZenUIManager.motion
- .animate(this.browserWrapper, arcSequence, {
+ gZenUIManager
+ .elementAnimate(this.browserWrapper, arcSequence, {
duration: gZenUIManager.testingEnabled
? 0
: this.#GLANCE_ANIMATION_DURATION,
- ease: "easeInOut",
+ easing: "ease-in-out",
})
.then(() => {
if (shouldDeactivateDocShell) {
@@ -971,7 +972,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
{
duration: 0.2,
type: "spring",
- bounce: this.#GLANCE_ANIMATION_DURATION - 0.1,
+ bounce: this.#GLANCE_ANIMATION_DURATION / 1000 - 0.1,
}
)
.then(() => {
@@ -1019,7 +1020,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
opacity: [0.3, 1],
},
{
- duration: this.#GLANCE_ANIMATION_DURATION / 1.5,
+ duration: this.#GLANCE_ANIMATION_DURATION / 1000 / 1.5,
type: "spring",
bounce: 0,
}
@@ -1062,10 +1063,10 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
this.browserWrapper.style.width = "";
this.browserWrapper.style.height = "";
- gZenUIManager.motion
- .animate(this.browserWrapper, arcSequence, {
+ gZenUIManager
+ .elementAnimate(this.browserWrapper, arcSequence, {
duration: this.#GLANCE_ANIMATION_DURATION,
- ease: "easeOut",
+ easing: "ease-out",
})
.then(() => {
// Remove element preview after closing animation
@@ -1573,9 +1574,6 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
this.#handleZenFolderPinning();
gBrowser.moveTabAfter(this.#currentTab, this.#currentParentTab);
- const browserRect = window.windowUtils.getBoundsWithoutFlushing(
- this.browserWrapper
- );
this.#prepareTabForFullOpen();
const sidebarButtons = this.browserWrapper.querySelector(
@@ -1596,7 +1594,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
return;
}
- await this.#animateFullOpen(browserRect);
+ await this.#animateFullOpen();
this.finishOpeningGlance();
}
@@ -1632,31 +1630,27 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
/**
* Animate the full opening process
- *
- * @param {object} browserRect - The browser rectangle
*/
- async #animateFullOpen(browserRect) {
+ async #animateFullOpen() {
// Write styles early to avoid flickering
- this.browserWrapper.style.opacity = 1;
- this.browserWrapper.style.width = `${browserRect.width}px`;
- this.browserWrapper.style.height = `${browserRect.height}px`;
+ this.browserWrapper.style.width = "100%";
+ this.browserWrapper.style.height = "100%";
- await gZenUIManager.motion.animate(
- this.browserWrapper,
+ await gZenUIManager.elementAnimate(
+ this.browserWrapper.parentElement,
{
- width: ["80%", "100%"],
- height: ["100%", "100%"],
+ scale: [1, 1.005, 1],
},
{
- duration: this.#GLANCE_ANIMATION_DURATION,
- type: "spring",
- bounce: 0,
+ duration: 250,
+ easing: "ease-in-out",
}
);
+ this.browserWrapper.style.scale = "";
+ this.browserWrapper.style.opacity = "";
this.browserWrapper.style.width = "";
this.browserWrapper.style.height = "";
- this.browserWrapper.style.opacity = "";
gZenViewSplitter.deactivateCurrentSplitView({ removeDeckSelected: true });
}
diff --git a/src/zen/glance/actors/ZenGlanceChild.sys.mjs b/src/zen/glance/actors/ZenGlanceChild.sys.mjs
index 45a3b520a..c5da67cd2 100644
--- a/src/zen/glance/actors/ZenGlanceChild.sys.mjs
+++ b/src/zen/glance/actors/ZenGlanceChild.sys.mjs
@@ -50,6 +50,9 @@ export class ZenGlanceChild extends JSWindowActorChild {
#sendClickDataToParent(node, originalTarget) {
if (!node) {
+ node = originalTarget;
+ }
+ if (!node?.getBoundingClientRect) {
return;
}
// Get the largest element we can get. If the `A` element
diff --git a/src/zen/glance/zen-glance.css b/src/zen/glance/zen-glance.css
index bca099ab7..44bffb1a0 100644
--- a/src/zen/glance/zen-glance.css
+++ b/src/zen/glance/zen-glance.css
@@ -9,6 +9,9 @@
display: flex;
z-index: 999;
+ will-change: transform, opacity;
+ contain: content;
+
top: 15px;
padding: 12px;
gap: 12px;
@@ -121,6 +124,7 @@
&:not([has-finished-animation="true"]) {
will-change: transform;
+ contain: layout size;
transform-origin: 0 0;
#statuspanel {
diff --git a/src/zen/sessionstore/ZenSessionManager.sys.mjs b/src/zen/sessionstore/ZenSessionManager.sys.mjs
index 6ff9860c7..39f2d0eb2 100644
--- a/src/zen/sessionstore/ZenSessionManager.sys.mjs
+++ b/src/zen/sessionstore/ZenSessionManager.sys.mjs
@@ -290,10 +290,13 @@ export class nsZenSessionManager {
console.error("ZenSessionManager: Failed to read session file", e);
}
this.#sidebar = this._dataFromFile || {};
- if (!this.#sidebar.spaces?.length && !this._shouldRunMigration) {
+ if (
+ !this.#sidebarWithoutCloning.spaces?.length &&
+ !this._shouldRunMigration
+ ) {
this.log(
"No spaces data found in session file, running migration",
- this.#sidebar
+ this.#sidebarWithoutCloning
);
// If we have no spaces data, we should run migration
// to restore them from the database. Note we also do a
@@ -304,7 +307,7 @@ export class nsZenSessionManager {
if (
Services.prefs.getBoolPref("zen.session-store.log-tab-entries", false)
) {
- for (const tab of this.#sidebar.tabs || []) {
+ for (const tab of this.#sidebarWithoutCloning.tabs || []) {
this.log("Tab entry in session file:", tab);
}
}
@@ -357,6 +360,11 @@ export class nsZenSessionManager {
if (this._shouldRunMigration) {
initialState = this.#runStateMigration(initialState);
}
+ // Clear the memory of the groups saved in the session file,
+ // as we don't really need them anyways.
+ if (initialState?.savedGroups) {
+ initialState.savedGroups = [];
+ }
if (!lazy.gWindowSyncEnabled) {
if (initialState?.windows?.length && this.#shouldRestoreOnlyPinned) {
this.log("Window sync disabled, restoring only pinned tabs");
@@ -487,7 +495,7 @@ export class nsZenSessionManager {
delete this._migrationData?.recoveryData;
// Restore spaces into the sidebar object if we don't
// have any yet.
- if (!this.#sidebar.spaces?.length) {
+ if (!this.#sidebarWithoutCloning.spaces?.length) {
this.#sidebar = {
...this.#sidebar,
spaces: this._migrationData?.spaces || [],
@@ -712,10 +720,7 @@ export class nsZenSessionManager {
// We only want to collect the sidebar data once from
// a single window, as all windows share the same
// sidebar data.
- let sidebarData = this.#sidebar;
- if (!sidebarData) {
- sidebarData = {};
- }
+ let sidebarData = {};
sidebarData.lastCollected = Date.now();
this.#collectTabsData(sidebarData, aStateWindows);
@@ -895,6 +900,7 @@ export class nsZenSessionManager {
const newState = { windows: [newWindow] };
this.log(`Cloning window with ${newWindow.tabs.length} tabs`);
+ aWindow.__isNewZenWindow = true;
SessionStoreInternal._deferredInitialState = newState;
SessionStoreInternal.initializeWindow(aWindow, newState);
}
diff --git a/src/zen/sessionstore/ZenWindowSync.sys.mjs b/src/zen/sessionstore/ZenWindowSync.sys.mjs
index 564693dca..00b66f2ae 100644
--- a/src/zen/sessionstore/ZenWindowSync.sys.mjs
+++ b/src/zen/sessionstore/ZenWindowSync.sys.mjs
@@ -297,6 +297,18 @@ class nsZenWindowSync {
if (tab.pinned && !tab._zenPinnedInitialState) {
await this.setPinnedTabState(tab);
}
+ // Lets clear extra values to save some memory, we only really
+ // care about the URL and title for the initial state, and we want
+ // to avoid keeping the whole session history around.
+ if (tab._zenPinnedInitialState) {
+ tab._zenPinnedInitialState = {
+ ...tab._zenPinnedInitialState,
+ entry: {
+ url: tab._zenPinnedInitialState.entry.url,
+ title: tab._zenPinnedInitialState.entry.title,
+ },
+ };
+ }
if (
!lazy.gWindowSyncEnabled ||
(lazy.gSyncOnlyPinnedTabs && !tab.pinned)
@@ -731,7 +743,14 @@ class nsZenWindowSync {
return;
}
await this.#styleSwapedBrowsers(aOurTab, aOtherTab, () => {
- this.#swapBrowserDocShellsInner(aOurTab, aOtherTab);
+ try {
+ this.#swapBrowserDocShellsInner(aOurTab, aOtherTab);
+ } catch (e) {
+ console.error(
+ `Error swapping browsers for tabs ${aOurTab.id} and ${aOtherTab.id}:`,
+ e
+ );
+ }
});
}
@@ -795,6 +814,16 @@ class nsZenWindowSync {
);
return false;
}
+ // Theoretical case where we are trying to swap two tabs in the same window.
+ // There has been some reports of this happening in the wild, and while it shouldn't
+ // cause any critical issues, it can cause some weird states and we should avoid it.
+ // For example, see gh-13149
+ if (aOtherTab.ownerGlobal === aOurTab.ownerGlobal) {
+ this.log(
+ `Cannot swap browsers between tabs ${aOurTab.id} and ${aOtherTab.id} because they are in the same window`
+ );
+ return false;
+ }
// Can't swap between chrome and content processes.
if (
aOurTab.linkedBrowser.isRemoteBrowser !=
@@ -1056,10 +1085,17 @@ class nsZenWindowSync {
continue;
}
delete tab._zenContentsVisible;
- this.#swapBrowserDocShellsInner(targetTab, tab, {
- focus: targetTab.selected,
- onClose: true,
- });
+ try {
+ this.#swapBrowserDocShellsInner(targetTab, tab, {
+ focus: targetTab.selected,
+ onClose: true,
+ });
+ } catch (e) {
+ console.error(
+ `Error swapping browsers for tabs ${tab.id} and ${targetTab.id} during close:`,
+ e
+ );
+ }
this.#swapedTabsEntriesForWC.set(
tab.linkedBrowser.permanentKey,
targetTab
@@ -1191,8 +1227,12 @@ class nsZenWindowSync {
activeIndex--;
activeIndex = Math.min(activeIndex, entries.length - 1);
activeIndex = Math.max(activeIndex, 0);
+ let entryToUse = (entries[activeIndex] || entries[0]) ?? null;
const initialState = {
- entry: (entries[activeIndex] || entries[0]) ?? null,
+ entry: {
+ url: entryToUse?.url,
+ title: entryToUse?.title,
+ },
image,
};
this.#runOnAllWindows(null, win => {
diff --git a/src/zen/spaces/ZenGradientGenerator.mjs b/src/zen/spaces/ZenGradientGenerator.mjs
index f2eb7461e..cf3686147 100644
--- a/src/zen/spaces/ZenGradientGenerator.mjs
+++ b/src/zen/spaces/ZenGradientGenerator.mjs
@@ -1258,10 +1258,10 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
let colorToBlendOpacity;
if (this.isMica) {
colorToBlend = this.isDarkMode ? [0, 0, 0] : [255, 255, 255];
- colorToBlendOpacity = 0.25;
+ colorToBlendOpacity = 0.12;
} else if (AppConstants.platform === "macosx") {
colorToBlend = [255, 255, 255];
- colorToBlendOpacity = 0.35;
+ colorToBlendOpacity = 0.18;
}
if (colorToBlend) {
const blendedAlpha = Math.min(
@@ -1473,7 +1473,15 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
* @returns {string} The primary color in hex format.
*/
getAccentColorForUI(accentColor) {
- return `rgb(${accentColor[0]}, ${accentColor[1]}, ${accentColor[2]})`;
+ const [h, s, l] = this.rgbToHsl(...accentColor);
+ if (s < 0.1) {
+ return `rgb(${accentColor[0]}, ${accentColor[1]}, ${accentColor[2]})`;
+ }
+ const saturation = Math.min(1, s + 0.3);
+ const targetLightness = this.isDarkMode ? 0.62 : 0.42;
+ const lightness = l * 0.4 + targetLightness * 0.6;
+ const [r, g, b] = this.hslToRgb(h / 360, saturation, lightness);
+ return `rgb(${r}, ${g}, ${b})`;
}
getMostDominantColor(allColors) {
@@ -1485,9 +1493,13 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
return color;
}
- getToolbarColor(isDarkMode = false) {
+ getToolbarColor(isDarkMode = false, accentColor = null) {
const opacity = 0.8;
- return isDarkMode ? [255, 255, 255, opacity] : [0, 0, 0, opacity]; // Default toolbar
+ let baseColor = isDarkMode ? [255, 255, 255, opacity] : [0, 0, 0, opacity]; // Default toolbar
+ if (accentColor) {
+ return this.blendColors(baseColor.slice(0, 3), accentColor, 75).concat(1);
+ }
+ return baseColor;
}
get browserBackgroundElement() {
@@ -1748,7 +1760,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
}
}
// Set `--toolbox-textcolor` to have a contrast with the primary color
- const textColor = this.getToolbarColor(isDarkMode);
+ let textColor = this.getToolbarColor(isDarkMode, dominantColor);
docElement.style.setProperty(
"--toolbox-textcolor",
`rgba(${textColor[0]}, ${textColor[1]}, ${textColor[2]}, ${textColor[3]})`
@@ -1994,7 +2006,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
grain: theme.texture ?? 0,
isDarkMode,
isExplicitMode,
- toolbarColor: this.getToolbarColor(isDarkMode),
+ toolbarColor: this.getToolbarColor(isDarkMode, dominantColor),
primaryColor: this.getAccentColorForUI(dominantColor),
};
this.currentOpacity = previousOpacity;
diff --git a/src/zen/spaces/ZenSpaceManager.mjs b/src/zen/spaces/ZenSpaceManager.mjs
index daa8f3f08..dc9c2b660 100644
--- a/src/zen/spaces/ZenSpaceManager.mjs
+++ b/src/zen/spaces/ZenSpaceManager.mjs
@@ -1602,7 +1602,6 @@ class nsZenWorkspaces {
}
#prepareNewWorkspace(space) {
- document.documentElement.setAttribute("zen-workspace-id", space.uuid);
let tabCount = 0;
for (let tab of gBrowser.tabs) {
const isEssential = tab.getAttribute("zen-essential") === "true";
@@ -1643,12 +1642,12 @@ class nsZenWorkspaces {
async changeWorkspaceWithID(workspaceID, ...args) {
const workspace = this.getWorkspaceFromId(workspaceID);
- await this.changeWorkspace(workspace, ...args);
+ return await this.changeWorkspace(workspace, ...args);
}
async changeWorkspace(workspace, ...args) {
if (!this.workspaceEnabled) {
- return;
+ return workspace;
}
this.#currentSpaceSwitchContext.animations.forEach(animation => {
animation.complete();
@@ -1668,6 +1667,7 @@ class nsZenWorkspaces {
}
this.#inChangingWorkspace = false;
resolve();
+ return workspace;
}
_cancelSwipeAnimation() {
@@ -2429,9 +2429,6 @@ class nsZenWorkspaces {
tabToSelect,
{ previousWorkspaceIndex, previousWorkspace } = {}
) {
- // Update document state
- document.documentElement.setAttribute("zen-workspace-id", workspace.uuid);
-
// Recalculate new tab observers
gBrowser.tabContainer.observe(
null,
@@ -2975,8 +2972,7 @@ class nsZenWorkspaces {
}
let nextWorkspace = workspaces[targetIndex];
- await this.changeWorkspace(nextWorkspace, { whileScrolling });
- return nextWorkspace;
+ return await this.changeWorkspace(nextWorkspace, { whileScrolling });
}
#initializeWorkspaceTabContextMenus() {
@@ -3000,9 +2996,8 @@ class nsZenWorkspaces {
? gBrowser.selectedTabs
: [TabContextMenu.contextTab];
document.getElementById("tabContextMenu").hidePopup();
- const previousWorkspaceID =
- document.documentElement.getAttribute("zen-workspace-id");
for (let tab of tabs) {
+ const previousWorkspaceID = tab.getAttribute("zen-workspace-id");
this.moveTabToWorkspace(tab, workspaceID);
if (this.lastSelectedWorkspaceTabs[previousWorkspaceID] === tab) {
// This tab is no longer the last selected tab in the previous workspace because it's being moved to
diff --git a/src/zen/spaces/ZenSpacesSwipe.mjs b/src/zen/spaces/ZenSpacesSwipe.mjs
index dca3359b7..fdffd64a5 100644
--- a/src/zen/spaces/ZenSpacesSwipe.mjs
+++ b/src/zen/spaces/ZenSpacesSwipe.mjs
@@ -131,15 +131,14 @@ export class ZenSpacesSwipe {
event.preventDefault();
event.stopPropagation();
- const delta = event.delta * 300;
const stripWidth =
window.windowUtils.getBoundsWithoutFlushing(
document.getElementById("navigator-toolbox")
).width +
window.windowUtils.getBoundsWithoutFlushing(
document.getElementById("zen-sidebar-splitter")
- ).width *
- 2;
+ ).width;
+ const delta = event.delta * stripWidth;
let translateX = this._swipeState.lastDelta + delta;
// Add a force multiplier as we are translating the strip depending on how close to the edge we are
let forceMultiplier = Math.min(
diff --git a/src/zen/spaces/zen-workspaces.css b/src/zen/spaces/zen-workspaces.css
index 97a2c11a3..f5d7cc796 100644
--- a/src/zen/spaces/zen-workspaces.css
+++ b/src/zen/spaces/zen-workspaces.css
@@ -40,6 +40,8 @@
align-items: center;
position: relative;
fill-opacity: 0.6;
+ -moz-context-properties: fill-opacity, fill;
+ fill: currentColor;
& .zen-workspace-icon {
pointer-events: none;
@@ -71,6 +73,11 @@
width 0.1s,
transform 0.2s;
+ &[active='true'] .zen-workspace-icon {
+ fill: var(--zen-sidebar-themed-icon-fill);
+ fill-opacity: 1;
+ }
+
&[active='true'],
&:hover,
&[dragged='true'] {
@@ -210,9 +217,9 @@
height: 16px;
justify-content: center;
align-items: center;
- fill-opacity: 0.6;
+ fill-opacity: 1;
-moz-context-properties: fill-opacity, fill;
- fill: var(--toolbox-textcolor);
+ fill: var(--zen-sidebar-themed-icon-fill);
font-size: 16px;
padding-top: 2px;
color: light-dark(rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0.8));
diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs
index dbc99e678..50082ed63 100644
--- a/src/zen/split-view/ZenViewSplitter.mjs
+++ b/src/zen/split-view/ZenViewSplitter.mjs
@@ -220,14 +220,8 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
const group = this._data[groupIndex];
const tabIndex = group.tabs.indexOf(tab);
- group.tabs.splice(tabIndex, 1);
- this.resetTabState(tab, forUnsplit);
- if (tab.group && tab.group.hasAttribute("split-view-group")) {
- gBrowser.ungroupTab(tab);
- this.#dispatchItemEvent("ZenTabRemovedFromSplit", tab);
- }
- if (group.tabs.length < 2) {
+ if (group.tabs.length < 3) {
// We need to remove all remaining tabs from the group when unsplitting
let remainingTabs = [...group.tabs]; // Copy array since we'll modify it
if (!dontRebuildGrid) {
@@ -237,12 +231,20 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
this.removeGroup(groupIndex);
if (changeTab) {
- gBrowser.selectedTab = remainingTabs[remainingTabs.length - 1];
+ gBrowser.selectedTab = remainingTabs[0];
document
.getElementById("cmd_zenNewEmptySplit")
.removeAttribute("disabled");
}
} else {
+ group.tabs.splice(tabIndex, 1);
+
+ this.resetTabState(tab, forUnsplit);
+ if (tab.group && tab.group.hasAttribute("split-view-group")) {
+ gBrowser.ungroupTab(tab);
+ this.#dispatchItemEvent("ZenTabRemovedFromSplit", tab);
+ }
+
const node = this.getSplitNodeFromTab(tab);
const toUpdate = this.removeNode(node);
this.applyGridLayout(toUpdate);
@@ -1165,6 +1167,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
const contentAreaContextMenu = document.getElementById("tabContextMenu");
contentAreaContextMenu.addEventListener("popupshowing", () => {
let contextTab = TabContextMenu.contextTab;
+ if (!contextTab) {
+ return;
+ }
let selectedTabs = contextTab.multiselected
? gBrowser.selectedTabs
: [contextTab];
@@ -1239,13 +1244,29 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
/**
* Splits the selected tabs.
+ *
+ * @param {Tab|null} otherTabHint - An optional hint for another tab to split with (used for glance tabs).
*/
- contextSplitTabs() {
+ contextSplitTabs(otherTabHint = null) {
let tabs;
- if (TabContextMenu.contextTab.multiselected) {
+ let currentTab = TabContextMenu.contextTab || gBrowser.selectedTab;
+ if (currentTab.multiselected) {
tabs = gBrowser.selectedTabs;
+ } else if (!currentTab.selected) {
+ tabs = [
+ currentTab,
+ ...gBrowser.selectedTabs.filter(t => t !== currentTab),
+ ];
} else {
- tabs = [TabContextMenu.contextTab];
+ tabs = [currentTab];
+ }
+ if (otherTabHint && !tabs.includes(otherTabHint)) {
+ tabs.push(otherTabHint);
+ }
+ if (tabs.length < 2) {
+ gBrowser.selectedTab = tabs[0];
+ this.createEmptySplit();
+ return;
}
// If all are already in a split view, we unsplit them first.
if (tabs.every(tab => tab.splitView)) {
@@ -1265,10 +1286,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* @returns {boolean} True if the tabs can be split, false otherwise.
*/
contextCanSplitTabs() {
- if (
- window.gBrowser.selectedTabs.length < 2 ||
- window.gBrowser.selectedTabs.length > this.MAX_TABS
- ) {
+ if (window.gBrowser.selectedTabs.length > this.MAX_TABS) {
return false;
}
for (const tab of window.gBrowser.selectedTabs) {
@@ -1323,7 +1341,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* @param {Array} tabs
* @param {Tab} relativeTab
*/
- _moveTabsToContainer(tabs, relativeTab) {
+ #moveTabsToContainer(tabs, relativeTab) {
const relativeTabIsPinned = relativeTab.pinned;
const relativeTabIsEssential = relativeTab.hasAttribute("zen-essential");
@@ -1340,6 +1358,32 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
}
+ #useTabsToSplit(tabs) {
+ // If there's ANY pinned tab on the list, we clone the pinned tab
+ // state to all the tabs
+ const allArePinned = tabs.every(tab => tab.pinned);
+ const thereIsOnePinned = tabs.some(tab => tab.pinned);
+ const thereIsOneEssential = tabs.some(tab =>
+ tab.hasAttribute("zen-essential")
+ );
+ const thereIsOneLiveFolder = tabs.some(tab =>
+ tab.hasAttribute("zen-live-folder-item-id")
+ );
+
+ if (
+ thereIsOneEssential ||
+ (thereIsOnePinned && !allArePinned) ||
+ thereIsOneLiveFolder
+ ) {
+ for (let i = 0; i < tabs.length; i++) {
+ const tab = tabs[i];
+ if (tab.pinned) {
+ tabs[i] = gBrowser.duplicateTab(tab, true);
+ }
+ }
+ }
+ }
+
/**
* Splits the given tabs.
*
@@ -1364,17 +1408,20 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
let shouldActivateSplit =
(initialIndex >= 0 || tabs.includes(window.gBrowser.selectedTab)) &&
!this._sessionRestoring;
+
if (existingSplitTab) {
- this._moveTabsToContainer(tabs, tabs[tabIndexToUse]);
const groupIndex = this._data.findIndex(group =>
group.tabs.includes(existingSplitTab)
);
const group = this._data[groupIndex];
- const gridTypeChange = gridType && group.gridType !== gridType;
- const newTabsAdded = tabs.find(t => !group.tabs.includes(t));
if (group.tabs.length >= this.MAX_TABS) {
+ gZenUIManager.showToast("zen-split-view-limit-toast");
return;
}
+ this.#useTabsToSplit(tabs);
+ this.#moveTabsToContainer(tabs, tabs[tabIndexToUse]);
+ const gridTypeChange = gridType && group.gridType !== gridType;
+ const newTabsAdded = tabs.find(t => !group.tabs.includes(t));
if (gridTypeChange && !newTabsAdded) {
// reset layout
group.gridType = gridType;
@@ -1406,30 +1453,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
return group;
}
- // We are here if none of the tabs have been previously split
- // If there's ANY pinned tab on the list, we clone the pinned tab
- // state to all the tabs
- const allArePinned = tabs.every(tab => tab.pinned);
- const thereIsOnePinned = tabs.some(tab => tab.pinned);
- const thereIsOneEssential = tabs.some(tab =>
- tab.hasAttribute("zen-essential")
- );
- const thereIsOneLiveFolder = tabs.some(tab =>
- tab.hasAttribute("zen-live-folder-item-id")
- );
-
- if (
- thereIsOneEssential ||
- (thereIsOnePinned && !allArePinned) ||
- thereIsOneLiveFolder
- ) {
- for (let i = 0; i < tabs.length; i++) {
- const tab = tabs[i];
- if (tab.pinned) {
- tabs[i] = gBrowser.duplicateTab(tab, true);
- }
- }
- }
+ this.#useTabsToSplit(tabs);
gridType ??= "grid";
@@ -2172,7 +2196,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
splitGroup &&
(!draggedTab.group || draggedTab.group !== splitGroup)
) {
- this._moveTabsToContainer([draggedTab], droppedOnTab);
+ this.#moveTabsToContainer([draggedTab], droppedOnTab);
gBrowser.moveTabToExistingGroup(draggedTab, splitGroup);
if (hoverSide === "left" || hoverSide === "top") {
try {
diff --git a/src/zen/split-view/zen-split-group.inc.css b/src/zen/split-view/zen-split-group.inc.css
index a5ab1d382..a153d165c 100644
--- a/src/zen/split-view/zen-split-group.inc.css
+++ b/src/zen/split-view/zen-split-group.inc.css
@@ -104,7 +104,8 @@ tab-group[split-view-group] {
}
}
- tab-group[split-view-group]:where([hasactivetab]) & {
+ tab-group[split-view-group]:where([hasactivetab]) &,
+ &:has(> tab:is([multiselected])) {
background-color: var(--tab-selected-bgcolor);
box-shadow: var(--tab-selected-shadow);
diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs
index 2c048c8cc..b764c250c 100644
--- a/src/zen/tabs/ZenPinnedTabManager.mjs
+++ b/src/zen/tabs/ZenPinnedTabManager.mjs
@@ -285,8 +285,6 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
return;
}
- const selectedTabs = pinnedTabs.filter(tab => tab.selected);
-
event.stopPropagation();
event.preventDefault();
@@ -366,13 +364,19 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
return;
}
}
- await gBrowser.explicitUnloadTabs(pinnedTabs);
+ let successful = await gBrowser.explicitUnloadTabs(pinnedTabs);
+ if (!successful) {
+ return;
+ }
for (const tab of pinnedTabs) {
tab.removeAttribute("discarded");
}
- }
- if (selectedTabs.length) {
- this._handleTabSwitch(selectedTabs[0]);
+ } else if (pinnedTabs.some(tab => tab.selected)) {
+ const selectedTabs = pinnedTabs.filter(tab => tab.selected);
+ gBrowser.selectedTab = gBrowser._findTabToBlurTo(
+ selectedTabs[0],
+ selectedTabs
+ );
}
if (behavior.includes("reset")) {
for (const tab of pinnedTabs) {
@@ -392,28 +396,6 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
}
}
- _handleTabSwitch(selectedTab) {
- if (selectedTab !== gBrowser.selectedTab) {
- return;
- }
- const findNextTab = direction =>
- gBrowser.tabContainer.findNextTab(selectedTab, {
- direction,
- filter: tab => !tab.hidden && !tab.pinned,
- });
-
- let nextTab = findNextTab(1) || findNextTab(-1);
-
- if (!nextTab) {
- gZenWorkspaces.selectEmptyTab();
- return;
- }
-
- if (nextTab) {
- gBrowser.selectedTab = nextTab;
- }
- }
-
#resetTabToStoredState(tab) {
const state = this.#getTabState(tab);
@@ -857,7 +839,9 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
const pinUrl = tab._zenPinnedInitialState.entry.url.split("#")[0];
const currentUrl = location.split("#")[0];
// Add an indicator that the pin has been changed
- if (pinUrl === currentUrl) {
+ if (
+ Services.io.newURI(currentUrl).spec === Services.io.newURI(pinUrl).spec
+ ) {
this.resetPinChangedUrl(tab);
return;
}
diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css
index b324a7116..0118c3b8d 100644
--- a/src/zen/tabs/zen-tabs/vertical-tabs.css
+++ b/src/zen/tabs/zen-tabs/vertical-tabs.css
@@ -341,7 +341,7 @@
:root:not([zen-renaming-tab="true"])
#tabbrowser-tabs:not([movingtab])
& .tab-content > image:active {
- scale: 0.98;
+ scale: 0.97;
}
& .tab-icon-image {
@@ -353,6 +353,7 @@
&:-moz-broken {
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100'%3E%3C/svg%3E") !important;
background: color-mix(in srgb, var(--zen-primary-color) 80%, light-dark(rgb(0, 0, 0), rgb(255, 255, 255)));
+ opacity: 0.5;
}
}
@@ -474,13 +475,13 @@
overflow-y: auto;
height: 100%;
- :root[zen-workspace-id][zen-sidebar-expanded="true"] & {
+ :root[zen-sidebar-expanded="true"] & {
margin-left: calc(-1 * var(--zen-toolbox-padding));
width: calc(100% + var(--zen-toolbox-padding) * 2);
}
}
-:root[zen-workspace-id] #pinned-tabs-container {
+#pinned-tabs-container {
display: none;
}
@@ -1088,7 +1089,7 @@
&:active,
&[open] {
- scale: 0.98;
+ scale: 0.99;
}
&[in-urlbar] {
diff --git a/src/zen/tests/spaces/browser_issue_10455.js b/src/zen/tests/spaces/browser_issue_10455.js
index 48578c798..ed7644d39 100644
--- a/src/zen/tests/spaces/browser_issue_10455.js
+++ b/src/zen/tests/spaces/browser_issue_10455.js
@@ -12,10 +12,6 @@ add_task(async function test_Issue_10455() {
let newWindow = await BrowserTestUtils.openNewBrowserWindow();
await newWindow.gZenWorkspaces.promiseInitialized;
- ok(
- newWindow.document.documentElement.hasAttribute("zen-workspace-id"),
- "New window should have a zen-workspace-id attribute"
- );
const unloadEvent = BrowserTestUtils.waitForEvent(newWindow, "unload");
newWindow.BrowserCommands.closeTabOrWindow();
@@ -33,10 +29,6 @@ add_task(async function test_Issue_10455_Dont_Close() {
let newWindow = await BrowserTestUtils.openNewBrowserWindow();
await newWindow.gZenWorkspaces.promiseInitialized;
- ok(
- newWindow.document.documentElement.hasAttribute("zen-workspace-id"),
- "New window should have a zen-workspace-id attribute"
- );
newWindow.BrowserCommands.closeTabOrWindow();
Assert.strictEqual(
diff --git a/src/zen/tests/spaces/browser_private_mode.js b/src/zen/tests/spaces/browser_private_mode.js
index b3f3bd66d..e2c0e19fd 100644
--- a/src/zen/tests/spaces/browser_private_mode.js
+++ b/src/zen/tests/spaces/browser_private_mode.js
@@ -12,10 +12,6 @@ add_task(async function test_Private_Mode() {
private: true,
});
await privateWindow.gZenWorkspaces.promiseInitialized;
- ok(
- privateWindow.document.documentElement.hasAttribute("zen-workspace-id"),
- "Private window should have a zen-workspace-id attribute"
- );
await BrowserTestUtils.closeWindow(privateWindow);
await SpecialPowers.popPrefEnv();
diff --git a/surfer.json b/surfer.json
index dce500c57..ed36546cd 100644
--- a/surfer.json
+++ b/surfer.json
@@ -5,7 +5,7 @@
"binaryName": "zen",
"version": {
"product": "firefox",
- "version": "149.0.2",
+ "version": "150.0",
"candidate": "150.0",
"candidateBuild": 1
},
@@ -20,7 +20,7 @@
"brandShortName": "Zen",
"brandFullName": "Zen Browser",
"release": {
- "displayVersion": "1.19.8b",
+ "displayVersion": "1.19.9b",
"github": {
"repo": "zen-browser/desktop"
},