Subject: [bug#68503] [PATCH v3] gnu: torbrowser: Add support for language localisation.

From: Clément Lassieur <[email-masked]>
Date: Thu, 18 Jan 2024 23:46:49 +0100

* gnu/packages/gnuzilla.scm (all-mozilla-locales): Export it.
* gnu/packages/tor.scm (%torbrowser-locales, translation-base-browser,
translation-tor-browser): New variables.
(torbrowser)[arguments]: In ‘setenv’ phase, set MOZ_CHROME_MULTILOCALE.  Add
‘copy-firefox-locales’, ‘copy-basebrowser-locales’, ‘copy-torbrowser-locales’
and ‘build-locales’ phases.

Change-Id: Ia5b28fa5d885f24140893dc270e57e83b0250c67
---
 gnu/packages/gnuzilla.scm |   3 +-
 gnu/packages/tor.scm      | 112 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 113 insertions(+), 2 deletions(-)

diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index ea5de680e5d0..e3bc625bc0f5 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -98,7 +98,8 @@ (define-module (gnu packages gnuzilla)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages sqlite)
-  #:autoload (json parser) (json->scm))
+  #:autoload (json parser) (json->scm)
+  #:export (all-mozilla-locales))
 
 (define-public mozjs
   (package
diff --git a/gnu/packages/tor.scm b/gnu/packages/tor.scm
index b20e17e4cea8..fbd5f0a0af78 100644
--- a/gnu/packages/tor.scm
+++ b/gnu/packages/tor.scm
@@ -13,7 +13,7 @@
 ;;; Copyright © 2021-2023 Danial Behzadi <[email-masked]>
 ;;; Copyright © 2022 Maxim Cournoyer <[email-masked]>
 ;;; Copyright © 2022 Jim Newsome <[email-masked]>
-;;; Copyright © 2023 Clément Lassieur <[email-masked]>
+;;; Copyright © 2023, 2024 Clément Lassieur <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -503,6 +503,36 @@ (define %torbrowser-version "13.0.8")
 ;; "src-firefox-tor-browser-".
 (define %torbrowser-firefox-version "115.6.0esr-13.0-1-build2")
 
+;; Use the list in tor-browser-build/rbm.conf.
+(define %torbrowser-locales
+  '("ar" "ca" "cs" "da" "de" "el" "es-ES" "fa" "fi" "fr" "ga-IE" "he" "hu"
+    "id" "is" "it" "ja" "ka" "ko" "lt" "mk" "ms" "my" "nb-NO" "nl" "pl"
+    "pt-BR" "ro" "ru" "sq" "sv-SE" "th" "tr" "uk" "vi" "zh-CN" "zh-TW"))
+
+;; See tor-browser-build/projects/translation/config.
+(define translation-base-browser
+  (origin
+    (method git-fetch)
+    (uri (git-reference
+          (url "https://gitlab.torproject.org/tpo/translation.git")
+          (commit "5490489a8d356a44d792300b4dfddba792d10f2e")))
+    (file-name "translation-base-browser")
+    (sha256
+     (base32
+      "1knxary2zp2705xzzs76gpy37ri69yp32ajpmpxki3z5hp7mla7q"))))
+
+;; See tor-browser-build/projects/translation/config.
+(define translation-tor-browser
+  (origin
+    (method git-fetch)
+    (uri (git-reference
+          (url "https://gitlab.torproject.org/tpo/translation.git")
+          (commit "e92772b4a11ced855c27eafd299cf972bef5cd8f")))
+    (file-name "translation-tor-browser")
+    (sha256
+     (base32
+      "0q3gcq7s58110d9y4x8zyby6cn36msry6z3va7xw8sam3pp7p8nj"))))
+
 (define torbrowser-assets
   ;; This is a prebuilt Torbrowser from which we take the assets we need.
   (package
@@ -581,6 +611,8 @@ (define-public torbrowser
                 ;; $HOME/.mozbuild).
                 (setenv "MOZBUILD_STATE_PATH"
                         (in-vicinity (getcwd) ".mozbuild"))
+                (setenv "MOZ_CHROME_MULTILOCALE"
+                        (string-join '#$%torbrowser-locales))
                 ;; Make build reproducible.
                 (setenv "MOZ_BUILD_DATE" #$%moz-build-date)))
             (add-before 'configure 'mozconfig
@@ -594,6 +626,79 @@ (define-public torbrowser
             (replace 'configure
               (lambda _
                 (invoke "./mach" "configure")))
+            ;; See tor-browser-build/projects/firefox/build.
+            (add-before 'configure 'copy-firefox-locales
+              (lambda _
+                (let ((l10ncentral ".mozbuild/l10n-central"))
+                  (mkdir-p l10ncentral)
+                  (for-each
+                   (lambda (lang)
+                     (copy-recursively (find (lambda (path)
+                                               (string-suffix? lang path))
+                                             '#$all-mozilla-locales)
+                                       (in-vicinity l10ncentral lang)))
+                   '#$%torbrowser-locales))))
+            (add-after 'copy-firefox-locales 'copy-basebrowser-locales
+              (lambda _
+                (let ((l10ncentral ".mozbuild/l10n-central"))
+                  ;; Temporary copy so that we can use ‘mv’ to mimic
+                  ;; tor-browser-build/projects/firefox/build.
+                  (copy-recursively #$translation-base-browser
+                                    "translation-base-browser")
+                  (for-each
+                   (lambda (lang)
+                     (system
+                      (format
+                       #f (string-join
+                           '("mv"
+                             "translation-base-browser/~a/base-browser.ftl"
+                             "~a/~a/browser/browser/"))
+                       lang l10ncentral lang))
+                     (system
+                      (format
+                       #f (string-join
+                           '("mv"
+                             "translation-base-browser/~a/*"
+                             "~a/~a/browser/chrome/browser/"))
+                       lang l10ncentral lang)))
+                   '#$%torbrowser-locales))))
+            (add-after 'copy-basebrowser-locales 'copy-torbrowser-locales
+              (lambda _
+                (let ((l10ncentral ".mozbuild/l10n-central"))
+                  ;; Temporary copy so that we can use ‘mv’ to mimic
+                  ;; tor-browser-build/projects/firefox/build.
+                  (copy-recursively #$translation-tor-browser
+                                    "translation-tor-browser")
+                  (for-each
+                   (lambda (lang)
+                     (system
+                      (format
+                       #f (string-join
+                           '("mv"
+                             "translation-tor-browser/~a/tor-browser.ftl"
+                             "~a/~a/browser/browser/"))
+                       lang l10ncentral lang))
+                     (system
+                      (format
+                       #f (string-join
+                           '("mv"
+                             "translation-tor-browser/~a/cryptoSafetyPrompt.properties"
+                             "~a/~a/browser/chrome/browser/"))
+                       lang l10ncentral lang))
+                     (system
+                      (format
+                       #f (string-join
+                           '("mv"
+                             "translation-tor-browser/~a"
+                             "toolkit/torbutton/chrome/locale/"))
+                       lang))
+                     (let ((port (open-file "toolkit/torbutton/jar.mn" "a")))
+                       (format port "% locale torbutton ~a %locale/~a/~%"
+                               lang lang)
+                       (format port "  locale/~a/ (chrome/locale/~a/*)~%"
+                               lang lang)
+                       (close port)))
+                   '#$%torbrowser-locales))))
             (add-before 'build 'fix-addons-placeholder
               (lambda _
                 (substitute*
@@ -607,6 +712,11 @@ (define-public torbrowser
                    "#include ../../../tools/torbrowser/bridges.js" port)
                   (newline port)
                   (close port))))
+            ;; See tor-browser-build/projects/firefox/build.
+            (add-after 'build 'build-locales
+              (lambda _
+                (system (string-join '("./mach package-multi-locale --locales"
+                                       "en-US $MOZ_CHROME_MULTILOCALE")))))
             (add-after 'install 'deploy-assets
               (lambda* (#:key inputs #:allow-other-keys)
                 (let ((assets #$(this-package-input "torbrowser-assets"))

base-commit: 551d013a56bf7d22bac80e0fd21d971973c3cf6f
-- 
2.41.0