Programing

Rails I18n, 번역이 있는지 확인 하시겠습니까?

crosscheck 2020. 11. 29. 09:54
반응형

Rails I18n, 번역이 있는지 확인 하시겠습니까?


번역을 출력하기 전에 번역이 존재하는지 확인하고, 존재하지 않는 경우 일부 정적 텍스트로 돌아가는 rails 3 앱에서 작업합니다. 다음과 같이 할 수 있습니다.

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

하지만 그보다 더 나은 방법이 있어야한다고 생각합니다. 앞으로 rails가 "번역 누락"을 "번역을 찾을 수 없음"으로 변경하면 어떻게 될까요? 또는 이상한 이유로 텍스트에 "번역 누락"이 포함되어 있으면 어떻게됩니까? 어떤 아이디어?


설명한 내용에 따라 다음과 같이 작동합니다.

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

자세한 내용은 설명서 를 참조하십시오.


당신은 또한 사용할 수 있습니다

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

:default항상 해결책은 아닙니다. 고급 사례에 사용하십시오.

helpers / 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 %>

이건 어때?

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

그냥 기분이 나아진 것 같아 번역이없는 것 같아

주의 사항 : 의도적으로 번역 값으로 빈 문자열이있는 경우 작동하지 않습니다.


사용 : 기본 매개 변수 :

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

때로는 번역에 더 많은 일을하고 싶을 때 실패합니다

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

이것은 속임수이지만 가끔 유용 할 것 같습니다.

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

레일스 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이 있는지 확인하고 다른 언어에 대해 존재하지 않는 경우 I18n default_lang "de"로 대체되는 방법은 다음과 같습니다. 나는 훌륭하게 일한 @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 %>

Some versions ago there is a easier way i18next documentation > API > t:

You can specify either one key as a String or multiple keys as an Array of String. The first one that resolves will be returned.

Example:

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

Also you can use Contexts. t if not found a key into a context returns the default value.

참고URL : https://stackoverflow.com/questions/12353416/rails-i18n-check-if-translation-exists

반응형