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 + + + + 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" },