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

Rails I18n, проверьте, существует ли перевод?

Работа с приложением rails 3, где я хочу проверить, существует ли перевод, прежде чем вывести его, а если он не существует, вернитесь к некоторому статическому тексту. Я мог бы сделать что-то вроде:

if I18n.t("some_translation.key").to_s.index("translation missing")

Но я чувствую, что должен быть лучший способ. Что, если рельсы в будущем изменят "перевод отсутствует" на "перевод не найден". Или что, если по какой-то странной причине текст содержит "перевод отсутствует". Любые идеи?

4b9b3361

Ответ 1

Основываясь на том, что вы описали, это должно работать:

I18n.t("some_translation.key", :default => "fallback text")

Подробнее см. .

Ответ 2

Вы также можете использовать

I18n.exists?(key, locale)
I18n.exists?('do_i_exist', :en)

Ответ 3

:default не всегда является решением. Используйте это для более сложных случаев:

хелперы/application.rb:

def i18n_set? key
  I18n.t key, :raise => true rescue false
end

любой шаблон ERB:

<% if i18n_set? "home.#{name}.quote" %>
  <div class="quote">
    <blockquote><%= t "home.#{name}.quote" %></blockquote>
    <cite><%= t "home.#{name}.cite" %></cite>
  </div>
<% end %>

Ответ 4

Как насчет этого?

I18n.t('some_translation.key', :default => '').empty?

Я просто думаю, что он чувствует себя лучше, больше похоже, что нет перевода

Предостережение: не работает, если вы намеренно имеете пустую строку в качестве значения перевода.

Ответ 5

use: default param:

I18n.t("some_translation.key", :default => 'some text')

Ответ 6

иногда вы хотите сделать больше вещей при переводах

v = "doesnt_exist"
begin
  puts I18n.t "langs.#{v}", raise: true
rescue
  ...
  puts "Nooo #{v} has no Translation!"
end

Ответ 7

Это трюк, но я думаю, что иногда это может быть полезно...

Предположим, что у вас есть это в вашем файле i18n:

en:
  key:
    special_value: "Special value"
    default_value: "Default value"

Вы можете сделать это:

if I18n.t('key').keys.include?(:special_value)
  I18n.t('key.special_value')
else
  I18n.t('key.default_value')
end
# => "Special value"

if I18n.t('key').keys.include?(:unknown_value)
  I18n.t('key.special_value')
else
  I18n.t('key.default_value')
end
# => "Default value"

Примечание. Это работает, только если вы тестируете что-либо, кроме корневого ключа, поскольку вы смотрите на родителя.

В самом деле, что интересно, что вы можете получить при запросе родительского ключа...

I18n.t('key')
# => {:special_value=>"Special value", :default_value=>"Default value"}

Ответ 8

Рельсы 4

Я повторял некоторые URL-адреса членов жюри. Максимальное количество URL-адресов было 2, а default_lang - "de". Вот ямль, который я использовал

de:
 jury:
  urls:
   url0: http://www.example.com
   name0: example.com
   url1:
   name1:

en:
 jury:
  urls:
   url0: 
   name0: 
   url1:
   name1:

Вот как я проверил, был ли указан URL-адрес, и если он не существует для другого языка, он будет возвращаться к параметру "de" I18n default_lang. Я использовал ответ @albandiguer, который отлично работал.

Надеюсь, это поможет кому-то:

    <% 2.times do |j| %>
        <% if I18n.exists?("jury.urls.url#{j}", "de") &&
           I18n.exists?("jury.urls.name#{j}", "de") %>
          <%= "<br/>".html_safe  if j == 1%>
          <a href="<%= t("jury.urls.url#{j}") %>" target="_blank">
            <%= t("jury.urls.name#{j}") %>
          </a>
        <% end %>
     <% end %>

Ответ 9

В некоторых версиях назад есть более простой способ i18следующая документация> API> t:

Вы можете указать либо один ключ в виде строки, либо несколько ключей в виде массива строки. Первый, который разрешит, будет возвращен.

Пример:

i18next.t( ['unknown.key', 'my.key' ] );//It will return value for 'my.key'

Также вы можете использовать контексты. t, если не нашли ключ в контексте возвращает значение по умолчанию.