gpt4 book ai didi

ruby-on-rails-3.2 - i18n 路由到已安装的引擎 - 忽略语言环境

转载 作者:行者123 更新时间:2023-12-04 12:32:54 26 4
gpt4 key购买 nike

我有一个内置了 i18n 支持的应用程序 (my_test_app)。目前,有两种语言文件可用,FR 和 EN,如果我在它们之间来回切换,对于非引擎功能(例如用户索引/显示/编辑/删除 (ISED)),一切都如我所愿选项。

在 my_test_app 中,我安装了一个 Rails 引擎(my_engine),它有一个 Controller 和模型集(engine_job)。所以,一个可行的 URL 应该是

http://0.0.0.0:3000/fr/my_engine/engine_job

然而,无论我选择哪种语言,它总是出现在 EN 中。检查参数显示:
--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
locale: fr
action: index
controller: my_engine/engine_job

然而选择的翻译是EN。

my_test_app route.rb:
MyTestApp::Application.routes.draw do

scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
mount MyEngine::Engine, at: "/my_engine"
end # scope locale

match '*path', to: redirect("/#{I18n.default_locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" and !req.path == "/#{I18n.default_locale}/"}
match '', to: redirect("/#{I18n.default_locale}/")
end

my_engine route.rb:
MyEngine::Engine.routes.draw do
resources :my_jobs
end

耙路线:
my_engine        (/:locale)/my_engine           MyEngine::Engine {:locale=>/en|fr/}
/*path(.:format) :controller#:action
/ :controller#:action
users GET (/:locale)/users(.:format) users#index {:locale=>/en|fr/}
POST (/:locale)/users(.:format) users#create {:locale=>/en|fr/}
new_user GET (/:locale)/users/new(.:format) users#new {:locale=>/en|fr/}
edit_user GET (/:locale)/users/:id/edit(.:format) users#edit {:locale=>/en|fr/}
user GET (/:locale)/users/:id(.:format) users#show {:locale=>/en|fr/}
PUT (/:locale)/users/:id(.:format) users#update {:locale=>/en|fr/}
DELETE (/:locale)/users/:id(.:format) users#destroy {:locale=>/en|fr/}
sessions POST (/:locale)/sessions(.:format) sessions#create {:locale=>/en|fr/}
new_session GET (/:locale)/sessions/new(.:format) sessions#new {:locale=>/en|fr/}
session DELETE (/:locale)/sessions/:id(.:format) sessions#destroy {:locale=>/en|fr/}
signup (/:locale)/signup(.:format) users#new {:locale=>/en|fr/}
signin (/:locale)/signin(.:format) sessions#new {:locale=>/en|fr/}
signout DELETE (/:locale)/signout(.:format) sessions#destroy {:locale=>/en|fr/}
help (/:locale)/help(.:format) static_pages#help {:locale=>/en|fr/}
about (/:locale)/about(.:format) static_pages#about {:locale=>/en|fr/}
root /(:locale)(.:format) static_pages#home {:locale=>/en|fr/}

Routes for MyEngine::Engine {:locale=>/en|fr/}:
engine_jobs GET /engine_jobs(.:format) my_engine/engine_jobs#index
POST /engine_jobs(.:format) my_engine/engine_jobs#create
new_engine_job GET /engine_jobs/new(.:format) my_engine/engine_jobs#new
edit_engine_job GET /engine_jobs/:id/edit(.:format) my_engine/engine_jobs#edit
engine_job GET /engine_jobs/:id(.:format) my_engine/engine_jobs#show
PUT /engine_jobs/:id(.:format) my_engine/engine_jobs#update
DELETE /engine_jobs/:id(.:format) my_engine/engine_jobs#destroy

此外,在引擎中单击的任何链接都会将语言设置为 EN。一些网络搜索并没有真正说明这里可能发生的事情,因为我能找到的所有 i18n 示例都不涉及安装的引擎。

编辑:显示代码以设置默认语言环境
my_test_app/app/controllers/application_controller.rb:
class ApplicationController < ActionController::Base
protect_from_forgery
helper MyEngine::Engine.helpers

ActiveRecord::Base.verify_active_connections!

before_filter :set_locale

private
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
Rails.application.routes.default_url_options[:locale]= I18n.locale
logger.debug "My_Test_App: default_url_options is passed options: #{Rails.application.routes.default_url_options.inspect}\n"
# current_user.locale
# request.subdomain
# request.env["HTTP_ACCEPT_LANGUAGE"]
# request.remote_ip
end # set_locale

end # class ApplicationController

/编辑

EDIT2(Pierre 8 月 9 日 15:59 建议更改后的路线图):

一条申请路线 yield http://0.0.0.0:3000/en/users"locale"=>"en" . Helper 创建的引擎路由看起来像 http://0.0.0.0:3000/my_engine?locale=en/engine_jobs和 yield No route matches [GET] "/my_engine" .
my_engine_plugin        /my_engine                     MyEnginePlugin::Engine
users GET (/:locale)/users(.:format) users#index {:locale=>/en|fr/}
POST (/:locale)/users(.:format) users#create {:locale=>/en|fr/}
new_user GET (/:locale)/users/new(.:format) users#new {:locale=>/en|fr/}
edit_user GET (/:locale)/users/:id/edit(.:format) users#edit {:locale=>/en|fr/}
user GET (/:locale)/users/:id(.:format) users#show {:locale=>/en|fr/}
PUT (/:locale)/users/:id(.:format) users#update {:locale=>/en|fr/}
DELETE (/:locale)/users/:id(.:format) users#destroy {:locale=>/en|fr/}
sessions POST (/:locale)/sessions(.:format) sessions#create {:locale=>/en|fr/}
new_session GET (/:locale)/sessions/new(.:format) sessions#new {:locale=>/en|fr/}
session DELETE (/:locale)/sessions/:id(.:format) sessions#destroy {:locale=>/en|fr/}
signup (/:locale)/signup(.:format) users#new {:locale=>/en|fr/}
signin (/:locale)/signin(.:format) sessions#new {:locale=>/en|fr/}
signout DELETE (/:locale)/signout(.:format) sessions#destroy {:locale=>/en|fr/}
help (/:locale)/help(.:format) static_pages#help {:locale=>/en|fr/}
about (/:locale)/about(.:format) static_pages#about {:locale=>/en|fr/}
root /(:locale)(.:format) static_pages#home {:locale=>/en|fr/}

Routes for MyEnginePlugin::Engine:
engine_jobs GET (/:locale)/engine_jobs(.:format) my_engine_plugin/engine_jobs#index {:locale=>/en|fr/}
POST (/:locale)/engine_jobs(.:format) my_engine_plugin/engine_jobs#create {:locale=>/en|fr/}
new_engine_job GET (/:locale)/engine_jobs/new(.:format) my_engine_plugin/engine_jobs#new {:locale=>/en|fr/}
edit_engine_job GET (/:locale)/engine_jobs/:id/edit(.:format) my_engine_plugin/engine_jobs#edit {:locale=>/en|fr/}
engine_job GET (/:locale)/engine_jobs/:id(.:format) my_engine_plugin/engine_jobs#show {:locale=>/en|fr/}
PUT (/:locale)/engine_jobs/:id(.:format) my_engine_plugin/engine_jobs#update {:locale=>/en|fr/}
DELETE (/:locale)/engine_jobs/:id(.:format) my_engine_plugin/engine_jobs#destroy {:locale=>/en|fr/}

/EDIT2(Pierre 8 月 9 日 15:59 建议更改后的路线图)

因此,问题是我需要对路线或引擎进行哪些更改才能使其按预期工作?

提前感谢您的时间和建议!

最佳答案

我正在使用带有 I18n 的 Engine,它工作正常。我创建了一个虚拟的 Rails 应用程序来尝试您的场景。据我所知,更改 URL 内的语言环境可以很好地处理 Rails 应用程序中定义的路由:

我的路线:

Bar::Application.routes.draw do
root 'posts#index'

scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
resources :posts, only: :index
end
end

我可以通过以下方式更改 I18n 语言环境:
http://localhost:3000/fr/posts
http://localhost:3000/en/posts

我认为你的问题是当你想要去任何引擎的路线时,因为你没有设置 I18n 语言环境开关。见下图:
engine_jobs GET    /engine_jobs(.:format)

然后,当去 /engine_jobs即使您在 URL 中指定了语言环境,也会设置 I18n 默认语言环境( en ):
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
# ...
end

使用引擎路由时, params[:locale]nil
解决方案

将相同的逻辑添加到引擎的路由中:
config/routes.rb
MyTestApp::Application.routes.draw do

mount MyEngine::Engine, at: "/my_engine"

match '*path', to: redirect("/#{I18n.default_locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" and !req.path == "/#{I18n.default_locale}/"}
match '', to: redirect("/#{I18n.default_locale}/")
end
your_engine/config/routes.rb
MyEngine::Engine.routes.draw do
scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
resources :my_jobs
end
end
mount MyEngine::Engine, at: "/my_engine"只告诉 rails“加载”所有引擎路由。如果你需要添加约束、作用域、命名空间或其他任何东西,你应该使用通常的 rails 方式来做,但在你引擎的路由文件中。

最后,您需要更新您的 application_controller.rb (主应用程序 + 引擎)具有以下功能:
class ApplicationController < ActionController::Base
def url_options
{ locale: I18n.locale }
end

def set_locale
I18n.locale = params[:locale] || I18n.default_locale
Rails.application.routes.default_url_options[:locale]= I18n.locale
end
end

关于ruby-on-rails-3.2 - i18n 路由到已安装的引擎 - 忽略语言环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18003626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com