Существует ли существующий перевод I18N для логических значений? - PullRequest
23 голосов
/ 08 марта 2011

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

fr.yml:

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

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

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

erb:

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

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

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

Ответы [ 7 ]

37 голосов
/ 08 марта 2011

Прочитав это , я воодушевился и выяснил это решение:

fr.yml

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

Еврорадио:

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

Обновление

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

en.yml

en:
  "true": "yes"
  "false": "no"
10 голосов
/ 24 июля 2012

Точно так же, как говорит Забба, работает нормально, но если вы пытаетесь перевести true-false в yes-no, заключите в кавычки обе стороны, иначе вы снова получите true в True (ClassClass).

en:
  "true": "yes"
  "false": "no"
1 голос
/ 10 марта 2012
# 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:)

1 голос
/ 08 марта 2011

Вы можете попробовать переопределить метод 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
0 голосов
/ 29 марта 2016

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

Мне просто нравится этот взлом логического множественного числа

# 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"

Ты даженужны кавычки на самом деле ^^.

0 голосов
/ 11 июня 2013

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

# 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) %>
0 голосов
/ 23 сентября 2011

Помните, что метод translate был псевдонимом в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...