rails는 파싱 된 모든 번역 yml 파일을 일종의 배열/해시에 저장한다고 추측합니다. 액세스 할 수있는 방법이 있습니까?
예를 들어 파일이있는 경우 :
en:
test_string: "testing this"
warning: "This is just an example
I18n.translations_store [: en] [: test_string] 같은 것을 할 수 있습니까? yml 파일을 YAML :: load로 구문 분석 할 수 있지만, 제 경우에는 yml 파일을 구성을 위해 하위 폴더로 분할했으며, 레일이 이미 모든 파일을 구문 분석했음을 확신합니다.
- 답변 # 1
- 답변 # 2
8xx8의 의견에 따라 더 간단한 버전 :
I18n.t(:foo) I18n.backend.send(:translations)[:en][:test_string]
는
I18n.t(".")[:test_string]
이로 인해 번역을 미리로드하거나 로케일을 지정하지 않아도됩니다.
- 답변 # 3
I18n::Fallbacks
를 사용하는 경우 불행히도I18n.t('.')
를 사용할 수 없습니다 현재 로케일 (예 : 'en-GB')의 내용을 반환하고 대체 로케일 (예 : 'en')의 아무것도 반환하지 않습니다. 이 문제를 해결하려면 폴백을 반복하고deep_merge!
를 사용하십시오. 그들을 결합하기 위해.module I18n class << self def all fallbacks[I18n.locale].reverse.reduce({}) do |translations, fallback| translations.deep_merge!(backend.translate(fallback, '.')) end end end end
- 답변 # 4
기본 I18n 백엔드는 I18n :: Backend :: Simple이며 번역을 표시하지 않습니다. (I18.backend.translations는 보호 된 방법입니다.)
이것은 일반적으로 좋은 생각은 아니지만 실제로이 정보가 필요하고 파일을 구문 분석 할 수없는 경우 백엔드 클래스를 확장 할 수 있습니다.
class I18n::Backend::Simple def translations_store translations end end
그런 다음
I18n.backend.translations_store
를 호출 할 수 있습니다 구문 분석 된 번역을 가져옵니다. 아마도 이것을 장기 전략으로 사용해서는 안되지만 지금 당장 필요한 정보를 얻을 수 있습니다. - 답변 # 5
레이크 작업에서이 작업을 수행하는 경우 환경을 포함해야합니다. 그렇지 않으면
config/locales/
에 사는 자신의 로케일을로드하지 않습니다.require "./config/environment.rb" # Do not forget this namespace :i18n do desc "Import I18n to I18n_active_record" task :setup do I18n.t(:foo) translations = I18n.backend.send(:translations) end end
백엔드에서 개인 메서드를 호출해야합니다. 다음과 같은 방법으로 액세스 할 수 있습니다.