Есть ли существующий перевод 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, как это?
Ответы
Ответ 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"
Вам даже не нужны кавычки ^ ^.