【发布时间】:2017-05-17 08:48:23
【问题描述】:
我有一个 Elixir / Phoenix 应用程序,它的反应因域(又名租户)而异。
租户具有特定的语言环境,例如“fr_FR”、“en_US”等。
我想根据当前语言环境翻译路由器的 URI:
# EN
get "/classifieds/new", ClassifiedController, :new
# FR
get "/annonces/ajout", ClassifiedController, :new
到目前为止,我认为可以做类似的事情(伪代码):
if locale() == :fr do
scope "/", Awesome.App, as: :app do
pipe_through :browser # Use the default browser stack
get "/annonces/ajout", ClassifiedController, :new
end
else
scope "/", Awesome.App, as: :app do
pipe_through :browser # Use the default browser stack
get "/classifieds/new", ClassifiedController, :new
end
end
它不起作用,因为路由器是在服务器启动期间编译的,所以你没有当前连接的上下文(语言环境、域、主机等)。
到目前为止,我的解决方案(可行)是创建两个具有两个别名的作用域:
scope "/", Awesome.App, as: :fr_app do
pipe_through :browser # Use the default browser stack
get "/annonces/ajout", ClassifiedController, :new
end
scope "/", Awesome.App, as: :app do
pipe_through :browser # Use the default browser stack
get "/classifieds/new", ClassifiedController, :new
end
和一个关联的助手:
localized_path(conn, path, action)
如果当前语言环境是“fr ”(例如)。如果当前语言环境不存在路径,我会回退到默认语言环境“en”)。
效果很好,但我发现了一些痛点:
每次使用“something_foo_path()”助手都必须替换为这个新的“localized_path()”
-
该应用程序将接受每个本地化段(fr、en、it 等),这并不是我真正想要的(我只想让 fr 段在租户“fr”上工作
我应该能够直接在路由器中获取当前的语言环境/连接信息(功能/错误修复?)并避免这样的黑客攻击。
【问题讨论】:
-
"该应用程序将接受每个本地化段(fr、en、it 等),这并不是我真正想要的(我只想让 fr 段在租户 "fr" 上工作" - 我可以创建一个插件来重定向/显示 404 错误,具体取决于当前的语言环境。
-
如何将路由的所有变体路由到同一个控制器,但有一个检查语言和 URL 的插件,如果 URL 中的语言发送 404(或重定向到正确的)和域不匹配?
-
因为 app_classified_path(conn, :new) 将根据在路由器中找到的第一个关联段而不是当前语言环境生成 URL。然后是的,我可以在一个插件中重定向到正确的路线,但出于 SEO 的目的,我希望根据当前的语言环境生成链接。
标签: internationalization elixir phoenix-framework