Skip to content

Commit

Permalink
add language detection by Accept-Language header
Browse files Browse the repository at this point in the history
  • Loading branch information
peterstadler committed Sep 22, 2020
1 parent 8edea3b commit f9be948
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions modules/config.xqm
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,16 @@ declare variable $config:default-date-picture-string := function($lang as xs:str
:)
declare function config:guess-language($lang as xs:string?) as xs:string {
let $urlPathSegment := if(request:exists()) then tokenize(request:get-attribute('$exist:path'), '/')[2] else ()
let $browserLanguage := function() as xs:string* {
(config:get-ordered-browser-languages()[.=$config:valid-languages])[1]
}
let $sessionParam := if(session:exists()) then session:get-attribute('lang') else ()
let $default-option := $config:valid-languages[1]
return
if($lang = $config:valid-languages) then ($lang, session:set-attribute('lang', $lang))
else if($urlPathSegment = $config:valid-languages) then ($urlPathSegment, session:set-attribute('lang', $urlPathSegment))
else if($sessionParam = $config:valid-languages) then $sessionParam
else if($browserLanguage()) then ($browserLanguage(), session:set-attribute('lang', $browserLanguage()))
else $default-option
};

Expand Down Expand Up @@ -536,3 +540,20 @@ declare %private function config:map-put-recursive($map as map(*), $key as xs:st
config:map-put-recursive(map {}, subsequence($key, 2), $value)
)
};

(:~
: Get browser languages from Accept-Language header and return them in order
:
: @return the language tags in order of `q` value and (secondly) in original order
:)
declare function config:get-ordered-browser-languages() as xs:string* {
if(request:exists()) then
for $val at $index in tokenize(request:get-header('Accept-Language'), '\s*,\s*')
let $q :=
if(substring-after($val, 'q=') castable as xs:double) then number(substring-after($val, 'q='))
else 1
let $lang := tokenize($val, ';')[1]
order by $q descending, $index ascending
return $lang
else ()
};

0 comments on commit f9be948

Please sign in to comment.