You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.6 KiB
52 lines
1.6 KiB
2 years ago
|
(in-package #:cl-user)
|
||
|
(defpackage #:rails-to-caveman.locale
|
||
|
(:use #:cl)
|
||
|
(:export #:define-dictionary
|
||
|
#:with-i18n
|
||
|
#:accept-language
|
||
|
#:parse-accept-language
|
||
|
#:find-locale
|
||
|
#:find-acceptable-locale))
|
||
|
(in-package #:rails-to-caveman.locale)
|
||
|
|
||
|
(cl-locale:define-dictionary rails-to-caveman
|
||
|
("ja" (merge-pathnames "locale/ja-jp.lisp"
|
||
|
rails-to-caveman.config:*static-directory*))
|
||
|
("ja-JP" (merge-pathnames "locale/ja-jp.lisp"
|
||
|
rails-to-caveman.config:*static-directory*)))
|
||
|
|
||
|
(defmacro define-dictionary (name &rest args)
|
||
|
`(progn (cl-locale:define-dictionary ,name ,@args)
|
||
|
(defun reload ()
|
||
|
(loop :for (locale dictionary)
|
||
|
:in (list ,@(mapcar (lambda (arg)
|
||
|
`(list ,@arg)) args))
|
||
|
:do (cl-locale.core::register-dictionary ',name dictionary
|
||
|
:locale locale)))))
|
||
|
|
||
|
(defmacro with-i18n ((dictionary locale) &body string-generate-form)
|
||
|
`(let ((cl-locale.core::*dictionary*
|
||
|
(cl-locale.core::ensure-dictionary ',dictionary))
|
||
|
(cl-locale.core::*locale* ,locale))
|
||
|
(cl-locale:i18n (progn ,@string-generate-form))))
|
||
|
|
||
|
(defun accept-language ()
|
||
|
(and ningle:*request* (gethash "accept-langauge"
|
||
|
(getf (lack.request:request-env
|
||
|
ningle:*request*) :headers))))
|
||
|
|
||
|
(defun parse-accept-language (paremeter)
|
||
|
(mapcar #'car (sort (mapcar (lambda (param)
|
||
|
(ppcre:split ";q=" param))
|
||
|
(ppcre:split #\, paremeter))
|
||
|
#'> :key (lambda (x)
|
||
|
(read-from-string (or (cadr x) "1"))))))
|
||
|
|
||
|
(defun find-locale (locale)
|
||
|
(and cl-locale.core::*dictionary*
|
||
|
(gethash locale cl-locale.core::*dictionary*)))
|
||
|
|
||
|
(defun find-acceptable-locale (locales)
|
||
|
(find-if #'find-locale locales))
|
||
|
|