【问题标题】:Rails Internationalization: Setting the Locale from the Domain NameRails 国际化:从域名设置语言环境
【发布时间】:2013-12-02 13:55:16
【问题描述】:

我正在尝试在我的 rails 应用程序上实现国际化。这是我的应用程序控制器的一部分

before_action :set_locale

def set_locale
  I18n.locale = extract_locale_from_tld || I18n.default_locale
end

def extract_locale_from_tld
  parsed_locale = request.host.split('.').last
  I18n.available_locales.include?(parsed_locale.to_sym) ? parsed_locale  : nil
end

它似乎不起作用,我只能从 url 参数设置语言环境,让我在我不想使用的路线中使用 scope "(:locale)", locale: /en|se/ do

从 Rails 指南中,他们指出切换菜单应该这样实现。

link_to("Deutsch", "#{APP_CONFIG[:deutsch_website_url]}#{request.env['REQUEST_URI']}")

你如何实现这个? 我当前的切换菜单是这样的。

<% if I18n.locale == I18n.default_locale %>
   <li><%= link_to image_tag("eng.png", :alt => "England", :class =>"round"), :locale=>'en' %>
   <li><h5><%= link_to_unless I18n.locale == :se, "Swedish", "#{'http://www.natkurser.se'}" %></h5>  
<% else %>
   <li><%= link_to image_tag("swe.png", :alt => "Sweden", :class =>"round"), :locale=>'se' %>
   <li><h5><%= link_to_unless I18n.locale == :en, "English", "#{'http://gettheskill.com'}" %></h5>  
<%end%>

我已将 127.0.0.1 gettheskill.com 和 127.0.0.1 natkuser.se 添加到 /etc/hosts,但它仍然无法用于开发。我要修改哪些文件才能使其在生产中运行?我在想nginx配置文件。最终,路线应该如何出现。这是 Rails 国际化文档中似乎遗漏的主要内容。详细解答将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby nginx internationalization


    【解决方案1】:

    你的问题不是很结构化,我会尽量给出一些提示。

    如果您想查看语言环境和域的工作示例,请查看the onruby project。这是一个多租户应用程序,每个租户都可以配置自己的域和默认语言环境。

    这是它的实现方式:

    网站使用 cookie 来跟踪当前选择的语言环境。

    如果没有设置 cookie,它会使用域名来解析它。要在开发中测试它,您必须使用 /etc/hosts 并在其中添加域,以便它们可以在本地解析。在您的情况下,这将是 gettheskill.com:3000 来访问您的应用程序。

    我通常使用稍微不同的域名,或者附加一个子域或一个不同的 tld,这样我仍然可以通过 Internet 访问这些域而无需编辑 /etc/hosts

    语言切换只需将参数locale=XY 附加到链接即可。所以params[:locale] 总是优先并切换选定的语言环境并为 cookie 设置一个新值。

    我希望这是足够的信息让它为你工作。

    不,在 rails 或 /etc/hosts 文件之外不需要配置任何内容。

    【讨论】:

    • 感谢您的帖子。事情是这样的,我在切换语言环境时遇到了问题。该站点的默认语言环境是英语,当我单击切换菜单上的链接时,我需要将其更改为瑞典语。现在它在路由上与 scope (:locale) /en|se 一起使用,但是在我删除它之后,它不是。我不得不删除范围,因为我想从域名中实现 i18n。我希望你明白我的意思。
    【解决方案2】:

    我已按照 rails 指南并相应地设置了 i18n。我无法理解你的问题。我唯一的区别是语言环境的提取。而不是最后一个,我使用 request.subdomains.first 。

    def extract_locale_from_subdomain
      parsed_locale = request.subdomains.first
      I18n.available_locales.include?(parsed_locale.to_sym) ? parsed_locale : nil
    end
    

    您是否按照 Rails 指南中的说明设置了加载路径。

    # in config/initializers/locale.rb
    
    # tell the I18n library where to find your translations
    I18n.load_path += Dir[Rails.root.join('lib', 'locale', '*.{rb,yml}')]
    
    # set default locale to something other than :en
    I18n.default_locale = :en
    

    并检查 I18n.available_locales 返回什么,nil 或 locales。而且您使用的切换菜单似乎很好。它也可以这样工作。

    如果您能更具体地解释您的问题,也许我可以提供帮助。 谢谢。

    编辑:

    这足以让您的视图拥有切换语言链接。

    <% if I18n.locale == I18n.default_locale %>
       <li><%= link_to image_tag("swe.png", :alt => "Sweden", :class =>"round"), "http://www.natkurser.se" %>  %>
       <li><h5><%= link_to_unless I18n.locale == :se, "Swedish", "#{'http://www.natkurser.se'}" %></h5>  
    <% else %>
       <li><%= link_to image_tag("eng.png", :alt => "England", :class =>"round"), "http://gettheskill.com" %>
       <li><h5><%= link_to_unless I18n.locale == :en, "English", "#{'http://gettheskill.com'}" %></h5>  
    <%end%>
    

    【讨论】:

    • 我已经实现了你所说的一切。问题是切换菜单似乎不起作用。默认语言环境是英语,所以当我点击切换链接时,我需要将站点更改为瑞典语。
    • 您是否尝试删除 image_tag 并检查它是否仅适用于 link_to_unless 部分?
    • "England", :class=>"round"), "#{'natkurser.se'}" %>
    • 为你的图片标签试试这个。将链接替换为相关信息 "Sweden", :class=>"round"), "#{'natkurser.se'}" %>
    • 非常感谢。它现在正在工作。但是在你走之前有一个简单的问题,生产中的两个 url 的配置将如何?或者说我应该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多