Подтвердить что ты не робот

Есть ли существующий перевод I18N для булевых языков?

Мне нужно отобразить "Да" или "Нет" на разных языках, исходя из того, является ли выражение истинным или ложным. В настоящее время я делаю это так:

fr.yml:

fr:
  "yes": Oui
  "no": Non

вспомогательный метод:

def t_boolean(expression)
  (expression) ? t("yes") : t("no")
end

Еврорадио:

Valid: <%= t_boolean(something.is_valid?) %>

Есть ли лучший способ сделать это?

У Rails уже есть переводы для true/false, как это?

4b9b3361

Ответ 1

После прочтения этого я получил вдохновение и понял это решение:

fr.yml

fr:
  "true": Oui
  "false": Non

Еврорадио:

Valid: <%= t something.is_valid?.to_s %>

Обновление

Для английского языка, если вы хотите использовать значения yes и no в качестве значений, обязательно укажите их:

en.yml

en:
  "true": "yes"
  "false": "no"

Ответ 2

Как говорит Забба, все прекрасно работает, но если вы пытаетесь перевести true-false в yes-no, укажите обе стороны, иначе вы снова вернетесь в true (TrueClass).

en:
  "true": "yes"
  "false": "no"

Ответ 3

Вы можете попробовать переопределить метод I18n по умолчанию translate, делегируя метод по умолчанию для фактического перевода. Используйте этот код в инициализаторе:

module I18n
  class << self
    alias :__translate :translate #  move the current self.translate() to self.__translate()
    def translate(key, options = {})
      if key.class == TrueClass || key.class == FalseClass
        return key ? self.__translate("yes", options) : self.__translate("no", options)
      else
        return self.__translate(key, options)
      end
    end
  end
end

Ответ 4

# Inside initializer
module I18n
  class << self
    alias :__translate :translate #  move the current self.translate() to self.__translate()
     alias :t :translate
     def translate(key, options = {})
       if key.class == TrueClass || key.class == FalseClass
         return key ? self.__translate("boolean.true", options) : self.__translate("boolean.false", options)
       else
         return self.__translate(key, options)
       end
     end
  end
end

# Inside locale
boolean:
  :true: 'Yes'
  :false: 'No'

# Calling translate
I18n.translate(is_this_my_boolean_column)

Работа с Rails 3.2.2:)

Ответ 5

Помните, что метод перевести был псевдонимом в I18n.

Когда вы используете метод, вы на самом деле создаете его новую копию, поэтому только переопределение метода translate не будет работать, когда вызовы метода t. Чтобы сделать вышеприведенный код работать, вы, например, можете использовать метод t.

module I18n
  class << self
    alias :__translate :translate #  move the current self.translate() to self.__translate()
    alias :t : translate # move the current self.t() to self.translate()
    def translate(key, options = {})
      if key.class == TrueClass || key.class == FalseClass
        return key ? self.__translate("yes", options) : self.__translate("no", options)
      else
        return self.__translate(key, options)
      end
    end
  end
end

Ответ 6

Другое решение, которое я предпочитаю:

# Create a helper
def yes_no(bool_value)
  if bool_value
    t(:yes_word)
  else
    t(:no_word)
  end
end

# Add the translations, important that you use " around yes or no.
yes_word: "No"
no_word: "Yes"

# In your views, in my case in slim:
span= yes_no myvalue
# Or ERB
<%= yes_no(myvalue) %>

Ответ 7

Для любого булевского перевода

Мне просто нравится, что boolean pluralization hack

# some_view.html.erb
t(:are_you_ok?, count: (user.is_ok? ? 0 : 1)  ).html_safe

Переводы

# locales/en.yml
en:
  are_you_ok?:
    zero: "You are <strong>NOT</strong> ok ! Do something !"
    one: "You are doing fine"

Вам даже не нужны кавычки ^ ^.