rails i18n - translating text with links inside

后端 未结 9 819
名媛妹妹
名媛妹妹 2020-11-30 21:05

I\'d like to i18n a text that looks like this:

Already signed up? Log in!

Note that there is a link on the text. On this example

9条回答
  •  孤街浪徒
    2020-11-30 21:40

    Thank you very much, holli, for sharing this approach. It works like a charm for me. Would vote you up if I could, but this is my first post so I'm lacking the proper reputation ... As an additional piece to the puzzle: The problem I realized with your approach is that it still won't work from inside the controller. I did some research and combined your approach with the one from Glenn on rubypond.

    Here is what I came up with:

    View helper, e.g. application_helper.rb

      def render_flash_messages
        messages = flash.collect do |key, value|
          content_tag(:div, flash_message_with_link(key, value), :class => "flash #{key}") unless key.to_s =~ /_link$/i
        end
        messages.join.html_safe
      end
    
      def flash_message_with_link(key, value)
        link = flash["#{key}_link".to_sym]
        link.nil? ? value : string_with_link(value, link).html_safe
      end
    
      # Converts
      # "string with __link__ in the middle." to
      # "string with #{link_to('link', link_url, link_options)} in the middle."
      # --> see http://stackoverflow.com/questions/2543936/rails-i18n-translating-text-with-links-inside (holli)
      def string_with_link(str, link_url, link_options = {})
        match = str.match(/__([^_]{2,30})__/)
        if !match.blank?
          $` + link_to($1, link_url, link_options) + $'
        else
          raise "string_with_link: No place for __link__ given in #{str}" if Rails.env.test?
          nil
        end
      end
    

    In the controller:

    flash.now[:alert] = t("path.to.translation")
    flash.now[:alert_link] = here_comes_the_link_path # or _url
    

    In the locale.yml:

    path:
      to:
        translation: "string with __link__ in the middle"
    

    In the view:

    <%= render_flash_messages %>
    

    Hope this post earns me the reputation to vote you up, holli :) Any feedback is welcome.

提交回复
热议问题