You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
    

实现双向切换按钮

  1. 添加语言切换路由:在路由定义中新增切换路由:

    mkYesod "App" [parseRoutes|
      / HomeR GET
      /switch-lang/#Text SwitchLangR GET
    |]
    
  2. 编写切换逻辑Handler:负责设置目标语言并重载页面:

    getSwitchLangR :: Text -> Handler Html
    getSwitchLangR targetLang = do
      setLanguage targetLang
      -- 重定向回原页面,此处简化为首页
      redirect HomeR
    
  3. 在页面生成切换按钮:在页面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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 07:19:57