【问题标题】:How to render the correct view when using internationalization使用国际化时如何渲染正确的视图
【发布时间】:2019-08-08 07:12:49
【问题描述】:

当模板依赖于语言环境时,如何在控制器操作中呈现正确的模板。例如,如果您有两个文件edit.html.erbedit.fr.html.erb,您如何根据语言环境调用render :edit

【问题讨论】:

  • 用i18n不是更方便吗?不知道你们有没有什么限制……
  • 你可以那样做

标签: ruby-on-rails localization internationalization


【解决方案1】:

你可以这样做:

def edit
  if params[:locale].present?
    render "edit.#{params[:locale]}"
  end
end

如果:locale 参数不存在,edit.html.erb 模板将默认呈现。正如@Sandra 所说,最好只在模板中使用I18n 字符串,除非您的要求无法实现。

【讨论】:

  • 很有趣,但是如果存在验证错误,它会在呈现编辑的更新操作中工作吗?
  • 没有。在这种情况下,您将添加一个呈现 :update 的 else 子句。作为一般规则和我个人的偏好,我会将其添加到这两个操作中,直到您在第三个操作中需要它为止。在这种情况下,我会将其移至私有方法,正如 Obromios 的回答所建议的那样
  • 我不确定你所说的 I18n 字符串是什么意思,但我知道当我在应用程序控制器中执行通常的 default_url_options,{ locale: I18n.locale } 时,我不需要执行上述操作。但事实证明,我只需要将翻译限制为一个控制器,而不使用 ?locale=fr 生成任何额外的 url,因此似乎需要执行上述操作。
  • 我的意思是您将在视图模板本身中使用相关的I18n 字符串翻译:guides.rubyonrails.org/…。这样你每次都渲染相同的模板并调用I18n.t(:some_configuration_key)
  • 抱歉,最初没有看到您提出并回答了问题
【解决方案2】:

在控制器的私有部分中,定义以下方法

  def locale_suffix
    locale = params[:locale]
    return '' if locale.nil? || locale == I18n.default_locale

    ".#{locale}"
  end

然后在你的行动中

def edit
  ...
  render "edit#{locale_suffix}"
end

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2013-03-22
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多