14

私は英語 (en)フランス語 (fr)に国際化を使用しています。私は en.yml を限定的な用途に使用しており、ほとんどの翻訳は fr.yml で書いています。

ロケールを frにするとすべて正常に動作しますが、enを使用すると、翻訳スパンが見つからないというエラーが表示されます。

たとえば、次のようなものがある場合

<%= text_field_tag( "search", params[:search], :placeholder=>t("Search"), :class=>"search_input") %>

enの出力は次のとおりです。

<input class="search_input" id="search" name="search" placeholder="<span class=" translation_missing"="" title="translation missing: en.Search">

私が望むのは、英語がデフォルトの言語であるため、英語の翻訳エラーをオフにすることですが、場合によっては en.yml を使用しました。

または、これが不可能な場合は、エラー メッセージ全体を削除する必要があります。

ありがとう

4

7 に答える 7

22

Rails 4.1 では、HTML の翻訳エラーの実装が変更されました。I18n ライブラリの代わりに、ビュー ヘルパー レイヤーで処理されるようになりました。つまり、「翻訳」ヘルパー メソッド (action_view/helpers/translation_helper.rb を参照)。

これを行うクリーンな方法は、ヘルパー メソッドをオーバーライドして、自分で例外を処理することです。

# app/helpers/i18n_helper.rb

module I18nHelper
  def translate(key, options={})
    super(key, options.merge(raise: true))
  rescue I18n::MissingTranslationData
    key
  end
  alias :t :translate
end
于 2014-04-17T16:12:14.810 に答える
15

一見したところ、Rails I18n ガイドは非常に優れているように見え、これをかなりうまくカバーしています (たとえば、カスタム例外ハンドラーを宣言する例)。

しかし、このチケットによると、4.0.2 以降のレールでは機能しません (ただし、最新のレール 4.1 リリースで修正する必要があります)。

どうやら動作が変更され、例外ハンドラが無視されるようになりました。

利用可能なオプション:

  • option を明示的に追加するraise: trueと、例外ハンドラが強制的に使用されます。例t('.missing', raise: true)
  • 最新の Rails 4.1 リリースでは、デフォルトの動作を例外の発生に戻すことができますconfig.action_view.raise_on_missing_translations = true(詳細については、マージ チケットを参照してください) 。
  • または、デフォルト オプションを明示的に追加します。t('.missing', default: 'use this instead')
于 2014-04-23T10:40:32.047 に答える
6

I18n ライブラリは、例外ハンドラを使用して、欠落している翻訳をどうするかを決定します。デフォルトでは、「翻訳がありません」というメッセージが返されます。

# i18n/exceptions.rb
class I18n::ExceptionHandler
  include Module.new {
    def call(exception, locale, key, options)
      if exception.is_a?(MissingTranslation)
        # Rails sets :rescue_format to :html in views
        # so that you will get span tag instead of just text message
        options[:rescue_format] == :html ? exception.html_message : exception.message
      elsif exception.is_a?(Exception)
        raise exception
      else
        throw :exception, exception
      end
    end
  }
end

例外ハンドラーを拡張して、翻訳が欠落しているときに翻訳キーを返すだけにすることができます。

# config/initializers/i18n.rb
module UseKeyForMissing
  def call(exception, locale, key, options)
    if exception.is_a?(I18n::MissingTranslation)
      key
    else
      super
    end
  end
end

I18n.exception_handler.extend UseKeyForMissing

次に、フランス語の翻訳のみがあると仮定します。

I18n.t("Search", :locale => :fr) #=> "Rechercher"
I18n.t("Search", :locale => :en) #=> "Search"
于 2012-10-17T10:12:58.807 に答える
1

以下のコードは、不足している英語の翻訳を削除するためのものです。I18n の MissingTranslation モジュールをイニシャライザに配置することでモンキー パッチを適用します。

DEFAULT_TEMPLATE_LANG = 'en'        
# Removing missing translation errors for english
module I18n
  class MissingTranslation
    def html_message
      if DEFAULT_TEMPLATE_LANG == keys[0].to_s
        keys[1].to_s
      else
        "missing translation: #{keys.join('.')}"
      end
    end
  end
end
于 2012-12-28T11:39:14.360 に答える
1

これを試して

<%= text_field_tag( "search", params[:search], :placeholder=>t(:search), :class=>"search_input") %>

そしてあなたのen.ymlファイルに書いてください

search: 'Search'
于 2012-10-16T11:52:27.463 に答える
-1

Rails 4.1 では、これを I18n 例外ハンドラーで動作させることができませんでした (いくつかのバグがあります。どうやら、nathanvda の回答を参照してください。
最終的にmessage、これを追加して関数を上書きしました。config/initializers/i18n.rb

module I18n
  class MissingTranslation
    module Base
      def message
        keys[1..-1].join('.')
      end
    end
  end
end
于 2014-04-23T12:28:44.137 に答える