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 (sxml simple)
21
  #:use-module (ice-9 match)
22
  #:export (languages tr _ site-locale translate))
23
24
(define language-map
25
  `(("" . "en_US.UTF-8")
26
    ("en" . "en_US.UTF-8")
27
    ("fr" . "fr_FR.UTF-8")))
28
29
(define languages
30
  (map car language-map))
31
32
(define (site-locale locale)
33
  (setlocale LC_ALL
34
    (assoc-ref language-map locale))
35
  (bindtextdomain "nani" (string-append (dirname (current-filename)) "/../po"))
36
  (textdomain "nani"))
37
38
(site-locale "fr")
39
40
(define (__ tr . args)
41
  (xml->sxml (apply format #f (format #f "<tr>~a</tr>" (gettext tr)) args)))
42
43
(define (_ tr . args)
44
  (let ((res (apply __ tr args)))
45
    (match res
46
      ((*TOP* (tr rest ...)) (car rest)))))
47
48
(define (tr body)
49
  (match body
50
    (('_ rest) (_ rest))
51
    (('_ rest ...) (apply _ rest))
52
    ((tag ('@ opt ...) rest ...) (apply list tag (apply list '@ opt) (map tr rest)))
53
    ((tag rest ...) (apply list tag (map tr rest)))
54
    (foo foo)))
55
56
(define (translate str lang)
57
  (site-locale lang)
58
  (tr str))
59