Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Rails I18n:3가지 간단한 팁과 1가지 미친 남용

Rails의 i18n 라이브러리는 보기보다 강력합니다. 번역에만 사용할 필요는 없습니다. i18n 라이브러리는 표시하는 텍스트를 표시하는 위치에서 분리하려는 모든 위치에서 유용합니다.

Avvo에 있는 동안 우리는 i18n을 사용하여 정말 멋진 일을 했습니다. 저는 우리가 알게 된 몇 가지 유용한 유용한 정보를 공유하고, 라이브러리를 미친 듯이 남용하여 결국 우리에게 매우 효과적이었습니다.

자동 HTML 이스케이프

다음과 같은 줄이 있습니까:

<%= raw(t('form.required_field_header')) %>

당신의 견해에? raw가 필요하지 않습니다. , 번역 키가 _html로 끝나는 경우 , 당신은 무료로 탈출:

<%= t('form.required_field_header_html') %>

간단하고 다른 t()와 더 일관성이 있습니다. 전화.

더 편리한 로케일 액세스

로케일 파일을 빌드할 때 일부 키가 동일한 상위 항목 아래에 그룹화되어 있을 수 있습니다.

en:
  bugs:
    index:
      new_label: "File a new bug"
      edit_label: "edit"
      delete_label: "delete"

이 모든 것을 함께 참조하려면 할 수 있습니다. 전체 키로 참조:

<%= t('bugs.index.edit_label') %> | <%= t('bugs.index.delete_label') %>

그것은 꽤 짜증나고 반복적입니다. 하지만 t() 범위를 사용하므로 키를 더 편리하게 참조할 수 있습니다.

<% bugs_scope = 'bugs.index' -%>
<%= t('edit_label', scope: bugs_scope) %> | <%= t('delete_label', scope: bugs_scope) %>

부분 이름을 잘 지정하면 범위를 지정할 필요도 없습니다.

app/views/bugs/index.html.erb
<%= t('.edit_label') %> | <%= t('.delete_label') %>

즉, .edit_label bugs.index.edit_label 참조 , bugs/index.html.erb에 있기 때문에 .

ActiveRecord 백엔드

때로는 yaml 파일의 정적 번역이 프로젝트에서 작동하지 않을 수 있습니다. 대신 ActiveRecord i18n 백엔드를 사용하는 경우:

config/initializers/locale.rb
require 'i18n/backend/active_record'
I18n.backend = I18n::Backend::ActiveRecord.new

translations에서 번역을 조회할 수 있습니다. 데이터베이스의 테이블입니다. 이렇게 하면 모든 번역을 미리 정의할 필요가 없습니다. 대신 새 번역을 즉석에서 추가할 수 있습니다.

translations 설정 테이블에는 특정 마이그레이션이 필요합니다. i18n-active_record 저장소의 README에는 작동에 필요한 모든 정보가 있습니다.

객체 유형 간 부분 공유

Avvo에는 변호사 명부, 변호사 리뷰 및 법적 조언이 있습니다. 하지만 몇 년 전만 해도 우리 사이트에는 변호사가 없었습니다. 의사와 치과의사도 있었습니다!

많은 UI가 이 직업들 간에 동일했습니다. 그러나 충분히 달랐기 때문에(예를 들어, 변호사는 "실무 분야"라고 부르고 의사는 "전문 분야"라고 부름) 꽤 보기 흉한 코드 없이는 동일한 견해나 부분을 공유하기 어려울 것입니다.

결국 우리는 이를 위해 i18n 시스템에 의존하려고 생각했습니다. 결국 영어 변호사는 종류 영어 사투리와 박사 학위도 마찬가지입니다. . 우리는 결국 다른 언어를 사용하는 것을 차단하고 싶지 않았기 때문에 두 개의 새로운 로케일을 만들기로 결정했습니다. en_jden_md .

이것은 사용자 정의 i18n 백엔드로 설정하기 쉬운 것으로 판명되었습니다.

class AvvoI18nStore < I18n::Backend::Simple
  def translate(locale, key, options = {})
    begin
      default = options.delete(:default)
      super(locale, key, options)
    rescue I18n::MissingTranslationData => e
      # fall back to "en" if we can't find anything under "en_jd", etc.
      fallback_locale = locale.to_s.split("_").first
      super(fallback_locale, key, options.merge(:default => default))
    end
  end
end

I18n.backend = AvvoI18nStore.new

번역을 정의하는 것도 간단했습니다.

en_jd:
  practice_area: "practice area"

en_md:
  practice_area: "specialty"

전체 부분 번역에도 훌륭했습니다(파일 이름 참고):

app/views/questions/_answer_badge.en_jd.html.erb
<!-- Lawyer badge HTML -->
app/views/questions/_answer_badge.en_md.html.erb
<!-- Doctor badge HTML -->

그리고 en 로케일, 공유 번역:

en:
  leaderboard:
    title: "Leaderboard"

사이트의 "의사" 섹션에 있을 때 기본 언어를 :en_md로 변경했습니다. , 그 반대도 마찬가지입니다.

I18n.locale = :en_md

모든 것이 제대로 작동했습니다!

이것을 추천할지는 잘 모르겠습니다. 다른 언어를 사용하는 다른 직업을 생각하는 것은 약간 미쳤습니다. 그러나 우리가 하는 동안 그것은 놀라울 정도로 잘 작동했습니다. 또한 i18n과 같은 간단한 도구가 얼마나 강력한 기능을 가질 수 있는지 보여줍니다.

이 물건은 어디서 주워요?

지난 주에 저는 초보자에서 전문가로 이동하는 방법으로 특정 기술에 대해 자세히 설명했습니다. 이것의 또 다른 예입니다. 우리가 i18n에 대해 배운 대부분은 Rails 가이드와 API 문서를 읽으면서 배웠습니다.

따라서 추가 단계를 수행하십시오. 당신이 의존하는 도구를 잘 배우십시오. 생산성을 높일 뿐만 아니라 다른 방법으로는 생각조차 하지 못한 완전히 새로운 범주의 솔루션을 제공할 수 있는 편리함과 요령을 알게 될 것입니다.