nani/website/tools/i18n.scm

i18n.scm

1
;;; Nani Project website
2
;;; Copyright © 2019 Julien Lepiller <julien@lepiller.eu>
3
;;;
4
;;; This file is part of the Nani Project website.
5
;;;
6
;;; The Nani Project website is free software; you can redistribute it and/or modify it
7
;;; under the terms of the GNU Affero General Public License as published by
8
;;; the Free Software Foundation; either version 3 of the License, or (at
9
;;; your option) any later version.
10
;;;
11
;;; The Nani Project website is distributed in the hope that it will be useful, but
12
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
13
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
;;; GNU Affero General Public License for more details.
15
;;;
16
;;; You should have received a copy of the GNU Affero General Public License
17
;;; along with the Nani Project website.  If not, see <http://www.gnu.org/licenses/>.
18
19
(define-module (tools i18n)
20
  #:use-module (haunt builder blog)
21
  #:use-module (haunt html)
22
  #:use-module (haunt page)
23
  #:use-module (sxml simple)
24
  #:use-module (ice-9 match)
25
  #:export (internationalize languages _ site-locale))
26
27
(define language-map
28
  `(("" . "en_US.UTF-8")
29
    ("en" . "en_US.UTF-8")
30
    ("fr" . "fr_FR.UTF-8")))
31
32
(define languages
33
  (map car language-map))
34
35
(define (site-locale locale)
36
  (setlocale LC_ALL
37
    (assoc-ref language-map locale))
38
  (bindtextdomain "nani" (string-append (dirname (current-filename)) "/../po"))
39
  (textdomain "nani"))
40
41
(site-locale "fr")
42
43
(define (__ tr . args)
44
  (xml->sxml (apply format #f (format #f "<tr>~a</tr>" (gettext tr)) args)))
45
46
(define (_ tr . args)
47
  (let ((res (apply __ tr args)))
48
    (match res
49
      ((*TOP* (tr rest ...)) rest))))
50
51
(define (tr body)
52
  (match body
53
    (('_ rest ...) (apply _ rest))
54
    ((tag ('@ opt ...) rest ...) (apply list tag (apply list '@ opt) (map tr rest)))
55
    ((tag rest ...) (apply list tag (map tr rest)))
56
    (foo foo)))
57
58
(define (make-my-page lang title filename body layout)
59
  (lambda (site posts)
60
    (define (my-body)
61
      (site-locale lang)
62
      (tr body))
63
    (make-page (if (equal? lang "")
64
                 (string-append filename ".html")
65
                 (string-append filename "." lang ".html"))
66
               (with-layout (layout lang filename) site title (my-body))
67
               sxml->html)))
68
69
(define (internationalize title filename body layout)
70
  (map (lambda (lang) (make-my-page lang title filename body layout)) languages))
71