From 5fafb6e792c1e18ec223f0c7fb350d0c9b962a45 Mon Sep 17 00:00:00 2001 From: Marius Bakke Date: Thu, 14 Oct 2021 00:24:01 +0200 Subject: doc: Fix typo. * doc/contributing.texi (Configuring Git): s/respository/repository/ --- doc/contributing.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'doc') diff --git a/doc/contributing.texi b/doc/contributing.texi index 21caa9c08f..76ab913b0d 100644 --- a/doc/contributing.texi +++ b/doc/contributing.texi @@ -1223,7 +1223,7 @@ When a bug is resolved, please close the thread by sending an email to If you have not done so already, you may wish to set a name and email that will be associated with your commits (@pxref{telling git your name, , Telling Git your name, git, Git User Manual}). If you wish to use a -different name or email just for commits in this respository, you can +different name or email just for commits in this repository, you can use @command{git config --local}, or edit @file{.git/config} in the repository instead of @file{~/.gitconfig}. -- cgit v1.2.3 From ff20d3928dcd6c00be1e8e6c87fd6bcd11d48fd0 Mon Sep 17 00:00:00 2001 From: Oleg Pykhalov Date: Sat, 16 Oct 2021 16:44:55 +0300 Subject: home: services: shells: Fix documentation about file-like objects. * gnu/home/services/shells.scm: (home-shell-profile-configuration, home-shell-profile-service-type, home-zsh-configuration, home-zsh-extension, home-bash-configuration, home-bash-extension, home-fish-configuration, home-fish-extension): Replace 'strings or gexps' with 'file-like objects' in the documentation. * doc/guix.texi (Shells Home Services): Same. --- doc/guix.texi | 18 +++++++++--------- gnu/home/services/shells.scm | 40 ++++++++++++++++++++-------------------- 2 files changed, 29 insertions(+), 29 deletions(-) (limited to 'doc') diff --git a/doc/guix.texi b/doc/guix.texi index 7a4b2c040b..a49abc0554 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -35700,7 +35700,7 @@ Available @code{home-shell-profile-configuration} fields are: @item @code{profile} (default: @code{()}) (type: text-config) @code{home-shell-profile} is instantiated automatically by @code{home-environment}, DO NOT create this service manually, it can -only be extended. @code{profile} is a list of strings or gexps, which +only be extended. @code{profile} is a list of file-like objects, which will go to @file{~/.profile}. By default @file{~/.profile} contains the initialization code, which have to be evaluated by login shell to make home-environment's profile avaliable to the user, but other commands can @@ -35729,19 +35729,19 @@ Add sane defaults like reading @file{/etc/bashrc}, coloring output for Association list of environment variables to set for the Bash session. @item @code{bash-profile} (default: @code{()}) (type: text-config) -List of strings or gexps, which will be added to @file{.bash_profile}. +List of file-like objects, which will be added to @file{.bash_profile}. Used for executing user's commands at start of login shell (In most cases the shell started on tty just after login). @file{.bash_login} won't be ever read, because @file{.bash_profile} always present. @item @code{bashrc} (default: @code{()}) (type: text-config) -List of strings or gexps, which will be added to @file{.bashrc}. Used +List of file-like objects, which will be added to @file{.bashrc}. Used for executing user's commands at start of interactive shell (The shell for interactive usage started by typing @code{bash} or by terminal app or any other program). @item @code{bash-logout} (default: @code{()}) (type: text-config) -List of strings or gexps, which will be added to @file{.bash_logout}. +List of file-like objects, which will be added to @file{.bash_logout}. Used for executing user's commands at the exit of login shell. It won't be read in some cases (if the shell terminates by exec'ing another process for example). @@ -35769,30 +35769,30 @@ Shell startup process will continue with Association list of environment variables to set for the Zsh session. @item @code{zshenv} (default: @code{()}) (type: text-config) -List of strings or gexps, which will be added to @file{.zshenv}. Used +List of file-like objects, which will be added to @file{.zshenv}. Used for setting user's shell environment variables. Must not contain commands assuming the presence of tty or producing output. Will be read always. Will be read before any other file in @env{ZDOTDIR}. @item @code{zprofile} (default: @code{()}) (type: text-config) -List of strings or gexps, which will be added to @file{.zprofile}. Used +List of file-like objects, which will be added to @file{.zprofile}. Used for executing user's commands at start of login shell (In most cases the shell started on tty just after login). Will be read before @file{.zlogin}. @item @code{zshrc} (default: @code{()}) (type: text-config) -List of strings or gexps, which will be added to @file{.zshrc}. Used +List of file-like objects, which will be added to @file{.zshrc}. Used for executing user's commands at start of interactive shell (The shell for interactive usage started by typing @code{zsh} or by terminal app or any other program). @item @code{zlogin} (default: @code{()}) (type: text-config) -List of strings or gexps, which will be added to @file{.zlogin}. Used +List of file-like objects, which will be added to @file{.zlogin}. Used for executing user's commands at the end of starting process of login shell. @item @code{zlogout} (default: @code{()}) (type: text-config) -List of strings or gexps, which will be added to @file{.zlogout}. Used +List of file-like objects, which will be added to @file{.zlogout}. Used for executing user's commands at the exit of login shell. It won't be read in some cases (if the shell terminates by exec'ing another process for example). diff --git a/gnu/home/services/shells.scm b/gnu/home/services/shells.scm index 1cd17b2c32..e2730967b2 100644 --- a/gnu/home/services/shells.scm +++ b/gnu/home/services/shells.scm @@ -66,7 +66,7 @@ (define-configuration home-shell-profile-configuration @code{home-environment}, DO NOT create this service manually, it can only be extended. -@code{profile} is a list of strings or gexps, which will go to +@code{profile} is a list of file-like objects, which will go to @file{~/.profile}. By default @file{~/.profile} contains the initialization code, which have to be evaluated by login shell to make home-environment's profile avaliable to the user, but other commands @@ -107,7 +107,7 @@ (define home-shell-profile-service-type (default-value (home-shell-profile-configuration)) (description "Create @file{~/.profile}, which is used for environment initialization of POSIX compliant login shells. This -service type can be extended with a list of strings or gexps."))) +service type can be extended with a list of file-like objects."))) (define (serialize-boolean field-name val) "") (define (serialize-posix-env-vars field-name val) @@ -143,30 +143,30 @@ (define-configuration home-zsh-configuration serialize-posix-env-vars) (zshenv (text-config '()) - "List of strings or gexps, which will be added to @file{.zshenv}. + "List of file-like objects, which will be added to @file{.zshenv}. Used for setting user's shell environment variables. Must not contain commands assuming the presence of tty or producing output. Will be read always. Will be read before any other file in @env{ZDOTDIR}.") (zprofile (text-config '()) - "List of strings or gexps, which will be added to @file{.zprofile}. + "List of file-like objects, which will be added to @file{.zprofile}. Used for executing user's commands at start of login shell (In most cases the shell started on tty just after login). Will be read before @file{.zlogin}.") (zshrc (text-config '()) - "List of strings or gexps, which will be added to @file{.zshrc}. + "List of file-like objects, which will be added to @file{.zshrc}. Used for executing user's commands at start of interactive shell (The shell for interactive usage started by typing @code{zsh} or by terminal app or any other program).") (zlogin (text-config '()) - "List of strings or gexps, which will be added to @file{.zlogin}. + "List of file-like objects, which will be added to @file{.zlogin}. Used for executing user's commands at the end of starting process of login shell.") (zlogout (text-config '()) - "List of strings or gexps, which will be added to @file{.zlogout}. + "List of file-like objects, which will be added to @file{.zlogout}. Used for executing user's commands at the exit of login shell. It won't be read in some cases (if the shell terminates by exec'ing another process for example).")) @@ -244,19 +244,19 @@ (define-configuration/no-serialization home-zsh-extension "Association list of environment variables to set.") (zshrc (text-config '()) - "List of strings or gexps.") + "List of file-like objects.") (zshenv (text-config '()) - "List of strings or gexps.") + "List of file-like objects.") (zprofile (text-config '()) - "List of strings or gexps.") + "List of file-like objects.") (zlogin (text-config '()) - "List of strings or gexps.") + "List of file-like objects.") (zlogout (text-config '()) - "List of strings or gexps.")) + "List of file-like objects.")) (define (home-zsh-extensions original-config extension-configs) (home-zsh-configuration @@ -319,19 +319,19 @@ (define-configuration home-bash-configuration serialize-posix-env-vars) (bash-profile (text-config '()) - "List of strings or gexps, which will be added to @file{.bash_profile}. + "List of file-like objects, which will be added to @file{.bash_profile}. Used for executing user's commands at start of login shell (In most cases the shell started on tty just after login). @file{.bash_login} won't be ever read, because @file{.bash_profile} always present.") (bashrc (text-config '()) - "List of strings or gexps, which will be added to @file{.bashrc}. + "List of file-like objects, which will be added to @file{.bashrc}. Used for executing user's commands at start of interactive shell (The shell for interactive usage started by typing @code{bash} or by terminal app or any other program).") (bash-logout (text-config '()) - "List of strings or gexps, which will be added to @file{.bash_logout}. + "List of file-like objects, which will be added to @file{.bash_logout}. Used for executing user's commands at the exit of login shell. It won't be read in some cases (if the shell terminates by exec'ing another process for example).")) @@ -426,13 +426,13 @@ (define-configuration/no-serialization home-bash-extension "Association list of environment variables to set.") (bash-profile (text-config '()) - "List of strings or gexps.") + "List of file-like objects.") (bashrc (text-config '()) - "List of strings or gexps.") + "List of file-like objects.") (bash-logout (text-config '()) - "List of strings or gexps.")) + "List of file-like objects.")) (define (home-bash-extensions original-config extension-configs) (home-bash-configuration @@ -506,7 +506,7 @@ (define-configuration home-fish-configuration "The Fish package to use.") (config (text-config '()) - "List of strings or gexps, which will be added to + "List of file-like objects, which will be added to @file{$XDG_CONFIG_HOME/fish/config.fish}.") (environment-variables (alist '()) @@ -553,7 +553,7 @@ (define (fish-profile-service config) (define-configuration/no-serialization home-fish-extension (config (text-config '()) - "List of strings or gexps for extending the Fish initialization file.") + "List of file-like objects for extending the Fish initialization file.") (environment-variables (alist '()) "Association list of environment variables to set.") -- cgit v1.2.3 From 0623138ffa5b066afc25547ffdeb97753cb0ee9a Mon Sep 17 00:00:00 2001 From: Julien Lepiller Date: Sun, 10 Oct 2021 22:07:51 +0200 Subject: maint: Factorize po xref translation. This ensures we use the same method in "make" as in "guix/self.scm". * Makefile.am: Build guix/build/po.scm. * build-aux/convert-xref.scm: New file. * doc/local.mk (xref_command): Use it. * guix/self.scm (translate-cross-references): Move it... * guix/build/po.scm: Parse comments and flags separately to find fuzzy flags. (translate-cross-references): ...here. (parse-tree->assoc): Ignore fuzzy entries. --- Makefile.am | 12 ++++- build-aux/convert-xref.scm | 26 ++++++++++ doc/local.mk | 29 +++-------- guix/build/po.scm | 117 ++++++++++++++++++++++++++++++++++++++++++--- guix/self.scm | 82 +++++-------------------------- 5 files changed, 165 insertions(+), 101 deletions(-) create mode 100644 build-aux/convert-xref.scm (limited to 'doc') diff --git a/Makefile.am b/Makefile.am index 635147efc1..41ec19eb89 100644 --- a/Makefile.am +++ b/Makefile.am @@ -640,6 +640,7 @@ EXTRA_DIST += \ build-aux/check-final-inputs-self-contained.scm \ build-aux/check-channel-news.scm \ build-aux/compile-as-derivation.scm \ + build-aux/convert-xref.scm \ build-aux/generate-authors.scm \ build-aux/test-driver.scm \ build-aux/update-guix-package.scm \ @@ -699,8 +700,6 @@ $(1): $(2) --completed $(3) \ $$(filter %.scm,$$^) -.PHONY: $(1) - endef # Split compilation in several steps, each of which building a subset of @@ -712,22 +711,31 @@ MODULES_CORE = guix.scm $(filter-out guix/scripts/%,$(filter guix/%,$(MODULE MODULES_PACKAGES = $(filter gnu/packages/%,$(MODULES)) MODULES_SYSTEM = gnu.scm $(filter-out gnu/packages/%,$(filter gnu/%,$(MODULES))) MODULES_CLI = $(filter guix/scripts/%,$(MODULES)) +MODULES_PO = guix/build/po.scm $(eval $(call guile-compilation-rule,make-core-go, \ $(MODULES_CORE) guix/config.scm $(dist_noinst_DATA), \ 0)) +.PHONY: make-core-go $(eval $(call guile-compilation-rule,make-packages-go, \ $(MODULES_PACKAGES) make-core-go, \ $(words $(MODULES_CORE)))) +.PHONY: make-packages-go $(eval $(call guile-compilation-rule,make-system-go, \ $(MODULES_SYSTEM) make-packages-go make-core-go, \ $(words $(MODULES_CORE) $(MODULES_PACKAGES)))) +.PHONY: make-system-go $(eval $(call guile-compilation-rule,make-cli-go, \ $(MODULES_CLI) make-system-go make-packages-go make-core-go, \ $(words $(MODULES_CORE) $(MODULES_PACKAGES) $(MODULES_SYSTEM)))) +.PHONY: make-cli-go + +$(eval $(call guile-compilation-rule,guix/build/po.go, \ + $(MODULES_PO), \ + 0)) SUFFIXES = .go diff --git a/build-aux/convert-xref.scm b/build-aux/convert-xref.scm new file mode 100644 index 0000000000..47c8828857 --- /dev/null +++ b/build-aux/convert-xref.scm @@ -0,0 +1,26 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2021 Julien Lepiller +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +;; Translate cross-references in a translated .texi manual. + +(use-modules (guix build po) + (ice-9 match)) + +(match (command-line) + ((program texi pofile) + (translate-cross-references texi pofile))) diff --git a/doc/local.mk b/doc/local.mk index 8340b75a87..fff11f8183 100644 --- a/doc/local.mk +++ b/doc/local.mk @@ -97,44 +97,29 @@ PO4A_PARAMS += -k 0 # produce an output even if the translation is not complete PO4A_PARAMS += -f texinfo # texinfo format # When a change to guix.texi occurs, it is not translated immediately. -# Because @pxref and @xref commands are reference to a section by name, they +# Because @pxref and @xref commands are references to sections by name, they # should be translated. If a modification adds a reference to a section, this # reference is not translated, which means it references a section that does not # exist. -# This command loops through the translated files looking for references. For -# each of these references, it tries to find the translation and replaces the -# reference name, even in untranslated strings. -# The last sed is a multiline sed because some references span multiple lines. define xref_command -cat "$@.tmp" | egrep '@p?x?ref' -A1 | sed 'N;s|--\n||g;P;D' | sed 's|^| |g' | \ - tr -d '\012' | sed 's|\(@p\?x\?ref\)|\n\1|g' | egrep '@p?x?ref' | \ - sed 's|^.*@p\?x\?ref{\([^,}]*\).*$$|\1|g' | sort | uniq | while read e; do \ - if [ -n "$$e" ]; then \ - line=$$(grep -n "^msgid \"$$e\"" "$<" | cut -f1 --delimiter=":") ;\ - ((line++)) ;\ - if [ "$$line" != "1" ]; then \ - translation=$$(head -n "$$line" "$<" | tail -1 | grep msgstr | sed 's|msgstr "\([^"]*\)"|\1|') ;\ - if [ "$$translation" != "" ]; then \ - sed "N;s@\(p\?x\?ref\){$$(echo $$e | sed 's| |[\\n ]|g')\(,\|}\)@\1{$$translation\2@g;P;D" -i "$@.tmp" ;\ - fi ;\ - fi ;\ - fi ;\ -done +$(top_srcdir)/pre-inst-env $(GUILE) --no-auto-compile \ + "$(top_srcdir)/build-aux/convert-xref.scm" \ + $@.tmp $< endef -$(srcdir)/%D%/guix.%.texi: po/doc/guix-manual.%.po $(srcdir)/%D%/contributing.%.texi +$(srcdir)/%D%/guix.%.texi: po/doc/guix-manual.%.po $(srcdir)/%D%/contributing.%.texi guix/build/po.go -$(AM_V_PO4A)$(PO4A_TRANSLATE) $(PO4A_PARAMS) -m "%D%/guix.texi" -p "$<" -l "$@.tmp" -sed -i "s|guix\.info|$$(basename "$@" | sed 's|texi$$|info|')|" "$@.tmp" -$(AM_V_POXREF)$(xref_command) -mv "$@.tmp" "$@" -$(srcdir)/%D%/guix-cookbook.%.texi: po/doc/guix-cookbook.%.po +$(srcdir)/%D%/guix-cookbook.%.texi: po/doc/guix-cookbook.%.po guix/build/po.go -$(AM_V_PO4A)$(PO4A_TRANSLATE) $(PO4A_PARAMS) -m "%D%/guix-cookbook.texi" -p "$<" -l "$@.tmp" -sed -i "s|guix-cookbook\.info|$$(basename "$@" | sed 's|texi$$|info|')|" "$@.tmp" -$(AM_V_POXREF)$(xref_command) -mv "$@.tmp" "$@" -$(srcdir)/%D%/contributing.%.texi: po/doc/guix-manual.%.po +$(srcdir)/%D%/contributing.%.texi: po/doc/guix-manual.%.po guix/build/po.go -$(AM_V_PO4A)$(PO4A_TRANSLATE) $(PO4A_PARAMS) -m "%D%/contributing.texi" -p "$<" -l "$@.tmp" -$(AM_V_POXREF)$(xref_command) -mv "$@.tmp" "$@" diff --git a/guix/build/po.scm b/guix/build/po.scm index eb9690ad1a..7f88164cd8 100644 --- a/guix/build/po.scm +++ b/guix/build/po.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2019 Julien Lepiller +;;; Copyright © 2019, 2021 Julien Lepiller ;;; Copyright © 2020 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. @@ -20,17 +20,23 @@ (define-module (guix build po) #:use-module (ice-9 match) #:use-module (ice-9 peg) + #:use-module (ice-9 regex) #:use-module (ice-9 textual-ports) - #:export (read-po-file)) + #:use-module (ice-9 vlist) + #:use-module (srfi srfi-1) + #:export (read-po-file + translate-cross-references)) ;; A small parser for po files -(define-peg-pattern po-file body (* (or comment entry whitespace))) +(define-peg-pattern po-file body (* (or entry whitespace))) (define-peg-pattern whitespace body (or " " "\t" "\n")) (define-peg-pattern comment-chr body (range #\space #\頋)) (define-peg-pattern comment none (and "#" (* comment-chr) "\n")) +(define-peg-pattern flags all (and (ignore "#, ") (* comment-chr) (ignore "\n"))) (define-peg-pattern entry all - (and (ignore (* whitespace)) (ignore "msgid ") msgid - (ignore (* whitespace)) (ignore "msgstr ") msgstr)) + (and (* (or flags comment (ignore (* whitespace)))) + (ignore "msgid ") msgid (ignore (* whitespace)) + (ignore "msgstr ") msgstr)) (define-peg-pattern escape body (or "\\\\" "\\\"" "\\n")) (define-peg-pattern str-chr body (or " " "!" (and (ignore "\\") "\"") "\\n" (and (ignore "\\") "\\") @@ -53,7 +59,24 @@ (define (interpret-newline-escape str) (append (list "\n" prefix) result))))))) (define (parse-tree->assoc parse-tree) - "Converts a po PARSE-TREE to an association list." + "Converts a po PARSE-TREE to an association list, where the key is the msgid +and the value is the msgstr. The result only contains non fuzzy strings." + (define (comments->flags comments) + (match comments + (('flags flags) + (map (lambda (flag) (string->symbol (string-trim-both flag #\space))) + (string-split flags #\,))) + ((? list? comments) + (fold + (lambda (comment res) + (match comment + ((? string? _) res) + (flags + (append (comments->flags flags) + res)))) + '() + comments)))) + (match parse-tree (() '()) ((entry . parse-tree) @@ -66,10 +89,22 @@ (define (parse-tree->assoc parse-tree) ;; empty msgstr (('entry ('msgid msgid) 'msgstr) (parse-tree->assoc parse-tree)) + (('entry _ ('msgid msgid) 'msgstr) + (parse-tree->assoc parse-tree)) + (('entry ('msgid msgid) ('msgstr msgstr)) + (acons (interpret-newline-escape msgid) + (interpret-newline-escape msgstr) + (parse-tree->assoc parse-tree))) (('entry ('msgid msgid) ('msgstr msgstr)) (acons (interpret-newline-escape msgid) (interpret-newline-escape msgstr) - (parse-tree->assoc parse-tree))))))) + (parse-tree->assoc parse-tree))) + (('entry comments ('msgid msgid) ('msgstr msgstr)) + (if (member 'fuzzy (comments->flags comments)) + (parse-tree->assoc parse-tree) + (acons (interpret-newline-escape msgid) + (interpret-newline-escape msgstr) + (parse-tree->assoc parse-tree)))))))) (define (read-po-file port) "Read a .po file from PORT and return an alist of msgid and msgstr." @@ -77,3 +112,71 @@ (define (read-po-file port) po-file (get-string-all port))))) (parse-tree->assoc tree))) + +(define (canonicalize-whitespace str) + "Change whitespace (newlines, etc.) in STR to @code{#\\space}." + (string-map (lambda (chr) + (if (char-set-contains? char-set:whitespace chr) + #\space + chr)) + str)) + +(define xref-regexp + ;; Texinfo cross-reference regexp. + (make-regexp "@(px|x)?ref\\{([^,}]+)")) + +(define (translate-cross-references texi pofile) + "Translate the cross-references that appear in @var{texi}, the initial +translation of a Texinfo file, using the msgid/msgstr pairs from @var{pofile}." + (define translations + (call-with-input-file pofile read-po-file)) + + (define content + (call-with-input-file texi get-string-all)) + + (define matches + (list-matches xref-regexp content)) + + (define translation-map + (fold (match-lambda* + (((msgid . str) result) + (vhash-cons msgid str result))) + vlist-null + translations)) + + (define translated + ;; Iterate over MATCHES and replace cross-references with their + ;; translation found in TRANSLATION-MAP. (We can't use + ;; 'substitute*' because matches can span multiple lines.) + (let loop ((matches matches) + (offset 0) + (result '())) + (match matches + (() + (string-concatenate-reverse + (cons (string-drop content offset) result))) + ((head . tail) + (let ((prefix (match:substring head 1)) + (ref (canonicalize-whitespace (match:substring head 2)))) + (define translated + (string-append "@" (or prefix "") + "ref{" + (match (vhash-assoc ref translation-map) + (#f ref) + ((_ . str) str)))) + + (loop tail + (match:end head) + (append (list translated + (string-take + (string-drop content offset) + (- (match:start head) offset))) + result))))))) + + (format (current-error-port) + "translated ~a cross-references in '~a'~%" + (length matches) texi) + + (call-with-output-file texi + (lambda (port) + (display translated port)))) diff --git a/guix/self.scm b/guix/self.scm index a0d448742a..bd9a71de45 100644 --- a/guix/self.scm +++ b/guix/self.scm @@ -316,81 +316,23 @@ (define (canonicalize-whitespace str) chr)) str)) - (define xref-regexp - ;; Texinfo cross-reference regexp. - (make-regexp "@(px|x)?ref\\{([^,}]+)")) - - (define (translate-cross-references texi translations) - ;; Translate the cross-references that appear in TEXI, a Texinfo - ;; file, using the msgid/msgstr pairs from TRANSLATIONS. - (define content - (call-with-input-file texi get-string-all)) - - (define matches - (list-matches xref-regexp content)) - - (define translation-map - (fold (match-lambda* - (((msgid . str) result) - (vhash-cons msgid str result))) - vlist-null - translations)) - - (define translated - ;; Iterate over MATCHES and replace cross-references with their - ;; translation found in TRANSLATION-MAP. (We can't use - ;; 'substitute*' because matches can span multiple lines.) - (let loop ((matches matches) - (offset 0) - (result '())) - (match matches - (() - (string-concatenate-reverse - (cons (string-drop content offset) result))) - ((head . tail) - (let ((prefix (match:substring head 1)) - (ref (canonicalize-whitespace (match:substring head 2)))) - (define translated - (string-append "@" (or prefix "") - "ref{" - (match (vhash-assoc ref translation-map) - (#f ref) - ((_ . str) str)))) - - (loop tail - (match:end head) - (append (list translated - (string-take - (string-drop content offset) - (- (match:start head) offset))) - result))))))) - - (format (current-error-port) - "translated ~a cross-references in '~a'~%" - (length matches) texi) - (call-with-output-file texi - (lambda (port) - (display translated port)))) - (define* (translate-texi prefix po lang #:key (extras '())) "Translate the manual for one language LANG using the PO file. PREFIX must be the prefix of the manual, 'guix' or 'guix-cookbook'. EXTRAS is a list of extra files, such as '(\"contributing\")." - (let ((translations (call-with-input-file po read-po-file))) - (for-each (lambda (file) - (translate-tmp-texi po (string-append file ".texi") - (string-append file "." lang - ".texi.tmp"))) - (cons prefix extras)) - - (for-each (lambda (file) - (let* ((texi (string-append file "." lang ".texi")) - (tmp (string-append texi ".tmp"))) - (copy-file tmp texi) - (translate-cross-references texi - translations))) - (cons prefix extras)))) + (for-each (lambda (file) + (translate-tmp-texi po (string-append file ".texi") + (string-append file "." lang + ".texi.tmp"))) + (cons prefix extras)) + + (for-each (lambda (file) + (let* ((texi (string-append file "." lang ".texi")) + (tmp (string-append texi ".tmp"))) + (copy-file tmp texi) + (translate-cross-references texi po))) + (cons prefix extras))) (define (available-translations directory domain) ;; Return the list of available translations under DIRECTORY for -- cgit v1.2.3