Rails 5:如何在公共文件夹中获取不同语言环境的错误页面以显示除“en?

时间:2017-06-23 16:01:11

标签: ruby-on-rails ruby-on-rails-4 heroku error-handling internationalization

当我将我的Rails应用程序从3.2.13转换为Rails 4时,我问了这个问题:fixed。我发现我所要做的就是为每个错误代码和语言环境创建错误文件。在我的Rails 4应用中,我有 404.en.html 404.fr.html 500.en.html 500 .fr.html 在我的公共文件夹中。他们按预期工作。

我最近将我的所有Rails应用程序转换为Rails 5,但直到现在才检查这是否仍然有效。我重新设计了我的一个应用程序并升级到Rails 5.1.1。我将错误页面重新创建为我的新网站格式。在将更改部署到Heroku之前,我正在尝试在localhost中测试我的错误页面。我在/config/environments/development.rb中有以下临时配置,因此我可以看到我的错误页面。

config.consider_all_requests_local = false
config.action_dispatch.show_exceptions = true

当我用英语显示我的网站并强制显示错误时,英语错误页面 404.en.html 会按预期显示。但是,当我显示页面的法语版本并强制显示相同的错误时,将显示英语错误页面,而不是法语错误页面 404.fr.html 。我多次验证法语错误文件中的文本是法语,而不是英语。

我一直在搜索Stack Overflow和网络上,但我没有找到任何关于如何为Rails 5执行此操作的信息。几乎所有这些都是针对Rails 2,3或4。

我决定部署到Heroku,看看问题是否与我使用localhost进行测试有关。不幸的是我遇到了同样的问题。

我再次搜索并看到在Rails文档中他们使用了救援页面,所以我在5.0网站的指南网站上进行了搜索,找到了关于本地化视图的Rails 4 - Would Like To Do Custom Error Pages in Public Folder Using I18n,其中简要提到了救援文件。

application_controller

before_action :set_locale

def default_url_options(options={}) 
  { :locale => I18n.locale }
end

private

  def set_locale
    I18n.locale = (params[:locale] if params[:locale].present?) || cookies[:locale] || I18n.default_locale || 'en'
    cookies[:locale] = I18n.locale if cookies[:locale] != I18n.locale
  end

这是我的日志,其中语言环境是“es”

在2017-08-12 10:00:34 -0500开始获取127.0.0.1的“/ es” 由PagesController#home作为HTML处理   参数:{“locale”=>“es”} ES

以下是英语错误页面如何显示区域设置。当我点击此页面上的任何链接时,它会显示我期望的网站的西班牙语版本,因为区域设置是es。

following

这是我公共文件夹中的es错误页面。您将看到文本是西班牙语,而不是英语。

enter image description here

1 个答案:

答案 0 :(得分:0)

向错误页面添加国际化的一种方法是将自定义路由添加到控制器并使用config/locales上的yml文件来实现不同语言的内容。

首先,定义错误路由并设置控制器来处理这些路由

config / routes.rb

AwesomeApp::Application.routes.draw do
  # custom error routes
  match '/404' => 'errors#not_found', :via => :all
  match '/422' => 'errors#unprocessable_entity', :via => :all
  match '/500' => 'errors#internal_server_error', :via => :all

  ...
end

应用/控制器/ errors_controller.rb

class ErrorsController < ApplicationController
  def internal_server_error
    render(:status => 500)
  end

  def not_found
    render(:status => 404)
  end

  def unprocessable_entity
    render(:status => 422)
  end
end

然后,为不同的语言添加I18n定义配置 例如,英语和法语:

<强>配置/区域设置/ en.yml

en:
  page_not_found: "The page you were looking for doesn't exist."

<强>配置/区域设置/ fr.yml

fr:
  page_not_found: "La page que vous recherchiez n'existe pas."

然后,在ErrorController的操作的相应视图文件上使用它。根据您I18n.locale的值,视图将被翻译为所需的语言。

应用/视图/错误/ not_found.html.erb

<div class="container">
  <div class="row">
    <div class="align-center">
      <h3><%= t('page_not_found') %></h3>
    </div>
  </div>
</div>

这是一种更简洁的方法来设置错误页面,而不是为公共文件夹上的不同错误维护不同的文件。

更新

根据建议,config/application.rb需要此配置才能实现此目的:

config.exceptions_app = self.routes