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.
51 lines
1.6 KiB
51 lines
1.6 KiB
(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)) |
|
|
|
|