From: "Miguel Ángel Arruga Vivas" <rosen644835@gmail.com>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: 35394@debbugs.gnu.org
Subject: [bug#35394] [PATCH 4/4 v4] Grub i18n
Date: Sun, 18 Oct 2020 17:43:16 +0200 [thread overview]
Message-ID: <87o8kzpmjv.fsf@gmail.com> (raw)
In-Reply-To: <87v9f7po4x.fsf_-_@gmail.com> ("Miguel Ángel Arruga Vivas"'s message of "Sun, 18 Oct 2020 17:09:02 +0200")
[-- Attachment #1: Type: text/plain, Size: 908 bytes --]
Sorry, please disregard the last patch, it was a non-working version. I
tested this one with Grub and the boot-parameters test (for the label
modification).
I leave the open points for reference.
Miguel Ángel Arruga Vivas <rosen644835@gmail.com> writes:
> (...)
> It brings the whole glibc-locales to the grub and extlinux configuration
> builders, and changes again boot-parameters. It would be optimal to
> create a minimal locale with the desired locale, as glibc-utf8-locales
> doesn't work with my to-go test target (es_ES.utf8) because setlocale
> raises an exception.
>
> I have in my TODO list to extract translate-label somewhere else, even
> though I'm not sure where could it fit, and to sanitize some inputs to
> ensure the correct generation. The latter should be ready this week,
> the first depends on finding (or creating) the right place.
Happy hacking!
Miguel
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-system-nls-for-boot-labels.patch --]
[-- Type: text/x-patch, Size: 13766 bytes --]
From e9f3c255c13abc14e1f0decf5460b7a2f9a2d162 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miguel=20=C3=81ngel=20Arruga=20Vivas?=
<rosen644835@gmail.com>
Date: Sat, 17 Oct 2020 21:27:51 +0200
Subject: [PATCH] system: nls for boot labels.
* gnu/bootloader/extlinux.scm (extlinux-configuration-file): Add
keyword locale.
[translate-label]: New function that formats the label after
translation.
[menu-entry->gexp]: Use translate-label.
[init-gettext]: Init gettext with the language provided through the
configuration.
[builder]: Use init-gettext, define G_ and translate strings.
* gnu/bootloader/grub.scm (eye-candy): Translate string.
(grub-configuration-file)[translate-label]: New function.
[menu-entry->gexp]: Use translate-label.
[init-gettext]: New g-exp variable.
[locale-config]: Translate string.
[builder]: Use init-gettext, define G_ and translate strings.
* gnu/system.scm (kernel->boot-label): Modify return type, and
document it, to allow correct translation of the labels.
* po/guix/POTFILES.in: Add gnu/bootloader/grub.scm.
* tests/boot-parameters.scm (%default-label): Update to the new
format.
(%old-label): Renamed from old %default-label.
(read old format): New test case.
---
gnu/bootloader/extlinux.scm | 52 +++++++++++++++++++++++++---
gnu/bootloader/grub.scm | 68 ++++++++++++++++++++++++++++++++-----
gnu/system.scm | 21 ++++++------
po/guix/POTFILES.in | 2 ++
tests/boot-parameters.scm | 6 +++-
5 files changed, 123 insertions(+), 26 deletions(-)
diff --git a/gnu/bootloader/extlinux.scm b/gnu/bootloader/extlinux.scm
index 6b5ff298e7..36d0bcdae4 100644
--- a/gnu/bootloader/extlinux.scm
+++ b/gnu/bootloader/extlinux.scm
@@ -19,14 +19,19 @@
(define-module (gnu bootloader extlinux)
#:use-module (gnu bootloader)
+ #:use-module (gnu packages base)
#:use-module (gnu packages bootloaders)
+ #:use-module (gnu packages package-management)
+ #:use-module (gnu system locale)
#:use-module (guix gexp)
#:use-module (guix utils)
+ #:use-module (ice-9 match)
#:export (extlinux-bootloader
extlinux-bootloader-gpt))
(define* (extlinux-configuration-file config entries
#:key
+ (locale #f)
(system (%current-system))
(old-entries '())
#:allow-other-keys)
@@ -38,8 +43,38 @@ corresponding to old generations of the system."
(define all-entries
(append entries (bootloader-configuration-menu-entries config)))
+ (define (translate-label label)
+ (match label
+ (('hurd name version)
+ ;; TRANSLATORS: The first parameter is the capitalized package name
+ ;; for the Hurd kernel, which uses the definite article in English.
+ ;; The second parameter contains the version string.
+ #~(format #f (G_ "GNU with the ~a ~a") package version))
+ (('linux name version)
+ ;; TRANSLATORS: The first parameter is the capitalized package name
+ ;; for Linux kernel, which doesn't use the definite article in
+ ;; English. The second parameter contains the version string.
+ #~(format #f (G_ "GNU with ~a ~a") package version))
+ (('unknown)
+ ;; TRANSLATORS: This is the label for an unknown system to be booted.
+ #~(G_ "GNU"))
+ ((? string? old-format)
+ ;; We cannot translate properly the old format.
+ old-format)))
+
+ (define init-gettext
+ #~(let ((locale #$(and locale
+ (locale-definition-name
+ (locale-name->definition locale)))))
+ (when locale
+ (setenv "GUIX_LOCPATH" (string-append #$glibc-locales
+ "/lib/locale/"))
+ (bindtextdomain "guix" (string-append #$guix "/share/locale"))
+ (textdomain "guix")
+ (setlocale LC_ALL locale))))
+
(define (menu-entry->gexp entry)
- (let ((label (menu-entry-label entry))
+ (let ((label (translate-label (menu-entry-label entry)))
(kernel (menu-entry-linux entry))
(kernel-arguments (menu-entry-linux-arguments entry))
(initrd (menu-entry-initrd entry)))
@@ -57,13 +92,20 @@ corresponding to old generations of the system."
(define builder
#~(call-with-output-file #$output
(lambda (port)
+ #$init-gettext
+ ;; Ensure xgettext extracts translatable messages
+ ;; with our current keywords.
+ (define G_ gettext)
(let ((timeout #$(bootloader-configuration-timeout config)))
- (format port "# This file was generated from your Guix configuration. Any changes
-# will be lost upon reconfiguration.
-UI menu.c32
-MENU TITLE GNU Guix Boot Options
+ (format port "~aUI menu.c32
+MENU TITLE ~a
PROMPT ~a
TIMEOUT ~a~%"
+ (G_ "\
+# This file was generated from your Guix configuration. Any changes
+# will be lost upon reconfiguration.
+") ;; Keep line break to not duplicate grub.scm message.
+ (G_ "GNU Guix Boot Options")
(if (> timeout 0) 1 0)
;; timeout is expressed in 1/10s of seconds.
(* 10 timeout))
diff --git a/gnu/bootloader/grub.scm b/gnu/bootloader/grub.scm
index 611580a350..e4df9b5009 100644
--- a/gnu/bootloader/grub.scm
+++ b/gnu/bootloader/grub.scm
@@ -35,8 +35,10 @@
#:use-module (gnu system file-systems)
#:use-module (gnu system keyboard)
#:use-module (gnu system locale)
+ #:use-module (gnu packages base)
#:use-module (gnu packages bootloaders)
#:autoload (gnu packages gtk) (guile-cairo guile-rsvg)
+ #:use-module (gnu packages package-management)
#:autoload (gnu packages xorg) (xkeyboard-config)
#:use-module (ice-9 match)
#:use-module (ice-9 regex)
@@ -182,7 +184,7 @@ fi~%"
(and image
#~(format #$port "
-# Set 'root' to the partition that contains /gnu/store.
+# ~a
~a
~a
@@ -196,6 +198,8 @@ else
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
fi~%"
+ (G_
+ "Set 'root' to the partition that contains /gnu/store.")
#$(grub-root-search store-device font-file)
#$(setup-gfxterm config font-file)
#$(grub-setup-io config)
@@ -348,8 +352,28 @@ STORE-DIRECTORY-PREFIX may be used to specify a store prefix, as is required
when booting a root file system on a Btrfs subvolume."
(define all-entries
(append entries (bootloader-configuration-menu-entries config)))
+
+ (define (translate-label label)
+ (match label
+ (('hurd name version)
+ ;; TRANSLATORS: The first parameter is the capitalized package name
+ ;; for the Hurd kernel, which uses the definite article in English.
+ ;; The second parameter contains the version string.
+ #~(format #f (G_ "GNU with the ~a ~a") package version))
+ (('linux name version)
+ ;; TRANSLATORS: The first parameter is the capitalized package name
+ ;; for Linux kernel, which doesn't use the definite article in
+ ;; English. The second parameter contains the version string.
+ #~(format #f (G_ "GNU with ~a ~a") package version))
+ (('unknown)
+ ;; TRANSLATORS: This is the label for an unknown system to be booted.
+ #~(G_ "GNU"))
+ ((? string? old-format)
+ ;; We cannot translate properly the old format.
+ old-format)))
+
(define (menu-entry->gexp entry)
- (let ((label (menu-entry-label entry))
+ (let ((label (translate-label (menu-entry-label entry)))
(linux (menu-entry-linux entry))
(device (menu-entry-device entry))
(device-mount-point (menu-entry-device-mount-point entry)))
@@ -401,19 +425,36 @@ menuentry ~s {
#:store-directory-prefix store-directory-prefix
#:port #~port)))
+ (define init-gettext
+ #~(let ((locale #$(and locale
+ (locale-definition-name
+ (locale-name->definition locale)))))
+ (when locale
+ (setenv "GUIX_LOCPATH" (string-append #$glibc-locales
+ "/lib/locale/"))
+ (bindtextdomain "guix" (string-append #$guix "/share/locale"))
+ (textdomain "guix")
+ (setlocale LC_ALL locale))))
+
(define locale-config
#~(let ((locale #$(and locale
(locale-definition-source
(locale-name->definition locale)))))
(when locale
(format port "\
-# Localization configuration.
+# ~a
if search --file --set boot_partition /grub/grub.cfg; then
set locale_dir=(${boot_partition})/grub/locale
else
set locale_dir=/boot/grub/locale
fi
-set lang=~a~%" locale))))
+set lang=~a~%"
+ ;; XXX: This should sanitized with a function that
+ ;; inserts # at the beginning of each line.
+ ;; TRANSLATORS: This must be one line or start each line
+ ;; with #.
+ (G_ "Localization configuration.")
+ locale))))
(define keyboard-layout-config
(let* ((layout (bootloader-configuration-keyboard-layout config))
@@ -434,10 +475,17 @@ keymap ~a~%" #$keymap))))
(define builder
#~(call-with-output-file #$output
(lambda (port)
+ #$init-gettext
+ ;; Ensure xgettext extracts translatable messages
+ ;; with our current keywords.
+ (define G_ gettext)
(format port
- "# This file was generated from your Guix configuration. Any changes
+ ;; XXX: This should sanitized with a function to
+ ;; ensure the # at the beginning of each line.
+ (G_ "\
+# This file was generated from your Guix configuration. Any changes
# will be lost upon reconfiguration.
-")
+"))
#$(sugar)
#$locale-config
#$keyboard-layout-config
@@ -450,16 +498,18 @@ set timeout=~a~%"
#$@(if (pair? old-entries)
#~((format port "
-submenu \"GNU system, old configurations...\" {~%")
+submenu \"~a\" {~%"
+ (G_ "GNU system, old configurations..."))
#$@(map menu-entry->gexp old-entries)
(format port "}~%"))
#~())
(format port "
if [ \"${grub_platform}\" == efi ]; then
- menuentry \"Firmware setup\" {
+ menuentry \"~a\" {
fwsetup
}
-fi~%"))))
+fi~%"
+ (G_ "Firmware setup")))))
;; Since this file is rather unique, there's no point in trying to
;; substitute it.
diff --git a/gnu/system.scm b/gnu/system.scm
index a3122eaa65..1257aa6223 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -1194,20 +1194,19 @@ listed in OS. The C library expects to find it under
#:libcs (operating-system-locale-libcs os)))
(define* (kernel->boot-label kernel #:key hurd)
- "Return a label for the bootloader menu entry that boots KERNEL."
+ "Return a label for the bootloader menu entry that boots KERNEL.
+Label is a list that contains the kernel identifier, @code{'hurd} or
+@code{'linux}, its title name and the version, or @code{'unknown}."
(cond ((package? hurd)
- (string-append "GNU with the "
- (string-titlecase (package-name hurd)) " "
- (package-version hurd)))
+ (list 'hurd (string-titlecase (package-name hurd))
+ (package-version hurd)))
((package? kernel)
- (string-append "GNU with "
- (string-titlecase (package-name kernel)) " "
- (package-version kernel)))
+ (list 'linux (string-titlecase (package-name kernel))
+ (package-version kernel)))
((inferior-package? kernel)
- (string-append "GNU with "
- (string-titlecase (inferior-package-name kernel)) " "
- (inferior-package-version kernel)))
- (else "GNU")))
+ (list 'linux (string-titlecase (inferior-package-name kernel))
+ (inferior-package-version kernel)))
+ (else '(unknown))))
(define (operating-system-default-label os)
"Return the default label for OS, as it will appear in the bootloader menu
diff --git a/po/guix/POTFILES.in b/po/guix/POTFILES.in
index b877fac9df..4386c8763d 100644
--- a/po/guix/POTFILES.in
+++ b/po/guix/POTFILES.in
@@ -40,6 +40,8 @@ gnu/installer/user.scm
gnu/installer/utils.scm
gnu/machine/ssh.scm
gnu/packages/bootstrap.scm
+gnu/bootloader/grub.scm
+gnu/bootloader/extlinux.scm
guix/build/utils.scm
guix/scripts.scm
guix/scripts/build.scm
diff --git a/tests/boot-parameters.scm b/tests/boot-parameters.scm
index d7e579bc89..678de1475f 100644
--- a/tests/boot-parameters.scm
+++ b/tests/boot-parameters.scm
@@ -34,7 +34,8 @@
#:use-module (srfi srfi-64)
#:use-module (rnrs bytevectors))
-(define %default-label "GNU with Linux-libre 99.1.2")
+(define %old-label "GNU with Linux-libre 99.1.2")
+(define %default-label '(linux "Linux-libre" "99.1.2"))
(define %default-kernel-path
(string-append (%store-prefix)
"/zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz-linux-libre-99.1.2"))
@@ -156,6 +157,9 @@
#:with-store #false
#:locale #false)))
+(test-assert "read, read old format"
+ (test-read-boot-parameters #:label %old-label))
+
(test-equal "read, default equality"
%grub-boot-parameters
(test-read-boot-parameters))
--
2.28.0
next prev parent reply other threads:[~2020-10-18 15:45 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-23 13:17 [bug#35394] [PATCH 0/3] Bootloader localization Miguel
2019-04-23 13:26 ` [bug#35394] [PATCH 1/3] system: Add locale to boot-parameters Miguel
2019-04-23 13:26 ` [bug#35394] [PATCH 2/3] system: Provide locale information to the bootloader Miguel
2019-04-23 13:26 ` [bug#35394] [PATCH 3/3] system: Use locale information in grub.cfg Miguel
2019-04-26 10:50 ` [bug#35394] [PATCH 3/4] gnu: grub: Add locale output for bootloading Miguel
2019-05-03 12:27 ` Miguel
2019-04-26 10:51 ` [bug#35394] [PATCH 4/4] system: Use locale information in grub.cfg Miguel
2019-05-03 12:27 ` Miguel
2019-04-29 7:56 ` [bug#35394] [PATCH 0/3] Bootloader localization Ludovic Courtès
[not found] ` <20191021124035.531bed75@gmail.com>
2019-10-21 10:46 ` [bug#35394] [PATCH 1/3] system: Add locale to boot-parameters Miguel Arruga Vivas
2019-10-21 10:46 ` [bug#35394] [PATCH 2/3] system: Provide locale information to the bootloader Miguel Arruga Vivas
2019-10-21 10:46 ` [bug#35394] [PATCH 3/3] system: Use locale information in grub.cfg Miguel Arruga Vivas
2020-10-11 14:18 ` [bug#35394] [PATCH 1/1 v4] Grub i18n Miguel Ángel Arruga Vivas
2020-10-17 16:32 ` Ludovic Courtès
2020-10-18 15:09 ` [bug#35394] [PATCH 4/4 " Miguel Ángel Arruga Vivas
2020-10-18 15:43 ` Miguel Ángel Arruga Vivas [this message]
2020-10-19 8:50 ` Ludovic Courtès
2020-10-19 11:41 ` Miguel Ángel Arruga Vivas
2020-10-19 13:21 ` Ludovic Courtès
2020-10-19 13:44 ` Miguel Ángel Arruga Vivas
2020-10-20 20:50 ` Ludovic Courtès
2020-10-20 21:19 ` bug#35394: " Miguel Ángel Arruga Vivas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87o8kzpmjv.fsf@gmail.com \
--to=rosen644835@gmail.com \
--cc=35394@debbugs.gnu.org \
--cc=ludo@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).