;;; GNU Guix web site ;;; Copyright © 2019 Florian Pelz ;;; ;;; This file is part of the GNU Guix web site. ;;; ;;; The GNU Guix web site is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU Affero General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; The GNU Guix web site 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 Affero General Public License for more details. ;;; ;;; You should have received a copy of the GNU Affero General Public License ;;; along with the GNU Guix web site. If not, see . (define-module (apps i18n) #:use-module (haunt page) #:use-module (haunt utils) #:use-module (ice-9 match) #:use-module (sexp-xgettext) #:use-module (srfi srfi-1) #:export (G_ N_ C_ NC_ %current-lingua builder->localized-builder builders->localized-builders)) (define %gettext-domain "guix-website") (bindtextdomain %gettext-domain (getcwd)) (bind-textdomain-codeset %gettext-domain "UTF-8") (textdomain %gettext-domain) (define-syntax G_ sgettext) (set-simple-keywords! '(G_)) (define-syntax N_ ;like ngettext sngettext) (define-syntax C_ ;like pgettext spgettext) (define-syntax NC_ ;like npgettext snpgettext) (set-complex-keywords! '(N_ C_ NC_)) (define (@@ (haunt page) )) (define %current-lingua (make-parameter "en_US")) (define (first-value arg) "For some reason the builder returned by static-directory returns multiple values. This procedure is used to retain only the first return value. TODO: This should not be necessary." arg) (define (builder->localized-builder builder lingua) "Returns a Haunt builder procedure generated from an existing BUILDER with translations for LINGUA coming from sexp-xgettext." (compose (lambda (pages) (map (lambda (page) (match page (($ file-name contents writer) (if (string-suffix? ".html" file-name) (let* ((base (string-drop-right file-name (string-length ".html"))) (new-name (string-append base "." lingua ".html"))) (make-page new-name contents writer)) page)) (else page))) pages)) (lambda (site posts) (begin (setlocale LC_ALL (string-append lingua ".utf8")) (parameterize ((%current-lingua lingua)) (first-value (builder site posts))))))) (define (builders->localized-builders builders linguas) "Returns a list of new Haunt builder procedures generated from BUILDERS and localized via sexp-xgettext for each of the LINGUAS." (flatten (map-in-order (lambda (builder) (map-in-order (lambda (lingua) (builder->localized-builder builder lingua)) linguas)) builders)))