16

Estoy usando Ruby on Rails 3.1.0 y I18n gem. I (estoy implementando un complemento y) Me gustaría verificar en tiempo de ejecución si al I18n le faltan pares de clave/valor de traducción y, si es así, usar una cadena personalizada. Es decir, que tengo:I18n: ¿Cómo comprobar si faltan pares clave/valor de traducción?

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

Si en el archivo .yml no existe el siguiente código

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

me gustaría usar el This is the test error message 2. ¿Es posible? Si es así, ¿cómo puedo hacer eso?

BTW: Por motivos de rendimiento, es recomendable comprobar en tiempo de ejecución si los pares clave/valor traducción está presente?

+1

¿Sería algo así como algo útil? http://stackoverflow.com/questions/4223806/how-to-use-rails-i18n-fallback-features – illiptic

Respuesta

18

Acabo de recibir la misma pregunta y quiero calcular una cadena automática en caso de que falte la traducción. Si uso la opción :default, tengo que calcular la cadena automática cada vez, incluso cuando la traducción no falta. Entonces busqué otra solución.

Puede agregar la opción :raise => true o usar I18n.translate! en lugar de I18n.translate. Si no se encuentra una traducción, se genera una excepción.

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

No sé cómo hacerlo en tiempo de ejecución, pero puede utilizar el rake para averiguarlo. Tendrás que crear tu propia tarea de rake para eso. Aquí hay uno:

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 

poner el dado en un archivo .rake en el directorio lib/tareas y ejecutar:

rake i18n:missing_keys 

fuente de información es here y el código en GitHub here.

+0

Su respuesta no cumple lo que estoy buscando, pero gracias de todos modos. Esperando otra respuesta ... – user12882

+0

Si hace algo como esto, tenga en cuenta que las claves de traducción pueden no coincidir exactamente debido a las diferentes reglas de pluralización (y por lo tanto a las diferentes claves). Reparado aquí: https://gist.github.com/2994129 (a través de mi http: //henrik.nyh.se/2012/07/rails-i18n-tips /) –

0

Si desea pasar a variable al mensaje como This is the test error message {variable}

Esto es posible mediante la variable de archivo de idioma, como a continuación.

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

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

Más descripción puedes find here.

+0

Gracias por su respuesta, pero eso no es lo que estoy buscando (vuelva a leer la pregunta, por favor). – user12882

21

Usted podría pasar una: parámetro por defecto para I18n.t:

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

Puede leer mas sobre esto here.

Cuestiones relacionadas