16

Tôi đang sử dụng Ruby on Rails 3.1.0 và I18n gem. Tôi (đang triển khai một plugin và) Tôi muốn kiểm tra khi chạy nếu I18n thiếu cặp khóa/giá trị dịch và, nếu có, để sử dụng chuỗi tùy chỉnh. Đó là, tôi có:I18n: Cách kiểm tra xem cặp khóa/giá trị dịch có bị thiếu không?

validates :link_url, 
    :format  => { 
    :with => REGEX, 
    :message => I18n.t(
     'custom_invalid_format', 
     :scope => 'activerecord.errors.messages' 
) 
} 

Nếu trong file .yml không có đoạn mã sau

activerecord: 
    errors: 
    messages: 
     custom_invalid_format: This is the test error message 1 

Tôi muốn sử dụng This is the test error message 2. Có thể không? Nếu vậy, làm thế nào tôi có thể làm điều đó?

BTW: Vì lý do hiệu suất, là nó khuyến khích để kiểm tra khi chạy nếu phím dịch/cặp giá trị là hiện nay?

+1

Điều gì đó như thế này có được sử dụng không? http://stackoverflow.com/questions/4223806/how-to-use-rails-i18n-fallback-features – illiptic

Trả lời

18

Tôi vừa có cùng một câu hỏi và tôi muốn tính toán chuỗi tự động trong trường hợp bản dịch bị thiếu. Nếu tôi sử dụng tùy chọn :default, tôi phải tính chuỗi tự động mỗi lần ngay cả khi bản dịch không bị thiếu. Vì vậy, tôi đã tìm kiếm một giải pháp khác.

Bạn có thể thêm tùy chọn :raise => true hoặc sử dụng I18n.translate! thay vì I18n.translate. Nếu không có bản dịch có thể được tìm thấy một ngoại lệ được nêu ra.

begin 
    I18n.translate!('this.key.should.be.translated', :raise => true) 
rescue I18n::MissingTranslationData 
    do_some_resource_eating_text_generation_here 
end 
16

Tôi không biết làm thế nào để điều này trong thời gian chạy nhưng bạn có thể sử dụng cào để tìm ra. Bạn sẽ tạo ra công việc cào của riêng bạn cho điều đó. Dưới đây là một:

namespace :i18n do 
    desc "Find and list translation keys that do not exist in all locales" 
    task :missing_keys => :environment do 

    def collect_keys(scope, translations) 
     full_keys = [] 
     translations.to_a.each do |key, translations| 
     new_scope = scope.dup << key 
     if translations.is_a?(Hash) 
      full_keys += collect_keys(new_scope, translations) 
     else 
      full_keys << new_scope.join('.') 
     end 
     end 
     return full_keys 
    end 

    # Make sure we've loaded the translations 
    I18n.backend.send(:init_translations) 
    puts "#{I18n.available_locales.size} #{I18n.available_locales.size == 1 ? 'locale' : 'locales'} available: #{I18n.available_locales.to_sentence}" 

    # Get all keys from all locales 
    all_keys = I18n.backend.send(:translations).collect do |check_locale, translations| 
     collect_keys([], translations).sort 
    end.flatten.uniq 
    puts "#{all_keys.size} #{all_keys.size == 1 ? 'unique key' : 'unique keys'} found." 

    missing_keys = {} 
    all_keys.each do |key| 

     I18n.available_locales.each do |locale| 
     I18n.locale = locale 
     begin 
      result = I18n.translate(key, :raise => true) 
     rescue I18n::MissingInterpolationArgument 
      # noop 
     rescue I18n::MissingTranslationData 
      if missing_keys[key] 
      missing_keys[key] << locale 
      else 
      missing_keys[key] = [locale] 
      end 
     end 
     end 
    end 
    puts "#{missing_keys.size} #{missing_keys.size == 1 ? 'key is missing' : 'keys are missing'} from one or more locales:" 
    missing_keys.keys.sort.each do |key| 
     puts "'#{key}': Missing from #{missing_keys[key].join(', ')}" 
    end 
    end 
end 

đặt được đưa ra trong một tập tin .rake trong lib/nhiệm vụ thư mục của bạn và thực hiện:

rake i18n:missing_keys 

nguồn thông tin là here và mã trên github here.

+0

Câu trả lời của bạn không hoàn thành những gì tôi đang tìm kiếm, nhưng cảm ơn bạn. Đang chờ câu trả lời khác ... – user12882

+0

Nếu bạn làm điều gì đó như thế này, hãy lưu ý rằng các phím dịch có thể không khớp chính xác do các quy tắc đa nguyên khác nhau (và các khóa khác nhau). Đã sửa lỗi tại đây: https://gist.github.com/2994129 (qua http: //henrik.nyh của tôi.se/2012/07/rails-i18n-tips /) –

0

Nếu bạn muốn vượt qua biến vào tin nhắn như This is the test error message {variable}

Điều này có thể sử dụng biến trong tập tin ngôn ngữ như dưới đây.

# app/views/home/index.html.erb 
<%=t 'greet_username', :user => "Bill", :message => "Goodbye" %> 

# config/locales/en.yml 
    en: 
    greet_username: "%{message}, %{user}!" 

Mô tả khác bạn có thể find here.

+0

Cảm ơn bạn đã trả lời, nhưng đó không phải là những gì tôi đang tìm kiếm (đọc lại câu hỏi, xin vui lòng). – user12882

21

Bạn có thể vượt qua một: tham số mặc định để I18n.t:

I18n.t :missing, :default => 'Not here' 
# => 'Not here' 

Bạn có thể đọc thêm về nó here.

Các vấn đề liên quan