রেল i18n - ভিতরে লিঙ্কগুলির সাথে পাঠ্য অনুবাদ করা


103

আমি দেখতে এমন একটি পাঠ্য i18n করতে চাই:

ইতিমধ্যে সাইন আপ করেছেন? প্রবেশ করুন!

নোট করুন যে লেখায় একটি লিঙ্ক রয়েছে। এই উদাহরণে এটি গুগলকে নির্দেশ করে - বাস্তবে এটি আমার অ্যাপ্লিকেশনগুলিকে নির্দেশ করবে log_in_path

আমি এটি করার দুটি উপায় খুঁজে পেয়েছি তবে তাদের কোনওটিই "সঠিক" দেখাচ্ছে না।

আমি জানি প্রথম উপায়টিতে এটি থাকা আমার en.yml:

log_in_message: "Already signed up? <a href='{{url}}'>Log in!</a>"

এবং আমার দৃষ্টিতে:

<p> <%= t('log_in_message', :url => login_path) %> </p>

এটি কাজ করে , তবে <a href=...</a>অংশটি থাকা en.ymlআমার পক্ষে খুব পরিষ্কার দেখাচ্ছে না।

অন্যান্য বিকল্প আমি জানি ব্যবহার করছে স্থানীয় মতামত - login.en.html.erbএবং login.es.html.erb

এটিও ঠিক মনে হয় না কারণ কেবলমাত্র পৃথক রেখাটি পূর্বোক্ত একটি হতে পারে; বাকি দর্শন (~ 30 লাইন) সমস্ত দর্শনগুলির জন্য পুনরাবৃত্তি হবে। এটি খুব DRY হবে না।

আমি অনুমান করি যে আমি "স্থানীয়করণের পার্টিয়াল" ব্যবহার করতে পারি তবে এটি খুব জটিল মনে হচ্ছে; আমি মনে করি আমি এত ক্ষুদ্র ভিউ ফাইল থাকার প্রথম বিকল্পটি পছন্দ করি।

সুতরাং আমার প্রশ্নটি: এটি বাস্তবায়নের জন্য কোনও "যথাযথ" উপায় আছে কি?



@ বুগি ফুফি আপনার প্রশ্নের সদৃশ হওয়া উচিত নয়। আর সিমনের উত্তর আপনি পেয়েছেন তার চেয়ে ভাল।
কিকিতো

উত্তর:


180

en.yml

log_in_message_html: "This is a text, with a %{href} inside."
log_in_href: "link"

login.html.erb

<p> <%= t("log_in_message_html", href: link_to(t("log_in_href"), login_path)) %> </p>

66
রেল 3 এ এর ​​বাক্য %{href}বাক্যটি ওয়াইএএমএল অনুবাদ স্ট্রিংয়ে পরিবর্তিত হয়েছে । এছাড়াও, আউটপুট স্বয়ংক্রিয়ভাবে পালিয়ে যাওয়ার কারণে, আপনাকে স্পষ্টভাবে rawবা নির্দিষ্টভাবে নির্দিষ্ট করতে হবে .html_safe, বা আপনার অনুবাদ কীটি যথাযথভাবে প্রয়োগ করতে হবে _html, login_message_htmlএবং পলায়ন স্বয়ংক্রিয়ভাবে এড়ানো হবে।
কোরিউড

15
যদি এটি সুস্পষ্ট না হয় তবে (এবং সম্পাদনা লগটি পরীক্ষা করতে খুব অলসদের জন্যও) .. উপরের উত্তরটি ইতিমধ্যে @ কোরিওয়ার্ডের মন্তব্য অন্তর্ভুক্ত করার জন্য সম্পাদনা করা হয়েছিল।
Abbood

4
লিঙ্কের পাঠ্য বিভাজনকারী অনুবাদগুলিতে যদি আপনার কাছে একটি শব্দ ছাড়াও আরও কিছু থাকে তবে অদ্ভুত অনুবাদ পাওয়া যাবে। উদাহরণস্বরূপ "আপনার কাছে কিনতে পারেন আমাদের কাছে একটি আশ্চর্যজনক <a href='x'> অফার করা জিনিস রয়েছে </a> যা আপনি কিনতে পারেন You একটি আশ্চর্যজনক <a href='x'> আভা আইটেম </a> যা আপনি অন্য ভাষায় "কিনতে পারেন একটি সমাধান যা তাদের পৃথক্ বিভক্ত না খুঁজে বের করতে হবে
trcarden

4
@ আর্চোনিক এটি সত্য নয়। t('string')অনুরূপ t("string")। তারা একই জিনিস।
মেগার

4
লিঙ্কগুলি ছড়িয়ে দেওয়ার জটিলতায় রেলগুলিকে ভালবাসে love এর মতো দেখতে হবেt('some.key', link: link_to()).html_safe
এডি

11

স্থানীয় এবং জিম ফাইলটিতে পাঠ্য এবং লিঙ্কটি পৃথক করা কিছু সময়ের জন্য কাজ করে তবে লম্বা পাঠ্যের সাথে লিঙ্কটি পৃথক অনুবাদ-আইটেমে থাকায় অনুবাদ করা ও বজায় রাখা শক্ত হয় (সিমোনসের জবাব হিসাবে)। যদি আপনি লিঙ্কগুলির সাথে অনেকগুলি স্ট্রিং / অনুবাদ শুরু করে থাকেন তবে আপনি এটি আরও কিছুটা শুকিয়ে নিতে পারেন।

আমি আমার অ্যাপ্লিকেশন_হেল্পার.আরবিতে একজন সহায়ক তৈরি করেছি:

# Converts
# "string with __link__ in the middle." to
# "string with #{link_to('link', link_url, link_options)} in the middle."
def string_with_link(str, link_url, link_options = {})
  match = str.match(/__([^_]{2,30})__/)
  if !match.blank?
    raw($` + 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

আমার এন.আইএমএলে:

log_in_message: "Already signed up? __Log in!__"

এবং আমার মতামত:

<p><%= string_with_link(t('.log_in_message'), login_path) %></p>

এইভাবে বার্তাগুলির অনুবাদ করা আরও সহজতর পাশাপাশি লিঙ্কের পাঠ্যটি স্পষ্টভাবে লোকাল.আইএমএল-ফাইলে সংজ্ঞায়িত করা হয়েছে।


6
দুর্দান্ত সমাধান। আমি এটিকে একটি মণি হিসাবে রেখেছি, যা আপনাকে জিনিসগুলির লিঙ্কটি সংজ্ঞায়িত করতে দেয় This is a %{link:link to Google}। এটি আপনাকে একক স্ট্রিংয়ে একাধিক লিঙ্ক রাখতে দেয়, এক্সএসএসের যত্ন নেয় এবং নেস্টেড অনুবাদগুলিকে অনুমতি দেয়। একটি সময়ে কটাক্ষপাত আছে github.com/iGEL/i18n_link
Igel

আমি এটি "str = t str" দিয়ে করেছি তাই আমি ফাংশনটিতে অনুবাদ কীটি দিই। আরো আরামদায়ক!
টিম ক্রেটসচেমার

4
পারলে আমি আরও বেশি @ ইগেলকে উত্সাহিত করতাম। প্রকল্পটি github.com/iGEL/it সরানো হয়েছে এবং আপনি যদি এটির জন্য flash3+ বার্তাগুলির জন্য একটি নিয়ামক হিসাবে ব্যবহার করতে চান তবে এটি এটি করুনview_context.it(key, ...)
ক্রিস বেক

এটি একটি নিয়ামক হিসাবে ব্যবহার করার জন্য এখানে একটি আরও ভাল উদাহরণ - github.com/iGEL/it/issues/10
ক্রিস বেক


5

ইন en.yml

registration:
    terms:
      text: "I do agree with the terms and conditions: %{gtc} / %{stc}"
      gtc: "GTC"
      stc: "STC"

ইন de.yml

registration:
    terms:
      text: "Ich stimme den Geschäfts- und Nutzungsbedingungen zu: %{gtc} / %{stc}"
      gtc: "AGB"
      stc: "ANB"

মধ্যে new.html.erb [অধিকৃত]

<%= t(
   'registration.terms.text',
    gtc:  link_to(t('registration.terms.gtc'),  terms_and_conditions_home_index_url + "?tab=gtc"),
    stc: link_to(t('registration.terms.stc'), terms_and_conditions_home_index_url + "?tab=stc")
 ).html_safe %>

3

হোলি, এই পদ্ধতির ভাগ করে নেওয়ার জন্য আপনাকে অনেক ধন্যবাদ। এটি আমার জন্য কবজির মতো কাজ করে। আমি পারলে আপনাকে ভোট দিতাম, তবে এটি আমার প্রথম পোস্ট তাই আমার যথাযথ সুনামের অভাব রয়েছে ... ধাঁধাটির অতিরিক্ত অংশ হিসাবে: আপনার পদ্ধতির সাথে আমি যে সমস্যাটি বুঝতে পেরেছি তা হ'ল এটি এখনও ভিতরে থেকে কাজ করবে না that নিয়ামক। আমি কিছু গবেষণা করেছি এবং আপনার পদ্ধতির সাথে গ্লেন থেকে রুবিপন্ডের সাথে একত্রিত করেছি

আমি এখানে যা এলাম:

সহায়ক দেখুন, যেমন প্রয়োগ_হেল্পার.আরবি

  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

নিয়ামকটিতে:

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

লোকালে.আইএমএল:

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

দেখুন মধ্যে:

<%= render_flash_messages %>

আশা করি এই পোস্টটি আপনাকে ভোট দেওয়ার জন্য খ্যাতি অর্জন করেছে, হোলি :) কোনও প্রতিক্রিয়া স্বাগত।


2

আমাদের নিম্নলিখিত ছিল:

module I18nHelpers
  def translate key, options={}, &block
    s = super key, options  # Default translation
    if block_given?
      String.new(ERB::Util.html_escape(s)).gsub(/%\|([^\|]*)\|/){
        capture($1, &block)  # Pass in what's between the markers
      }.html_safe
    else
      s
    end
  end
  alias :t :translate
end

বা আরও স্পষ্টভাবে:

module I18nHelpers

  # Allows an I18n to include the special %|something| marker.
  # "something" will then be passed in to the given block, which
  # can generate whatever HTML is needed.
  #
  # Normal and _html keys are supported.
  #
  # Multiples are ok
  #
  #     mykey:  "Click %|here| and %|there|"
  #
  # Nesting should work too.
  #
  def translate key, options={}, &block

    s = super key, options  # Default translation

    if block_given?

      # Escape if not already raw HTML (html_escape won't escape if already html_safe)
      s = ERB::Util.html_escape(s)

      # ActiveSupport::SafeBuffer#gsub broken, so convert to String.
      # See https://github.com/rails/rails/issues/1555
      s = String.new(s)

      # Find the %|| pattern to substitute, then replace it with the block capture
      s = s.gsub /%\|([^\|]*)\|/ do
        capture($1, &block)  # Pass in what's between the markers
      end

      # Mark as html_safe going out
      s = s.html_safe
    end

    s
  end
  alias :t :translate


end

তারপরে কেবল অ্যাপ্লিকেশনকন্ট্রোলআরআরবিতে

class ApplicationController < ActionController::Base
  helper I18nHelpers

en.ymlফাইলের মতো একটি কী দেওয়া হয়েছে

mykey: "Click %|here|!"

ERB হিসাবে হিসাবে ব্যবহার করা যেতে পারে

<%= t '.mykey' do |text| %>
  <%= link_to text, 'http://foo.com' %>
<% end %>

উত্পন্ন করা উচিত

Click <a href="http://foo.com">here</a>!

1

আমি ওয়াইএএমএল ফাইলগুলি থেকে উদাহরণস্বরূপ ফ্ল্যাশ বার্তাগুলির লিঙ্ক যুক্ত করার চেয়ে কিছুটা নমনীয়তা চেয়েছিলাম (উদাহরণস্বরূপ লগ ইন করা ইউজারনেম ইত্যাদি) সুতরাং পরিবর্তে আমি স্ট্রিংয়ে ইআরবি স্বরলিপিটি ব্যবহার করতে চেয়েছিলাম।

আমি যেহেতু ব্যবহার করছি bootstrap_flashতাই প্রদর্শিত হওয়ার আগে ERB স্ট্রিংগুলি ডিকোড করার জন্য আমি সহায়ক হিসাবে সংশোধন করেছি:

require 'erb'

module BootstrapFlashHelper
  ALERT_TYPES = [:error, :info, :success, :warning] unless const_defined?(:ALERT_TYPES)

  def bootstrap_flash
    flash_messages = []
    flash.each do |type, message|
      # Skip empty messages, e.g. for devise messages set to nothing in a locale file.
      next if message.blank?

      type = type.to_sym
      type = :success if type == :notice
      type = :error   if type == :alert
      next unless ALERT_TYPES.include?(type)

      Array(message).each do |msg|
        begin
          msg = ERB.new(msg).result(binding) if msg
        rescue Exception=>e
          puts e.message
          puts e.backtrace
        end
        text = content_tag(:div,
                           content_tag(:button, raw("&times;"), :class => "close", "data-dismiss" => "alert") +
                           msg.html_safe, :class => "alert fade in alert-#{type}")
        flash_messages << text if msg
      end
    end
    flash_messages.join("\n").html_safe
  end
end

তারপরে নিম্নলিখিতগুলির মতো স্ট্রিং ব্যবহার করা সম্ভব (শয়তান ব্যবহার করে):

signed_in: "Welcome back <%= current_user.first_name %>! <%= link_to \"Click here\", account_path %> for your account."

এটি সমস্ত পরিস্থিতিতে কার্যকর নাও হতে পারে এবং একটি যুক্তি থাকতে পারে যে কোড এবং স্ট্রিং সংজ্ঞাগুলি মিশ্রিত করা উচিত নয় (বিশেষত একটি DRY দৃষ্টিকোণ থেকে), তবে এটি আমার পক্ষে ভাল কাজ করে বলে মনে হচ্ছে। কোডটি অন্যান্য অনেক পরিস্থিতিতে মানিয়ে নিতে হবে, গুরুত্বপূর্ণ বিটগুলি নিম্নলিখিত:

require 'erb'

....

        begin
          msg = ERB.new(msg).result(binding) if msg
        rescue Exception=>e
          puts e.message
          puts e.backtrace
        end

-2

আমি মনে করি এটি করার একটি সহজ উপায় হ'ল সহজভাবে করা:

<%= link_to some_path do %>
<%= t '.some_locale_key' %>
<% end %>

-4

কেন প্রথম উপায়ে ব্যবহার করবেন না, তবে এটির মতো বিভক্ত

log_in_message: Already signed up?
log_in_link_text: Log in!

এবং তারপর

<p> <%= t('log_in_message') %> <%= link_to t('log_in_link_text'), login_path %> </p>

দুঃখিত, এই সমাধান কাজ করবে না। মনে রাখবেন যে আমি পাঠ্যটি অন্য ভাষায় অনুবাদ করতে চেয়েছিলাম। এর অর্থ হল যে কোনও কোনও ক্ষেত্রে "লিঙ্ক" শুরুতে বা পাঠ্যের মাঝখানে থাকতে পারে। আপনার সমাধান লিঙ্কটি শেষ হতে বাধ্য করে (ভাল অনুবাদ করে না)।
কিকিতো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.