当我将我的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。
这是我公共文件夹中的es错误页面。您将看到文本是西班牙语,而不是英语。
答案 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