root/trunk/projects/bos/web/website-language.lisp

Revision 3671, 2.1 kB (checked in by ksprotte, 4 months ago)

again whitespace cleanup + removed tabs

Line 
1 (in-package :bos.web)
2
3 (enable-interpol-syntax)
4
5 (define-persistent-class website-language ()
6   ((code :read :index-type string-unique-index :index-reader language-with-code)
7    (name :read :index-type string-unique-index)))
8
9 (defun website-languages ()
10   (mapcar #'(lambda (language) (list (website-language-code language)
11                                      (website-language-name language)))
12           (class-instances 'website-language)))
13
14 (defun website-supports-language (language)
15   (find language (website-languages) :test #'string-equal :key #'car))
16
17 (defun language-from-url (path)
18   (register-groups-bind (language) (#?r"^/(..)/" path)
19     (when (website-supports-language language)
20       language)))
21
22 (defun find-browser-prefered-language ()
23   "Determine the language prefered by the user, as determined by the Accept-Language header
24 present in the HTTP request.  Header decoding is done according to RFC2616, considering individual
25 language preference weights."
26   (let ((accept-language (hunchentoot:header-in* :accept-language)))
27     (dolist (language (mapcar #'car
28                               (sort (mapcar #'(lambda (language-spec-string)
29                                                 (if (find #\; language-spec-string)
30                                                     (destructuring-bind (language preference-string)
31                                                         (split #?r" *; *q=" language-spec-string)
32                                                       (cons language (read-from-string preference-string)))
33                                                     (cons language-spec-string 1)))
34                                             (split #?r" *, *" accept-language))
35                                     #'> :key #'cdr)))
36       (when (website-supports-language language)
37         (return-from find-browser-prefered-language language))
38       (register-groups-bind (language variant) (#?r"^(.*)-(.*)$" language)
39         (declare (ignore variant))
40         (when (website-supports-language language)
41           (return-from find-browser-prefered-language language)))))
42   nil)
Note: See TracBrowser for help on using the browser.