如何在Yesod中实现EN/PL语言切换按钮?
在Yesod中实现语言切换按钮的方案
获取当前语言的两种途径
Yesod没有直接提供getLanguage函数,但可以通过以下方式获取当前语言设置:
- 读取Session存储的手动设置语言:调用
setLanguage时,Yesod会将语言值存在Session的_LANG键中,直接用lookupSession "_LANG"即可获取,返回Maybe Text类型结果。 - 解析客户端请求头的语言偏好:如果用户未手动切换过语言,可以解析
Accept-Language请求头获取默认偏好,示例代码如下:import Network.Wai (requestHeaders) import Data.ByteString.Char8 (unpack) import Text.ParserCombinators.ReadP (readP_to_S) import Yesod.Core (getRequest, lookupSession) import Data.Maybe (listToMaybe) import Data.Text (pack) getCurrentLang :: Handler (Maybe Text) getCurrentLang = do -- 优先读取Session中的手动设置 mSessionLang <- lookupSession "_LANG" case mSessionLang of Just lang -> return $ Just lang Nothing -> do -- 无手动设置时解析请求头 req <- getRequest let acceptLang = lookup "Accept-Language" $ requestHeaders req case acceptLang of Just bs -> let parsed = readP_to_S parseAcceptLanguage (unpack bs) in return $ fmap pack $ fst <$> listToMaybe parsed Nothing -> return Nothing
实现双向切换按钮
添加语言切换路由:在路由定义中新增切换路由:
mkYesod "App" [parseRoutes| / HomeR GET /switch-lang/#Text SwitchLangR GET |]编写切换逻辑Handler:负责设置目标语言并重载页面:
getSwitchLangR :: Text -> Handler Html getSwitchLangR targetLang = do setLanguage targetLang -- 重定向回原页面,此处简化为首页 redirect HomeR在页面生成切换按钮:在页面Handler中获取当前语言,判断目标语言后生成切换链接:
getHomeR :: Handler Html getHomeR = do -- 默认语言设为EN currentLang <- maybe "en" id <$> lookupSession "_LANG" let (displayText, targetLang) = if currentLang == "en" then ("PL", "pl") else ("EN", "en") defaultLayout $ do [whamlet| <a href=@{SwitchLangR targetLang} class="lang-switch">EN/#{displayText} |]
点击按钮后,程序会设置目标语言并重载页面,实现EN与PL的双向切换。
内容的提问来源于stack exchange,提问作者Reverent Lapwing
相关产品推荐
相关产品推荐

