4

ActiveRecord 모델에서 다국어 값을 유지 관리하는 데 권장되는 방법은 무엇입니까?DRY 및 데이터베이스 효율적인 방식으로 지역화 된 값을 저장하는 방법 - Ruby on Rails/i18n

데이터베이스 스키마와 개체 모델을 업그레이드하여 많은 값의 국제화가 가능하도록 노력하고 있으며 다양한 방법으로이 작업을 수행하고 있습니다.

rails-i18n system 표준은보기의 텍스트 외에 필드 및 모델 이름을 국제화하기위한 강력한 도구를 제공하지만 대부분이 기능에 대해 침묵합니다.

R18n gem을 사용하면 지역화 된 문자열을 저장하고 로캘에 따라 올바른 값을 나타내는 열을 사용하여 데이터베이스를 오버로드 할 수 있습니다. 이것은 몇 가지 문제점을 제시합니다.

우리가 모델 Sport - 데이터베이스 테이블 sports에 대해 말하고 있다고 가정 해보십시오. 영국에서는 '축구'라고 부르더라도 을 검색 할 수 있어야하므로 검색어는 scope :with_name ->(n){ where("name_en_GB = ? OR name_en_AU = ?", n, n) }이됩니다.

다른 로케일을 추가하려면 스키마를 업데이트하고 해당 스키마에서 이러한 쿼리를 업데이트해야합니다. 오히려 취 약한 해결책.

내가 본 다른 솔루션은 SportLocale 모델과 연결된 이름과 로캘이있는 sport_locales 테이블을 유지 관리하는 것입니다.

class Sport < ActiveRecord::Base 
    has_many :locales 
end 

class SportLocale < ActiveRecord::Base 
    belongs_to :sport 
end 

는 그런 다음이 Sport이 유일한 현지화 모델 인 경우 미세하지만

class Sport < ActiveRecord::Base 
    has_many :locales, class_name: "SportLocale" 
    self.with_name(n) 
    SportLocale.where(name: n, locale: I18n.locale).first.try(:sport) 
    end 
end 

그런 짓을하려는 바로 스포츠를 찾기 위해 가정

당신은 다른 모든 모델을 추가하기 시작할 때 그것들은 각각 * Locale 모델을 필요로하는 약간 미칠 것입니다. 솔루션 중 DRY도 아닙니다.

나는

class Sport < ActiveRecord::Base 
    include Localised 
    localised_field :name 
end 

수있는 솔루션을하고 싶습니다 마술 Sport.where(name: 'football') 오른쪽 스포츠를 찾을 수 있습니다.

이미 그러한 시스템이 있습니까? 아니면 직접 구축해야합니까? 다른 프로젝트에서는 이런 종류의 문제를 어떻게 처리합니까?

+0

모델/스키마 레벨에서 모델 속성의 i18n을 처리하고보기 레벨이 아닌 (왜 대부분의 Rails 개발자가 기대할 수 있는지 생각해보십시오.) 정교한 질문을 편집 해주십시오. 그것은 처리되어야 함). 또한, 당신은 당신이 전에 보았던 'SportLocale' 솔루션의 소스를 제공해 줄 수 있습니까? (이 질문은 제안 된 솔루션을 처음 보았습니다). –

+0

폴 이유는 데이터가 정적은 아니지만 더 많은 항목이 시스템에 추가되면 시간이 지나면 빌드됩니다. 뷰는'current_sport.name'을 표시하고 해당 스포츠에 대해 정확하게 현지화 된 이름을 반환 할 수 있어야합니다. 독점적 인 코드베이스에서 본 것처럼'* Locale' 모델 접근법의 소스를 제공 할 수 없습니다. 사실 내가 지금 재 설계하려고하는 것. –

답변

0

스포츠와 관련된 I18n 현지화 키를 저장하고 검색하면 어떨까요?

사용자에게 이름을 표시하려면 해당 키를 사용자의 현재 로케일에 사용하십시오.

+0

나는 모든 값을 미리 알지 못하기 때문에. 광범위한 로케일에 대한 데이터는 시간이 지남에 따라 채워집니다. –

1

해결하려는 문제를 이해하면 Globalize 보석에서 뭔가를 얻을 수 있습니다.

번역 테이블을 숨기지 만 '축구'[en-au]를 'football'[en-uk]에 매핑하여 번역 된 속성을 조사 할 수있는 표준을 제공 할 수 있습니다 찾고있는 가치.

+0

이상하게 보입니다. 나는 그것을 더 확인하고 다시보고 할 것이다. 감사. –

+0

['hstore_translate'] (https://github.com/Leadformance/hstore_translate)가 내 필요에 더 잘 맞을 것이라고 생각합니다. –

3

i18n Ruby gem (레일스에서 ​​사용하는)은 주로 정적 번역, 즉 코드의 일부로 볼 수있는 번역에 유용합니다 (코드의 정적, 하드 코딩 된 문자열을 코드 부분). 이들은 대부분 정적 YAML 파일에 저장되므로 배포시 변경됩니다.

현재 R18n의 최신 버전에 대해 모르겠다. 한 번 전에 그것을 보았을 때 유사한 구문을 사용하고 약간 다른 기능을 사용하는 대체 방법을 제공했습니다.

모델 데이터 변환은 다른 작업입니다. Globalize이 가장 널리 사용되는 솔루션이지만 다른 솔루션이 많이 있습니다. 데이터를 번역하고 ActiveRecord와 통합하면 더 복잡한 사용법에 관해서는 털이 될 수있는 성숙한 솔루션을 사용하는 것이 좋습니다.

+0

나는 Globalize라는 두 가지 우려를 가지고있다. 하나는 뛰어난 PR과 이슈를 많이 갖고 있으며 꽤 오랫동안 유지되지 않는 것 같습니다. 두 개는 현지화 된 필드에 대해 쿼리를 실행하는 방법에 대해 문서에 아무것도 없습니다. 여기서는 Postgres를 사용하고 있기 때문에'hstore_translate'가 더 적합하고 더 최신 버전으로 보입니다. 나는 다음 스프린트 실험을 할 필요가있다. –