如何在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
相关产品推荐
相关产品推荐

