summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2019-04-09 23:44:36 +0200
committerLudovic Courtès <ludo@gnu.org>2019-04-10 12:40:59 +0200
commit26a2021a1f7951818539353531d56d2e8338966e (patch)
tree6d50ef5888c13d7391c0199a5e305e5ef33ce8a8
parent32813e8440ff15c9389b84b1d7450fe1d3d25bb2 (diff)
downloadguix-26a2021a1f7951818539353531d56d2e8338966e.tar.gz
ui: Make diagnostic message prefix translatable.
* guix/ui.scm (define-diagnostic): Expect PREFIX to be enclosed in
'G_'.   Emit call to 'gettext' on PREFIX.
(warning, info, report-error): Wrap prefix in 'G_'.
-rw-r--r--guix/ui.scm63
1 files changed, 35 insertions, 28 deletions
diff --git a/guix/ui.scm b/guix/ui.scm
index c57d206184..953cf9ea7f 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -124,35 +124,42 @@
 ;;;
 ;;; Code:
 
-(define-syntax-rule (define-diagnostic name prefix)
-  "Create a diagnostic macro (i.e., NAME), which will prepend PREFIX to all
+(define-syntax define-diagnostic
+  (syntax-rules ()
+    "Create a diagnostic macro (i.e., NAME), which will prepend PREFIX to all
 messages."
-  (define-syntax name
-    (lambda (x)
-      (syntax-case x ()
-        ((name (underscore fmt) args (... ...))
-         (and (string? (syntax->datum #'fmt))
-              (free-identifier=? #'underscore #'G_))
-         #'(begin
-             (format (guix-warning-port) "~:[~*~;guix ~a: ~]~a"
-                     (program-name) (program-name) prefix)
-             (format (guix-warning-port) (gettext fmt)
-                     args (... ...))))
-        ((name (N-underscore singular plural n) args (... ...))
-         (and (string? (syntax->datum #'singular))
-              (string? (syntax->datum #'plural))
-              (free-identifier=? #'N-underscore #'N_))
-         #'(begin
-             (format (guix-warning-port) "~:[~*~;guix ~a: ~]~a"
-                     (program-name) (program-name) prefix)
-             (format (guix-warning-port)
-                     (ngettext singular plural n %gettext-domain)
-                     args (... ...))))))))
-
-(define-diagnostic warning "warning: ") ; emit a warning
-(define-diagnostic info "")
-
-(define-diagnostic report-error "error: ")
+    ((_ name (G_ prefix))
+     (define-syntax name
+       (lambda (x)
+         (syntax-case x ()
+           ((name (underscore fmt) args (... ...))
+            (and (string? (syntax->datum #'fmt))
+                 (free-identifier=? #'underscore #'G_))
+            #'(begin
+                (format (guix-warning-port) "~:[~*~;guix ~a: ~]~a"
+                        (program-name) (program-name)
+                        (gettext prefix %gettext-domain))
+                (format (guix-warning-port) (gettext fmt %gettext-domain)
+                        args (... ...))))
+           ((name (N-underscore singular plural n) args (... ...))
+            (and (string? (syntax->datum #'singular))
+                 (string? (syntax->datum #'plural))
+                 (free-identifier=? #'N-underscore #'N_))
+            #'(begin
+                (format (guix-warning-port) "~:[~*~;guix ~a: ~]~a"
+                        (program-name) (program-name)
+                        (gettext prefix %gettext-domain))
+                (format (guix-warning-port)
+                        (ngettext singular plural n %gettext-domain)
+                        args (... ...))))))))))
+
+;; XXX: This doesn't work well for right-to-left languages.
+;; TRANSLATORS: The goal is to emit "warning:" followed by a short phrase;
+;; "~a" is a placeholder for that phrase.
+(define-diagnostic warning (G_ "warning: "))    ;emit a warning
+(define-diagnostic info (G_ ""))
+
+(define-diagnostic report-error (G_ "error: "))
 (define-syntax-rule (leave args ...)
   "Emit an error message and exit."
   (begin