2012-03-10 3 views
11

Utilizzo di Rails 3.1.3 con Ruby 1.9.3p0.Come modificare il caso di variabili interpolate nel file delle impostazioni locali di Rails?

Ho scoperto che, per impostazione predefinita, Rails non utilizza il caso frase per i pulsanti modulo. Ad esempio, invece di un pulsante "Aggiorna utente", genera un pulsante "Aggiorna utente".

I nomi dei pulsanti derivano dallo ActionView locale file. C'è un modo per creare un valore predefinito che declassa il nome del modello? Questo non è coperto nella sezione i18n di Ruby on Rails Guides su Interpolation quindi forse non è possibile. Quanto segue non funziona:

en: 
    helpers: 
    submit: 
     update: 'Update %{model}.downcase' 

In generale, sarei felice di trovare un punto di riferimento per la sintassi dei file YAML di locale. La guida i18n copre parte della sintassi, ma sarebbe utile trovare la documentazione su tutti i punti esclamativi, i vari formati data/ora, ecc. O forse dovrei usare un Ruby Hash invece di un file YAML per questo scopo?

risposta

8

Dopo ulteriori ricerche, ho concluso che questo tipo di operazione sui valori interpolati non è possibile, almeno utilizzando un file locale YAML.

YAML è documentato qui e non supporta le operazioni sulle stringhe:
http://www.yaml.org/spec/1.2/spec.html

La pagina principale su Ruby localizzazione è qui:
http://ruby-i18n.org/wiki

Da lì, troviamo il codice per il default I18n gemma e trapano fino al codice di interpolazione. Esso utilizza sprintf di fare l'interpolazione:
https://github.com/svenfuchs/i18n/blob/master/lib/i18n/interpolate/ruby.rb

Questo codice è "fortemente basato su gettext String estensione di interpolazione di Masao Mutoh":
http://github.com/mutoh/gettext/blob/f6566738b981fe0952548c421042ad1e0cdfb31e/lib/gettext/core_ext/string.rb

Tale proroga è un esempio di formattazione numeri:

L'estensione si riferisce a [Ruby] "Kernel::sprintf per i dettagli della stringa di formato":
http://www.ruby-doc.org/core-1.9.2/Kernel.html#method-i-sprintf

In questo doc su sprintf, ci sono molti modi per formattare i numeri, ma nessuna operazione per cambiare il caso di stringhe.

1

Ho risolto questo problema modificando l'interpolazione I18n. Inserire il seguente codice nella directory inizializzatori:

module I18n 
    # Implemented to support method call on translation keys 
    INTERPOLATION_WITH_METHOD_PATTERN = Regexp.union(
    /%%/, 
    /%\{(\w+)\}/,        # matches placeholders like "%{foo}" 
    /%<(\w+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/, # matches placeholders like "%<foo>.d" 
    /%\{(\w+)\.(\w+)\}/,       # matches placeholders like "%{foo.upcase}" 
) 

    class << self 
    def interpolate_hash(string, values) 
     string.gsub(INTERPOLATION_WITH_METHOD_PATTERN) do |match| 
     if match == '%%' 
      '%' 
     else 
      key = ($1 || $2 || $4).to_sym 
      value = values.key?(key) ? values[key] : raise(MissingInterpolationArgument.new(values, string)) 
      value = value.call(values) if value.respond_to?(:call) 
      $3 ? sprintf("%#{$3}", value) : ($5 ? value.send($5) : value) 
     end 
     end 
    end 
    end 
end 

Ora, questo è ciò che si può fare nel file locale:

create: 'Opprett %{model.downcase}' 

e testarlo:

require 'test_helper' 

class I18nTest < ActiveSupport::TestCase 

    should 'interpolate as usual' do 
    assert_equal 'Show Customer', I18n.interpolate("Show %{model}", model: 'Customer') 
    end 

    should 'interpolate with number formatting' do 
    assert_equal 'Show many 100', I18n.interpolate("Show many %<kr>2d", kr: 100) 
    assert_equal 'Show many abc', I18n.interpolate("Show many %<str>3.3s", str: 'abcde') 
    end 

    should 'support method execution' do 
    assert_equal 'Show customer', I18n.interpolate("Show %{model.downcase}", model: 'Customer') 
    end 

end