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

如何在Grape API与Rails项目中统一设置多语言locale

你在Rails路由scope中定义的:locale是Rails路由层的动态路径参数,Grape默认不会将这类参数同步到自身的params对象中,所以直接在Grape里读params[:locale]是拿不到值的,以下是两种可行的配置方案:

方案1:手动解析请求路径提取locale

在你的Grape API顶层基类中添加全局before钩子,从请求路径中拆分出locale:

module MyApi
  class Api < Grape::API
    # 所有接口请求前的全局钩子
    before do
      # 拆分路径段,示例路径 /zh-CN/api/v1/users 拆分后为 ["", "zh-CN", "api", "v1", "users"]
      path_segments = request.path.split('/')
      parsed_locale = path_segments[1]
      # 校验合法性后设置locale,逻辑和ApplicationController保持一致
      I18n.locale = if I18n.available_locales.map(&:to_s).include?(parsed_locale)
                      parsed_locale
                    else
                      I18n.default_locale
                    end
    end

    # 原有API挂载、配置代码保留
    # ...
  end
end

方案2(推荐):直接读取Rails路由匹配结果

不用手动拆分路径,直接从Rails存入请求env的路由参数中读取locale,完全复用你路由配置的locale匹配规则,后续路由规则修改也不用调整Grape代码:

module MyApi
  class Api < Grape::API
    before do
      # 读取Rails路由匹配到的路径参数
      rails_path_params = request.env['action_dispatch.request.path_parameters']
      parsed_locale = rails_path_params[:locale]
      I18n.locale = I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : I18n.default_locale
    end

    # 原有API代码保留
    # ...
  end
end

可选优化

如果你需要兼容请求头传递locale的场景(比如客户端不通过路径传locale的情况),可以调整locale的读取优先级,和你的ApplicationController逻辑保持一致即可,比如优先读路由里的locale,没有就读取Accept-Language请求头的值,最后用默认locale。

内容的提问来源于stack exchange,提问作者LiKaZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:15:03